diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 7679d482bff..b01406bf631 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -24,14 +24,12 @@ #define BLOCKS_CONSTRUCTION_DIR (1<<10) /// Can we ignore density when building on this object (for example, directional windows and grilles) #define IGNORE_DENSITY (1<<11) -/// We can reskin this item infinitely -#define INFINITE_RESKIN (1<<12) /// Can this object conduct electricity -#define CONDUCTS_ELECTRICITY (1<<13) +#define CONDUCTS_ELECTRICITY (1<<12) /// Atoms don't spawn anything when deconstructed (they just vanish) -#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<14) +#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13) /// Flag which tells an object to hang onto an support atom on late initialize. Usefull only during mapload and supported by some atoms only -#define MOUNT_ON_LATE_INITIALIZE (1<<15) +#define MOUNT_ON_LATE_INITIALIZE (1<<14) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index f2d6bc5e623..06b80e8f4ad 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -165,8 +165,6 @@ #define LOADOUT_FLAG_GREYSCALING_ALLOWED (1<<2) /// Allows the item to be renamed by the player. #define LOADOUT_FLAG_ALLOW_NAMING (1<<3) -/// Allows the item to be reskinned by the player. Only applicable to items with unique_reskin defined. -#define LOADOUT_FLAG_ALLOW_RESKIN (1<<4) // Loadout item info keys // Changing these will break existing loadouts diff --git a/code/__DEFINES/reskin.dm b/code/__DEFINES/reskin.dm new file mode 100644 index 00000000000..250b3959fe2 --- /dev/null +++ b/code/__DEFINES/reskin.dm @@ -0,0 +1,18 @@ +/// Global list of available atom skins +GLOBAL_LIST_INIT_TYPED(atom_skins, /datum/atom_skin, init_subtypes_w_path_keys(/datum/atom_skin)) + +/// Sets the atom's varname to newvalue if newvalue is not null, otherwise resets it to its initial value if resetcondition is true +#define APPLY_VAR_OR_RESET_INITIAL(atom, varname, newvalue, resetcondition) \ + if(newvalue) {atom.##varname = (##newvalue) } else if(resetcondition) { atom.##varname = initial(atom.##varname) } + +/// Sets the atom's varname to newvalue if newvalue is not null, otherwise sets it to resetvalue if resetcondition is true +#define APPLY_VAR_OR_RESET_TO(atom, varname, newvalue, resetcondition, resetvalue) \ + if(newvalue) {atom.##varname = (##newvalue) } else if(resetcondition) { atom.##varname = (resetvalue) } + +/// Resets the atom's varname to its initial value if oldvalue is not null +#define RESET_INITIAL_IF_SET(atom, varname, oldvalue) \ + if(oldvalue) { atom.##varname = initial(atom.##varname) } + +/// Sets the atom's varname to resetvalue if oldvalue is not null +#define RESET_TO_IF_SET(atom, varname, oldvalue, resetvalue) \ + if(oldvalue) { atom.##varname = (resetvalue) } diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1b89c5efeb5..d0569e570db 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -139,29 +139,21 @@ for(var/atom/req_atom as anything in recipe.structures) atom_list |= req_atom -//creates every subtype of prototype (excluding prototype) and adds it to list L. -//if no list/L is provided, one is created. +/// Creates every subtype of prototype (excluding prototype and abstract types) and adds it to list L. +/// If no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) if(!istype(L)) L = list() - for(var/path in subtypesof(prototype)) + for(var/path in valid_subtypesof(prototype)) L += new path() return L -//returns a list of paths to every subtype of prototype (excluding prototype) -//if no list/L is provided, one is created. -/proc/init_paths(prototype, list/L) - if(!istype(L)) - L = list() - for(var/path in subtypesof(prototype)) - L+= path - return L - /// Functions like init_subtypes, but uses the subtype's path as a key for easy access +/// If no list/L is provided, one is created. /proc/init_subtypes_w_path_keys(prototype, list/L) if(!istype(L)) L = list() - for(var/path in subtypesof(prototype)) + for(var/path in valid_subtypesof(prototype)) L[path] = new path() return L diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index dd4f7e2547e..0a12b82f5e7 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -366,7 +366,6 @@ DEFINE_BITFIELD(obj_flags, list( "BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION, "BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR, "IGNORE_DENSITY" = IGNORE_DENSITY, - "INFINITE_RESKIN" = INFINITE_RESKIN, "CONDUCTS_ELECTRICITY" = CONDUCTS_ELECTRICITY, "NO_DEBRIS_AFTER_DECONSTRUCTION" = NO_DEBRIS_AFTER_DECONSTRUCTION, )) diff --git a/code/datums/components/dart_insert.dm b/code/datums/components/dart_insert.dm index 9770de669b5..f2816949c9d 100644 --- a/code/datums/components/dart_insert.dm +++ b/code/datums/components/dart_insert.dm @@ -60,9 +60,9 @@ add_to_dart(dart, user) return COMPONENT_CANCEL_ATTACK_CHAIN -/datum/component/dart_insert/proc/on_reskin(datum/source, mob/user, skin) +/datum/component/dart_insert/proc/on_reskin(datum/source, skin) SIGNAL_HANDLER - SEND_SIGNAL(parent, COMSIG_DART_INSERT_PARENT_RESKINNED) + SEND_SIGNAL(parent, COMSIG_DART_INSERT_PARENT_RESKINNED, skin) /datum/component/dart_insert/proc/add_to_dart(obj/item/ammo_casing/dart, mob/user) var/obj/projectile/dart_projectile = dart.loaded_projectile diff --git a/code/datums/components/reskinnable_atom.dm b/code/datums/components/reskinnable_atom.dm new file mode 100644 index 00000000000..84566458593 --- /dev/null +++ b/code/datums/components/reskinnable_atom.dm @@ -0,0 +1,208 @@ +/** + * ### Atom skin singleton datum + * + * Simple datum which holds information about a skin that can be applied to an atom. + */ +/datum/atom_skin + abstract_type = /datum/atom_skin + + /// Required, name shown in the radial menu + var/preview_name + + /// If true, changing the reskin also changes the base_icon_state of the atom + var/change_base_icon_state = FALSE + /// If true, changing the reskin also changes the inhand_icon_state of the atom + var/change_inhand_icon_state = FALSE + /// If true, unset vars are reset to their original values when applying this skin + var/reset_missing = TRUE + + /// Optional, name to change the atom to when applied + var/new_name + /// Optional, description to change the atom to when applied + var/new_desc + /// Optional, icon to change the atom to when applied + var/new_icon + /// Optional, icon_state to change the atom to when applied + var/new_icon_state + +/** + * Applies all relevant skin changes to the given atom + * Can be overridden to add additional behavior, such as registering signals or altering other vars. + * + * * apply_to: The atom to apply the skin to + */ +/datum/atom_skin/proc/apply(atom/apply_to) + SHOULD_CALL_PARENT(TRUE) + APPLY_VAR_OR_RESET_INITIAL(apply_to, name, new_name, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, desc, new_desc, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, icon, new_icon, reset_missing) + APPLY_VAR_OR_RESET_TO(apply_to, icon_state, new_icon_state, reset_missing, initial(apply_to.post_init_icon_state) || initial(apply_to.icon_state)) + if(change_base_icon_state) + APPLY_VAR_OR_RESET_INITIAL(apply_to, base_icon_state, new_icon_state, reset_missing) + if(change_inhand_icon_state && isitem(apply_to)) + var/obj/item/item_apply_to = apply_to + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, inhand_icon_state, new_icon_state, reset_missing) + +/** + * Resets all changes this skin would have made to the given atom + * Does not verify that the skin was actually applied to the atom beforehand. + * Can be overridden to add additional behavior, such as unregistering signals or altering other vars. + * + * * clear_from: The atom to clear the skin from + */ +/datum/atom_skin/proc/clear_skin(atom/clear_from) + SHOULD_CALL_PARENT(TRUE) + RESET_INITIAL_IF_SET(clear_from, name, new_name) + RESET_INITIAL_IF_SET(clear_from, desc, new_desc) + RESET_INITIAL_IF_SET(clear_from, icon, new_icon) + RESET_TO_IF_SET(clear_from, icon_state, new_icon_state, initial(clear_from.post_init_icon_state) || initial(clear_from.icon_state)) + if(change_base_icon_state) + RESET_INITIAL_IF_SET(clear_from, base_icon_state, new_icon_state) + if(change_inhand_icon_state && isitem(clear_from)) + var/obj/item/item_clear_from = clear_from + RESET_INITIAL_IF_SET(item_clear_from, inhand_icon_state, new_icon_state) + +/// Gets a preview image for this skin based on the given atom's icon and icon_state +/datum/atom_skin/proc/get_preview_icon(atom/for_atom) + return image( + icon = new_icon || for_atom.icon, + icon_state = new_icon_state || for_atom.icon_state, + ) + +/** + * ### Reskinnable atoms + * + * Simple component which lets an atom be alt-clicked to open a radial menu to choose a new skin to apply. + */ +/datum/component/reskinable_item + dupe_mode = COMPONENT_DUPE_SELECTIVE + /// Base reskin type to pull options from - all subtypes except those blacklisted are valid options + VAR_PRIVATE/base_reskin_type + /// If TRUE, the reskin option is infinite-use. If FALSE, the component is deleted on use (so you're stuck with that skin). + VAR_PRIVATE/infinite_reskin = FALSE + /// List of subtypes of /datum/atom_skin that are not allowed to be used for this item + VAR_PRIVATE/list/blacklisted_subtypes + + /// Currently applied skin preview_name + VAR_PRIVATE/current_skin + +/datum/component/reskinable_item/Initialize(base_reskin_type, infinite = FALSE, initial_skin, list/blacklisted_subtypes = list()) + if(!isatom(parent) || isarea(parent)) + return COMPONENT_INCOMPATIBLE + + src.base_reskin_type = base_reskin_type + src.infinite_reskin = infinite + src.blacklisted_subtypes = blacklisted_subtypes + + if(initial_skin) + set_skin_by_name(initial_skin) + + var/atom/atom_parent = parent + atom_parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + +/datum/component/reskinable_item/RegisterWithParent() + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(add_tags)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(add_context)) + +/datum/component/reskinable_item/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_CLICK_ALT) + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE_TAGS) + UnregisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM) + +/datum/component/reskinable_item/CheckDupeComponent(datum/component/comp, base_reskin_type, infinite = FALSE, initial_skin, list/blacklisted_subtypes = list()) + if(src.base_reskin_type != base_reskin_type) + return FALSE // new comp - though the alt-click behavior will collide + + src.infinite_reskin = infinite + src.blacklisted_subtypes = blacklisted_subtypes + + set_skin_by_name(initial_skin) + return TRUE // same comp + +/datum/component/reskinable_item/proc/get_skins_by_name() + var/list/reskin_options = list() + for(var/datum/atom_skin/reskin_option as anything in valid_subtypesof(base_reskin_type) - blacklisted_subtypes) + reskin_options[reskin_option::preview_name] = reskin_option + + return reskin_options + +/datum/component/reskinable_item/proc/set_skin_by_name(input_name) + var/list/reskin_options = get_skins_by_name() + if(current_skin) + var/datum/atom_skin/previous_skin = GLOB.atom_skins[reskin_options[current_skin]] + previous_skin.clear_skin(parent) + + if(input_name) + var/datum/atom_skin/reskin_to_apply = GLOB.atom_skins[reskin_options[input_name]] + reskin_to_apply.apply(parent) + + current_skin = input_name + + var/atom/atom_parent = parent + atom_parent.update_appearance() + + if(isitem(parent)) + var/obj/item/item_parent = parent + item_parent.update_slot_icon() + + SEND_SIGNAL(parent, COMSIG_OBJ_RESKIN, input_name) + +/datum/component/reskinable_item/proc/add_context(atom/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" + return CONTEXTUAL_SCREENTIP_SET + +/datum/component/reskinable_item/proc/add_tags(atom/source, mob/user, list/tags) + SIGNAL_HANDLER + + tags["reskinnable"] = "This item is able to be reskinned! Alt-Click to do so!" + +/// Called when alt clicked and the item has unique reskin options +/datum/component/reskinable_item/proc/on_click_alt_reskin(datum/source, mob/user) + SIGNAL_HANDLER + + if(!user.can_perform_action(parent, NEED_DEXTERITY)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(reskin_obj), user) + return CLICK_ACTION_SUCCESS + +/** + * Reskins object based on a user's choice + * + * Arguments: + * * user The mob choosing a reskin option + */ +/datum/component/reskinable_item/proc/reskin_obj(mob/user) + var/atom/atom_parent = parent + + var/list/items = list() + for(var/reskin_name, reskin_typepath in get_skins_by_name()) + items[reskin_name] = GLOB.atom_skins[reskin_typepath].get_preview_icon(atom_parent) + + sort_list(items) + + var/pick = show_radial_menu(user, parent, items, custom_check = CALLBACK(src, PROC_REF(check_reskin_menu), user), radius = 38, require_near = TRUE) + if(!pick || !items[pick]) + return + + set_skin_by_name(pick) + to_chat(user, span_info("[parent] is now skinned as '[pick].'")) + + if(!infinite_reskin) + qdel(src) + +/** + * Checks if we are allowed to interact with a radial menu for reskins + * + * Arguments: + * * user The mob interacting with the menu + */ +/datum/component/reskinable_item/proc/check_reskin_menu(mob/user) + if(QDELETED(parent)) + return FALSE + if(user.incapacitated) + return FALSE + return TRUE diff --git a/code/datums/martial/kaza_ruk.dm b/code/datums/martial/kaza_ruk.dm index 576cd9f5088..1f7b0625dc0 100644 --- a/code/datums/martial/kaza_ruk.dm +++ b/code/datums/martial/kaza_ruk.dm @@ -270,6 +270,35 @@ . = ..() AddComponent(/datum/component/martial_art_giver, /datum/martial_art/kaza_ruk) +/datum/atom_skin/kaza_ruk + abstract_type = /datum/atom_skin/kaza_ruk + reset_missing = FALSE + /// Color (/matrix) applied with the skin. If null, no color is applied. + var/reskin_color + +/datum/atom_skin/kaza_ruk/apply(atom/apply_to) + . = ..() + if(reskin_color) + apply_to.add_atom_colour(color_matrix_filter(reskin_color), FIXED_COLOUR_PRIORITY) + +/datum/atom_skin/kaza_ruk/clear_skin(atom/clear_from) + . = ..() + if(reskin_color) + clear_from.remove_atom_colour(FIXED_COLOUR_PRIORITY, reskin_color) + +/datum/atom_skin/kaza_ruk/get_preview_icon(atom/for_atom) + var/image/generated = ..() + if(reskin_color) + generated.add_filter("preview_filter", 1, color_matrix_filter(reskin_color)) + return generated + +/datum/atom_skin/kaza_ruk/red + preview_name = "Red" + +/datum/atom_skin/kaza_ruk/blue + preview_name = "Blue" + reskin_color = list(0.33, 0.33, 0.33, 0, 0, 0, 0, 0, 1) + /obj/item/clothing/gloves/kaza_ruk/sec//more obviously named, given to sec name = "kaza ruk gloves" desc = "These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk. \ @@ -282,6 +311,10 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE +/obj/item/clothing/gloves/kaza_ruk/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/kaza_ruk, infinite = TRUE) + /obj/item/clothing/gloves/kaza_ruk/combatglovesplus name = "combat gloves plus" desc = "These tactical gloves are fireproof and electrically insulated. These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk." diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 41c52d9b0a0..f9247d039ce 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -38,10 +38,6 @@ purchase_path = /obj/item/clothing/gloves/fingerless/punch_mitts cost_per_order = 1000 -/datum/orderable_item/mining/crusher_retool_kit - purchase_path = /obj/item/crusher_trophy/retool_kit - cost_per_order = 150 - /datum/orderable_item/mining/resonator purchase_path = /obj/item/resonator cost_per_order = 710 diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 4f20d4171a0..57d270fcb49 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -160,6 +160,41 @@ SIGNAL_HANDLER set_linked_console(null) +// Disk skins +/datum/atom_skin/dna_disk + abstract_type = /datum/atom_skin/dna_disk + +/datum/atom_skin/dna_disk/red + preview_name = "Red" + new_icon_state = "datadisk0" + +/datum/atom_skin/dna_disk/dark_blue + preview_name = "Dark Blue" + new_icon_state = "datadisk1" + +/datum/atom_skin/dna_disk/yellow + preview_name = "Yellow" + new_icon_state = "datadisk2" + +/datum/atom_skin/dna_disk/black + preview_name = "Black" + new_icon_state = "datadisk3" + +/datum/atom_skin/dna_disk/green + preview_name = "Green" + new_icon_state = "datadisk4" + +/datum/atom_skin/dna_disk/purple + preview_name = "Purple" + new_icon_state = "datadisk5" + +/datum/atom_skin/dna_disk/grey + preview_name = "Grey" + new_icon_state = "datadisk6" + +/datum/atom_skin/dna_disk/light_blue + preview_name = "Light Blue" + new_icon_state = "datadisk7" //Just for transferring between genetics machines. /obj/item/disk/data @@ -169,20 +204,10 @@ var/list/mutations = list() var/max_mutations = 6 var/read_only = FALSE //Well,it's still a floppy disk - obj_flags = parent_type::obj_flags | INFINITE_RESKIN - unique_reskin = list( - "Red" = "datadisk0", - "Dark Blue" = "datadisk1", - "Yellow" = "datadisk2", - "Black" = "datadisk3", - "Green" = "datadisk4", - "Purple" = "datadisk5", - "Grey" = "datadisk6", - "Light Blue" = "datadisk7", - ) /obj/item/disk/data/Initialize(mapload) . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/dna_disk, infinite = TRUE) icon_state = "datadisk[rand(0,7)]" add_overlay("datadisk_gene") if(length(genetic_makeup_buffer)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a5ee78dc031..ac89ec154dc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -236,22 +236,10 @@ var/override_notes = FALSE /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. var/throw_verb - // SKYRAT EDIT ADDITION START - /// Does this use the advanced reskinning setup? - var/uses_advanced_reskins = FALSE - // SKYRAT EDIT ADDITION END /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. var/list/fantasy_modifications = null - /// Has the item been reskinned? - var/current_skin - /// List of options to reskin. - var/list/unique_reskin - /// If reskins change base icon state as well - var/unique_reskin_changes_base_icon_state = FALSE - /// If reskins change inhands as well - var/unique_reskin_changes_inhand = FALSE /// Do we apply a click cooldown when resisting this object if it is restraining them? var/resist_cooldown = CLICK_CD_BREAKOUT @@ -287,9 +275,6 @@ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_ITEM, src) - setup_reskinning() - - /obj/item/Destroy(force) // This var exists as a weird proxy "owner" ref // It's used in a few places. Stop using it, and optimially replace all uses please @@ -304,19 +289,6 @@ return ..() - -/obj/item/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(!unique_reskin) - return - - if(current_skin && !(obj_flags & INFINITE_RESKIN)) - return - - context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" - return CONTEXTUAL_SCREENTIP_SET - /obj/item/click_ctrl(mob/user) SHOULD_NOT_OVERRIDE(TRUE) @@ -482,9 +454,6 @@ else if (siemens_coefficient <= 0.5) .["partially insulated"] = "It is made from a poor insulator that will dampen (but not fully block) electric shocks passing through it." - if(LAZYLEN(unique_reskin) && !current_skin) - .["reskinnable"] = "This item is able to be reskinned! Alt-Click to do so!" - /obj/item/examine_descriptor(mob/user) return "item" @@ -1555,75 +1524,6 @@ if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, offerer, taker) & COMPONENT_OFFER_INTERRUPT) return TRUE -/// SKYRAT EDIT ADDITION START -/obj/item/reskin_obj(mob/M) - if(!uses_advanced_reskins) - return ..() - if(!LAZYLEN(unique_reskin)) - return - - /// Is the obj a glasses icon with swappable item states? - var/is_swappable = FALSE - /// if the item are glasses, this variable stores the item. - var/obj/item/clothing/glasses/reskinned_glasses - - if(istype(src, /obj/item/clothing/glasses)) // TODO - Remove this mess about glasses, it shouldn't be necessary anymore. - reskinned_glasses = src - if(reskinned_glasses.can_switch_eye) - is_swappable = TRUE - - var/list/items = list() - - - for(var/reskin_option in unique_reskin) - var/image/item_image = image(icon = unique_reskin[reskin_option][RESKIN_ICON] ? unique_reskin[reskin_option][RESKIN_ICON] : icon, icon_state = "[unique_reskin[reskin_option][RESKIN_ICON_STATE]]") - items += list("[reskin_option]" = item_image) - sort_list(items) - - var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, PROC_REF(check_reskin_menu), M), radius = 38, require_near = TRUE) - if(!pick) - return - if(!unique_reskin[pick]) - return - current_skin = pick - - if(unique_reskin[pick][RESKIN_ICON]) - icon = unique_reskin[pick][RESKIN_ICON] - - if(unique_reskin[pick][RESKIN_ICON_STATE]) - if(is_swappable) - base_icon_state = unique_reskin[pick][RESKIN_ICON_STATE] - icon_state = base_icon_state - else - icon_state = unique_reskin[pick][RESKIN_ICON_STATE] - - if(unique_reskin[pick][RESKIN_WORN_ICON]) - worn_icon = unique_reskin[pick][RESKIN_WORN_ICON] - - if(unique_reskin[pick][RESKIN_WORN_ICON_STATE]) - worn_icon_state = unique_reskin[pick][RESKIN_WORN_ICON_STATE] - - if(unique_reskin[pick][RESKIN_INHAND_L]) - lefthand_file = unique_reskin[pick][RESKIN_INHAND_L] - if(unique_reskin[pick][RESKIN_INHAND_R]) - righthand_file = unique_reskin[pick][RESKIN_INHAND_R] - if(unique_reskin[pick][RESKIN_INHAND_STATE]) - inhand_icon_state = unique_reskin[pick][RESKIN_INHAND_STATE] - if(unique_reskin[pick][RESKIN_SUPPORTS_VARIATIONS_FLAGS]) - supports_variations_flags = unique_reskin[pick][RESKIN_SUPPORTS_VARIATIONS_FLAGS] - if(ishuman(M)) - var/mob/living/carbon/human/wearer = M - wearer.regenerate_icons() // update that mf - to_chat(M, "[src] is now skinned as '[pick].'") - post_reskin(M) - return TRUE - -/// Automatically called after a reskin, for any extra variable changes. -/obj/item/proc/post_reskin(mob/our_mob) - return - -/// SKYRAT EDIT ADDITION END - /// Special stuff you want to do when an outfit equips this item. /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) SHOULD_CALL_PARENT(TRUE) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 505d8910529..ac344e2f073 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -764,6 +764,20 @@ /obj/item/melee/baton/security/loaded/hos preload_cell_type = /obj/item/stock_parts/power_store/cell/super +// Stunsword Skins +/datum/atom_skin/stunsword + abstract_type = /datum/atom_skin/stunsword + change_inhand_icon_state = TRUE + change_base_icon_state = TRUE + +/datum/atom_skin/stunsword/default + preview_name = "Default" + new_icon_state = "stunsword" + +/datum/atom_skin/stunsword/energy + preview_name = "Energy" + new_icon_state = "stunsword_energy" + ///Stun Sword /obj/item/melee/baton/security/stunsword name = "\improper NT-20 'Excalibur' Stunsword" @@ -789,14 +803,12 @@ convertible = FALSE obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Default" = "stunsword", - "Energy Stunsword" = "stunsword_energy", - ) - unique_reskin_changes_inhand = TRUE - unique_reskin_changes_base_icon_state = TRUE -/obj/item/melee/baton/security/stunsword/loaded/add_deep_lore() +/obj/item/melee/baton/security/stunsword/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/stunsword) + +/obj/item/melee/baton/security/stunsword/add_deep_lore() return /obj/item/melee/baton/security/stunsword/loaded diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 16385f98a5c..65bd3baa1d1 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -264,23 +264,6 @@ inhand_icon_state = "security"//Could likely use a better one. worn_icon_state = "security" content_overlays = TRUE - // SKYRAT EDIT ADDITION START - uses_advanced_reskins = TRUE - unique_reskin = list( - "Basic Security" = list( - RESKIN_ICON = 'icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "security", - RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "security" - ), - "Peacekeeper" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "peacekeeperbelt", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "peacekeeperbelt" - ) - ) - // SKYRAT EDIT ADDITION END storage_type = /datum/storage/security_belt /obj/item/storage/belt/security/full/PopulateContents() diff --git a/code/game/objects/items_reskin.dm b/code/game/objects/items_reskin.dm deleted file mode 100644 index 98a3165b5e2..00000000000 --- a/code/game/objects/items_reskin.dm +++ /dev/null @@ -1,95 +0,0 @@ -/// Called when alt clicked and the item has unique reskin options -/obj/item/proc/on_click_alt_reskin(datum/source, mob/user) - SIGNAL_HANDLER - - if(!user.can_perform_action(src, NEED_DEXTERITY)) - return NONE - - if(!(obj_flags & INFINITE_RESKIN) && current_skin) - return NONE - - INVOKE_ASYNC(src, PROC_REF(reskin_obj), user) - return CLICK_ACTION_SUCCESS - -/** - * Checks if we should set up reskinning, - * by default if unique_reskin is set. - * - * Called on setup_reskinning(). - * Inheritors should override this to add their own checks. - */ -/obj/item/proc/check_setup_reskinning() - SHOULD_CALL_PARENT(TRUE) - if(unique_reskin) - return TRUE - - return FALSE - -/** - * Registers signals and context for reskinning, - * if check_setup_reskinning() passes. - * - * Called on Initialize(...). - * Inheritors should override this to add their own setup steps, - * or to avoid double calling register_context(). - */ -/obj/item/proc/setup_reskinning() - SHOULD_CALL_PARENT(FALSE) - if(!check_setup_reskinning()) - return - - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - register_context() - -/** - * Reskins object based on a user's choice - * - * Arguments: - * * user The mob choosing a reskin option - */ -/obj/item/proc/reskin_obj(mob/user) - if(!LAZYLEN(unique_reskin)) - return - - var/list/items = list() - for(var/reskin_option in unique_reskin) - var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option]) - items += list("[reskin_option]" = item_image) - sort_list(items) - - var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_reskin_menu), user), radius = 38, require_near = TRUE) - if(!pick) - return - if(!unique_reskin[pick]) - return - current_skin = pick - icon_state = unique_reskin[pick] - - if (unique_reskin_changes_base_icon_state) - base_icon_state = icon_state - - if (unique_reskin_changes_inhand) - inhand_icon_state = icon_state - - update_appearance() - - to_chat(user, "[src] is now skinned as '[pick].'") - SEND_SIGNAL(src, COMSIG_OBJ_RESKIN, user, pick) - - -/** - * Checks if we are allowed to interact with a radial menu for reskins - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/item/proc/check_reskin_menu(mob/user) - if(QDELETED(src)) - return FALSE - if(!(obj_flags & INFINITE_RESKIN) && current_skin) - return FALSE - if(!istype(user)) - return FALSE - if(user.incapacitated) - return FALSE - return TRUE diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 8682dc4a927..672b2eeef1c 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -9,7 +9,6 @@ strip_delay = 4 SECONDS equip_delay_other = 4 SECONDS visor_vars_to_toggle = NONE - unique_reskin_changes_base_icon_state = TRUE var/adjusted_flags = null ///Did we install a filtering cloth? diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 6a8d80f5fb3..27d17af36e0 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -1,3 +1,28 @@ +// Mask skins +/datum/atom_skin/joy_mask + abstract_type = /datum/atom_skin/joy_mask + change_base_icon_state = TRUE + +/datum/atom_skin/joy_mask/joy + preview_name = "Joy" + new_icon_state = "joy" + +/datum/atom_skin/joy_mask/flushed + preview_name = "Flushed" + new_icon_state = "flushed" + +/datum/atom_skin/joy_mask/pensive + preview_name = "Pensive" + new_icon_state = "pensive" + +/datum/atom_skin/joy_mask/angry + preview_name = "Angry" + new_icon_state = "angry" + +/datum/atom_skin/joy_mask/pleading + preview_name = "Pleading" + new_icon_state = "pleading" + /obj/item/clothing/mask/joy name = "emotion mask" desc = "Express your happiness or hide your sorrows with this cultured cutout." @@ -5,19 +30,10 @@ base_icon_state = "joy" clothing_flags = MASKINTERNALS flags_inv = HIDESNOUT - obj_flags = parent_type::obj_flags | INFINITE_RESKIN - unique_reskin = list( - "Joy" = "joy", - "Flushed" = "flushed", - "Pensive" = "pensive", - "Angry" = "angry", - "Pleading" = "pleading" - ) - -/obj/item/clothing/mask/joy/reskin_obj(mob/user) +/obj/item/clothing/mask/joy/Initialize(mapload) . = ..() - user.update_worn_mask() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/joy_mask, infinite = TRUE) /obj/item/clothing/mask/mummy name = "mummy mask" diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 81f6ae57109..5839c2a43e5 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -73,13 +73,6 @@ . = ..() dump_attachments() -/obj/item/clothing/under/setup_reskinning() - if(!check_setup_reskinning()) - return - - // We already register context in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - /obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm index 0e4e2f98190..993771e4888 100644 --- a/code/modules/clothing/under/accessories/_accessories.dm +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -31,13 +31,6 @@ . = ..() register_context() -/obj/item/clothing/accessory/setup_reskinning() - if(!check_setup_reskinning()) - return - - // We already register context regardless in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - /** * Can we be attached to the passed clothing article? */ diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 9d7d87a0846..9f871c71015 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -177,28 +177,51 @@ name = "Pre-Approved Cyborg Candidate dogtag" display = "This employee has been screened for negative mental traits to an acceptable level of accuracy, and is approved for the NT Cyborg program as an alternative to medical resuscitation." +// Pride pin skins +/datum/atom_skin/pride_pin + abstract_type = /datum/atom_skin/pride_pin + +/datum/atom_skin/pride_pin/gay + preview_name = "Rainbow Pride" + new_icon_state = "pride" + +/datum/atom_skin/pride_pin/bi + preview_name = "Bisexual Pride" + new_icon_state = "pride_bi" + +/datum/atom_skin/pride_pin/pan + preview_name = "Pansexual Pride" + new_icon_state = "pride_pan" + +/datum/atom_skin/pride_pin/ace + preview_name = "Asexual Pride" + new_icon_state = "pride_ace" + +/datum/atom_skin/pride_pin/enby + preview_name = "Non-binary Pride" + new_icon_state = "pride_enby" + +/datum/atom_skin/pride_pin/trans + preview_name = "Transgender Pride" + new_icon_state = "pride_trans" + +/datum/atom_skin/pride_pin/intersex + preview_name = "Intersex Pride" + new_icon_state = "pride_intersex" + +/datum/atom_skin/pride_pin/lesbian + preview_name = "Lesbian Pride" + new_icon_state = "pride_lesbian" + /obj/item/clothing/accessory/pride name = "pride pin" desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your pride, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!" icon_state = "pride" - obj_flags = UNIQUE_RENAME | INFINITE_RESKIN - unique_reskin = list( - "Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - "Intersex Pride" = "pride_intersex", - "Lesbian Pride" = "pride_lesbian", - ) + obj_flags = UNIQUE_RENAME -/obj/item/clothing/accessory/pride/setup_reskinning() - if(!check_setup_reskinning()) - return - - // We already register context regardless in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) +/obj/item/clothing/accessory/pride/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pride_pin, infinite = TRUE) /obj/item/clothing/accessory/deaf_pin name = "deaf personnel pin" diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index c63d046f8f0..30dbc08ff10 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -275,6 +275,26 @@ can_adjust = FALSE resistance_flags = NONE +// Mech suit skins +/datum/atom_skin/mech_suit + abstract_type = /datum/atom_skin/mech_suit + +/datum/atom_skin/mech_suit/red + preview_name = "Red" + new_icon_state = "red_mech_suit" + +/datum/atom_skin/mech_suit/white + preview_name = "White" + new_icon_state = "white_mech_suit" + +/datum/atom_skin/mech_suit/blue + preview_name = "Blue" + new_icon_state = "blue_mech_suit" + +/datum/atom_skin/mech_suit/black + preview_name = "Black" + new_icon_state = "black_mech_suit" + /obj/item/clothing/under/costume/mech_suit name = "mech pilot's suit" desc = "A mech pilot's suit. Might make your butt look big." @@ -286,13 +306,9 @@ alternate_worn_layer = GLOVES_LAYER //covers hands but gloves can go over it. This is how these things work in my head. can_adjust = FALSE - unique_reskin = list( - "Red" = "red_mech_suit", - "White" = "white_mech_suit", - "Blue" = "blue_mech_suit", - "Black" = "black_mech_suit", - ) - +/obj/item/clothing/under/costume/mech_suit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/mech_suit) /obj/item/clothing/under/costume/russian_officer name = "\improper Russian officer's uniform" diff --git a/code/modules/loadout/categories/accessories.dm b/code/modules/loadout/categories/accessories.dm index 51807a62d5b..53a61c9bc0e 100644 --- a/code/modules/loadout/categories/accessories.dm +++ b/code/modules/loadout/categories/accessories.dm @@ -84,4 +84,4 @@ /datum/loadout_item/accessory/pride name = "Pride Pin" item_path = /obj/item/clothing/accessory/pride - loadout_flags = LOADOUT_FLAG_ALLOW_RESKIN + reskin_datum = /datum/atom_skin/pride_pin diff --git a/code/modules/loadout/loadout_items.dm b/code/modules/loadout/loadout_items.dm index 943ca6d6773..d571158e856 100644 --- a/code/modules/loadout/loadout_items.dm +++ b/code/modules/loadout/loadout_items.dm @@ -52,8 +52,9 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) /// Icon state for the UI to use for preview icons. /// Set automatically if null var/ui_icon_state - /// Reskin options of this item if it can be reskinned. - VAR_FINAL/list/cached_reskin_options + /// Base typepath to what reskin datum this item can use to reskin into + /// Doesn't verify that the item_path actually has these reskins + var/reskin_datum /// A list of greyscale colors that are used for items that have greyscale support, but don't allow full customization. /// This is an assoc list of /datum/job_department -> colors, or /datum/job -> colors, allowing for preset colors based on player chosen job. /// Jobs are prioritized over departments. @@ -100,15 +101,6 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) ui_icon = item_path::icon_preview || item_path::icon ui_icon_state = item_path::icon_state_preview || item_path::icon_state - if(loadout_flags & LOADOUT_FLAG_ALLOW_RESKIN) - var/obj/item/dummy_item = new item_path() - if(!length(dummy_item.unique_reskin)) - loadout_flags &= ~LOADOUT_FLAG_ALLOW_RESKIN - stack_trace("Loadout item [item_path] has LOADOUT_FLAG_ALLOW_RESKIN but has no unique reskins.") - else - cached_reskin_options = dummy_item.unique_reskin.Copy() - qdel(dummy_item) - // SKYRAT EDIT ADDITION // Let's sanitize in case somebody inserted the player's byond name instead of ckey in canonical form if(ckeywhitelist) @@ -158,7 +150,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) // BUBBER EDIT ADDITION END if("set_skin") - if(loadout_flags & LOADOUT_FLAG_ALLOW_RESKIN) + if(reskin_datum) return set_skin(manager, user, params) return TRUE @@ -241,12 +233,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) /// Used for reskinning an item to an alt skin. /datum/loadout_item/proc/set_skin(datum/preference_middleware/loadout/manager, mob/user, params) - var/reskin_to = params["skin"] - if(!cached_reskin_options[reskin_to]) - return FALSE - - if(!cached_reskin_options[reskin_to]) - return FALSE + var/reskin_to = params["skin"] // sanity checking isn't necessary because it's all checked when equipped anyways var/list/loadout = manager.get_current_loadout() // BUBBER EDIT: Multiple loadout presets: ORIGINAL: var/list/loadout = manager.preferences.read_preference(/datum/preference/loadout) if(!loadout?[item_path]) @@ -333,11 +320,13 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) SEND_SIGNAL(equipped_item, COMSIG_NAME_CHANGED) // BUBBER EDIT CHANGE END - Descriptions - if((loadout_flags & LOADOUT_FLAG_ALLOW_RESKIN) && item_details?[INFO_RESKIN]) + if(reskin_datum && item_details?[INFO_RESKIN]) var/skin_chosen = item_details[INFO_RESKIN] - if(skin_chosen in equipped_item.unique_reskin) - equipped_item.current_skin = skin_chosen - equipped_item.icon_state = equipped_item.unique_reskin[skin_chosen] + for(var/datum/atom_skin/skin_path as anything in valid_subtypesof(reskin_datum)) + if(skin_path::preview_name != skin_chosen) + continue + var/datum/atom_skin/skin_instance = GLOB.atom_skins[skin_path] + skin_instance.apply(equipped_item) if(istype(equipped_item, /obj/item/clothing/accessory)) // Snowflake handing for accessories, because we need to update the thing it's attached to instead if(isclothing(equipped_item.loc)) @@ -346,6 +335,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) update_flag |= (ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) else update_flag |= equipped_item.slot_flags + break return update_flag @@ -400,7 +390,7 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) if((loadout_flags & LOADOUT_FLAG_GREYSCALING_ALLOWED) && !(loadout_flags & LOADOUT_FLAG_JOB_GREYSCALING)) displayed_text[FA_ICON_PALETTE] = "Recolorable" - if(loadout_flags & LOADOUT_FLAG_ALLOW_RESKIN) + if(reskin_datum) displayed_text[FA_ICON_SWATCHBOOK] = "Reskinnable" if(required_holiday) @@ -473,16 +463,17 @@ GLOBAL_LIST_INIT(all_loadout_categories, init_loadout_categories()) * Returns a list of options this item can be reskinned into. */ /datum/loadout_item/proc/get_reskin_options() as /list - if(!(loadout_flags & LOADOUT_FLAG_ALLOW_RESKIN)) + if(!reskin_datum) return null var/list/reskins = list() - for(var/skin in cached_reskin_options) + for(var/datum/atom_skin/skin as anything in valid_subtypesof(reskin_datum)) UNTYPED_LIST_ADD(reskins, list( - "name" = skin, - "tooltip" = skin, - "skin_icon_state" = cached_reskin_options[skin], + "name" = skin::new_name || skin::preview_name, + "tooltip" = skin::preview_name, + "skin_icon" = skin::new_icon, + "skin_icon_state" = skin::new_icon_state, )) return reskins diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm index baf71f5cbe3..55533341d89 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm @@ -12,6 +12,7 @@ suicidal miners against local fauna." icon = 'icons/obj/mining.dmi' icon_state = "crusher" + base_icon_state = "crusher" inhand_icon_state = "crusher0" icon_angle = -45 lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' @@ -56,25 +57,43 @@ var/detonation_damage = 50 /// Damage that the mark additionally does when hit by the crusher via backstab var/backstab_bonus = 30 - /// Used by retool kits when changing the crusher's appearance - var/current_inhand_icon_state = "crusher" /// The file in which our projectile icon resides var/projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' /// Used by retool kits when changing the crusher's projectile sprite var/projectile_icon_state = "pulse1" /// Wielded damage we deal, aka our "real" damage var/force_wielded = 20 + /// Set to TRUE if the last projectile fired was point-blank at a living target + var/last_projectile_pb = FALSE /obj/item/kinetic_crusher/Initialize(mapload) . = ..() - AddComponent(/datum/component/butchering, \ + AddComponent( \ + /datum/component/butchering, \ speed = 6 SECONDS, \ effectiveness = 110, \ ) + update_reskin(null) //technically it's huge and bulky, but this provides an incentive to use it update_wielding() register_context() +/** + * Adds or updates the reskinning component on the crusher. + * + * * default_skin_typepath: The typepath of skin to apply by default. + * Passing null will either not apply a skin or will reset it to default if one is already applied. + * If a supplied skin is blacklisted, it will be un-blacklisted. + */ +/obj/item/kinetic_crusher/proc/update_reskin(datum/atom_skin/crusher_skin/default_skin_typepath) + AddComponent( \ + /datum/component/reskinable_item, \ + /datum/atom_skin/crusher_skin, \ + infinite = TRUE, \ + initial_skin = default_skin_typepath ? default_skin_typepath::preview_name : null, \ + blacklisted_subtypes = subtypesof(/datum/atom_skin/crusher_skin/locked) - default_skin_typepath, \ + ) + /obj/item/kinetic_crusher/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() if(!held_item) @@ -236,6 +255,7 @@ var/turf/proj_turf = user.loc if(!isturf(proj_turf)) return + last_projectile_pb = get_dist(target, user) <= 1 && isliving(target) var/obj/projectile/destabilizer/destabilizer = new(proj_turf) SEND_SIGNAL(src, COMSIG_CRUSHER_FIRED_BLAST, target, user, destabilizer) destabilizer.icon = projectile_icon @@ -281,7 +301,7 @@ return TRUE /obj/item/kinetic_crusher/update_icon_state() - inhand_icon_state = "[current_inhand_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent + inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent return ..() /obj/item/kinetic_crusher/update_overlays() diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm index c4ff738b9cb..dca037e37cd 100644 --- a/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm +++ b/code/modules/mining/equipment/kinetic_crusher/trophies_misc.dm @@ -1,164 +1,95 @@ -/*! - * Contains crusher trophies that are not obtained from fauna - */ -/// Cosmetic items for changing the crusher's look -/obj/item/crusher_trophy/retool_kit - name = "crusher retool kit" - desc = "A toolkit for changing the crusher's appearance without affecting the device's function." - icon = 'icons/obj/mining.dmi' - icon_state = "retool_kit" - denied_type = /obj/item/crusher_trophy/retool_kit - - /// Currently picked crusher reskin - var/datum/crusher_skin/active_skin = /datum/crusher_skin/sword - /// If this kit forces some specific skin, or can pick between subtypes - var/forced_skin - -/obj/item/crusher_trophy/retool_kit/Destroy(force) - if (istype(active_skin)) - QDEL_NULL(active_skin) - return ..() - -/obj/item/crusher_trophy/retool_kit/effect_desc() - return "the crusher to have the appearance of \a [active_skin::name]" - -/obj/item/crusher_trophy/retool_kit/add_to(obj/item/kinetic_crusher/pkc, mob/user) - if (!forced_skin) - var/list/choices = list() - for (var/datum/crusher_skin/skin as anything in subtypesof(/datum/crusher_skin)) - if (skin::normal_skin) - choices[skin] = icon(skin::retool_icon || 'icons/obj/mining.dmi', skin::retool_icon_state) - var/datum/crusher_skin/chosen_skin = show_radial_menu(user, src, choices, tooltips = TRUE, require_near = TRUE) - if (!chosen_skin) - return - active_skin = chosen_skin - else - active_skin = forced_skin - . = ..() - if(!.) - return - active_skin = new active_skin(pkc) - if (active_skin.retool_icon) - pkc.icon = active_skin.retool_icon - pkc.icon_state = active_skin.retool_icon_state - pkc.current_inhand_icon_state = active_skin.retool_inhand_icon - if (active_skin.retool_projectile_icon) - pkc.projectile_icon = active_skin.retool_projectile_icon - if (active_skin.retool_projectile_icon_state) - pkc.projectile_icon_state = active_skin.retool_projectile_icon_state - // Should either have both, or neither - if (active_skin.retool_lefthand_file) - pkc.lefthand_file = active_skin.retool_lefthand_file - pkc.righthand_file = active_skin.retool_righthand_file - if(active_skin.retool_worn_file) - pkc.worn_icon = active_skin.retool_worn_file - pkc.worn_icon_state = active_skin::retool_icon_state - if (active_skin.retool_inhand_x) - pkc.inhand_x_dimension = active_skin.retool_inhand_x - if (active_skin.retool_inhand_y) - pkc.inhand_y_dimension = active_skin.retool_inhand_y - pkc.update_appearance() - pkc.update_slot_icon() - -/obj/item/crusher_trophy/retool_kit/remove_from(obj/item/kinetic_crusher/pkc) - var/skin_type = active_skin.type - qdel(active_skin) - active_skin = skin_type - pkc.icon = initial(pkc.icon) - pkc.icon_state = initial(pkc.icon_state) - pkc.current_inhand_icon_state = initial(pkc.current_inhand_icon_state) - pkc.projectile_icon = initial(pkc.projectile_icon) - pkc.projectile_icon_state = initial(pkc.projectile_icon_state) - pkc.lefthand_file = initial(pkc.lefthand_file) - pkc.righthand_file = initial(pkc.righthand_file) - pkc.worn_icon = initial(pkc.worn_icon) - pkc.worn_icon_state = initial(pkc.worn_icon_state) - pkc.inhand_x_dimension = initial(pkc.inhand_x_dimension) - pkc.inhand_y_dimension = initial(pkc.inhand_y_dimension) - pkc.update_appearance() - pkc.update_slot_icon() - return ..() - -/// Alternate PKC skins -/datum/crusher_skin - /// Name of the modification - var/name = "error that should be reported to coders" - /// Specifies the icon file in which the crusher's new state is stored. - var/retool_icon = 'icons/obj/mining.dmi' - ///Specifies the sprite/icon state which the crusher is changed to as an item. Should appear in the icons/obj/mining.dmi file with accompanying "lit" and "recharging" sprites - var/retool_icon_state = "ipickaxe" - ///Specifies the icon state for the crusher's appearance in hand. Should appear in both retool_lefthand_file and retool_righthand_file. - var/retool_inhand_icon = "ipickaxe" +// Alternate PKC skins +/datum/atom_skin/crusher_skin + abstract_type = /datum/atom_skin/crusher_skin + change_base_icon_state = TRUE + new_icon = 'icons/obj/mining.dmi' + new_icon_state = "ipickaxe" + /// Specifies the icon state for the crusher's appearance in hand. Should appear in both new_lefthand_file and new_righthand_file. + var/new_inhand_icon = "ipickaxe" /// Specifies the icon file in which the crusher's projectile sprite is located. - var/retool_projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' - ///For if the retool kit changes the projectile's appearance. - var/retool_projectile_icon_state = null + var/new_projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi' + /// For if the retool kit changes the projectile's appearance. + var/new_projectile_icon_state /// Specifies the left hand inhand icon file. Don't forget to set the right hand file as well. - var/retool_lefthand_file = null + var/new_lefthand_file /// Specifies the right hand inhand icon file. Don't forget to set the left hand file as well. - var/retool_righthand_file = null + var/new_righthand_file /// Specifies the worn icon file. - var/retool_worn_file = null + var/new_worn_file /// Specifies the X dimensions of the new inhand, only relevant with different inhand files. - var/retool_inhand_x = null + var/new_inhandx /// Specifies the Y dimensions of the new inhand, only relevant with different inhand files. - var/retool_inhand_y = null - /// Can this skin be normally selected by a generic retool kit? - var/normal_skin = TRUE - /// Crusher this skin is attached to - var/obj/item/kinetic_crusher/crusher + var/new_inhandy -/datum/crusher_skin/New(obj/item/kinetic_crusher/new_crusher) +/datum/atom_skin/crusher_skin/apply(obj/item/kinetic_crusher/apply_to) . = ..() - crusher = new_crusher + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_icon_state, new_inhand_icon, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon, new_projectile_icon, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon_state, new_projectile_icon_state, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, lefthand_file, new_lefthand_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, righthand_file, new_righthand_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon, new_worn_file, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon_state, new_icon_state, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_x_dimension, new_inhandx, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_y_dimension, new_inhandy, reset_missing) -/datum/crusher_skin/Destroy(force) - crusher = null - return ..() - -/datum/crusher_skin/sword - name = "sword" - retool_icon_state = "crusher_sword" - retool_inhand_icon = "crusher_sword" - -/datum/crusher_skin/harpoon - name = "harpoon" - retool_icon_state = "crusher_harpoon" - retool_inhand_icon = "crusher_harpoon" - retool_projectile_icon_state = "pulse_harpoon" - -/datum/crusher_skin/harpoon/New(obj/item/kinetic_crusher/new_crusher) +/datum/atom_skin/crusher_skin/clear_skin(obj/item/kinetic_crusher/clear_from) . = ..() - RegisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) + RESET_INITIAL_IF_SET(clear_from, inhand_icon_state, new_inhand_icon) + RESET_INITIAL_IF_SET(clear_from, projectile_icon, new_projectile_icon) + RESET_INITIAL_IF_SET(clear_from, projectile_icon_state, new_projectile_icon_state) + RESET_INITIAL_IF_SET(clear_from, lefthand_file, new_lefthand_file) + RESET_INITIAL_IF_SET(clear_from, righthand_file, new_righthand_file) + RESET_INITIAL_IF_SET(clear_from, worn_icon, new_worn_file) + RESET_INITIAL_IF_SET(clear_from, worn_icon_state, new_icon_state) + RESET_INITIAL_IF_SET(clear_from, inhand_x_dimension, new_inhandx) + RESET_INITIAL_IF_SET(clear_from, inhand_y_dimension, new_inhandy) -/datum/crusher_skin/harpoon/Destroy(force) - UnregisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION) - return ..() +/datum/atom_skin/crusher_skin/sword + new_name = "proto-kinetic sword" + preview_name = "Sword" + new_icon_state = "crusher_sword" + new_inhand_icon = "crusher_sword" -/datum/crusher_skin/harpoon/proc/on_attack_animation(obj/item/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override) +/datum/atom_skin/crusher_skin/harpoon + new_name = "proto-kinetic harpoon" + preview_name = "Harpoon" + new_icon_state = "crusher_harpoon" + new_inhand_icon = "crusher_harpoon" + new_projectile_icon_state = "pulse_harpoon" + +/datum/atom_skin/crusher_skin/harpoon/apply(atom/apply_to) + . = ..() + RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) + +/datum/atom_skin/crusher_skin/harpoon/clear_skin(atom/clear_from) + . = ..() + UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION) + +/datum/atom_skin/crusher_skin/harpoon/proc/on_attack_animation(obj/item/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override) SIGNAL_HANDLER // If nothing is forcing an animation type, attack with a piercing animation because we're a harpoon if (!animation_type) animation_override += ATTACK_ANIMATION_PIERCE -/datum/crusher_skin/dagger - name = "dual dagger and blaster" - retool_icon_state = "crusher_dagger" - retool_inhand_icon = "crusher_dagger" - /// Are we doing a blaster animation right now? - var/blaster_strike = FALSE +/datum/atom_skin/crusher_skin/dagger + new_name = "proto-kinetic dual dagger and blaster" + preview_name = "Dagger and Blaster" + new_icon_state = "crusher_dagger" + new_inhand_icon = "crusher_dagger" -/datum/crusher_skin/dagger/New(obj/item/kinetic_crusher/new_crusher) +/datum/atom_skin/crusher_skin/dagger/apply(atom/apply_to) . = ..() - RegisterSignal(crusher, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) - RegisterSignal(crusher, COMSIG_CRUSHER_FIRED_BLAST, PROC_REF(on_fired_blast)) + RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation)) + RegisterSignal(apply_to, COMSIG_CRUSHER_FIRED_BLAST, PROC_REF(on_fired_blast)) -/datum/crusher_skin/dagger/Destroy(force) - UnregisterSignal(crusher, list(COMSIG_ITEM_ATTACK_ANIMATION, COMSIG_CRUSHER_FIRED_BLAST)) - return ..() +/datum/atom_skin/crusher_skin/dagger/clear_skin(atom/clear_from) + . = ..() + UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION) + UnregisterSignal(clear_from, COMSIG_CRUSHER_FIRED_BLAST) -/datum/crusher_skin/dagger/proc/on_attack_animation(obj/item/kinetic_crusher/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override, list/angle_override) +/datum/atom_skin/crusher_skin/dagger/proc/on_attack_animation(obj/item/kinetic_crusher/source, atom/movable/attacker, atom/attacked_atom, animation_type, list/image_override, list/animation_override, list/angle_override) SIGNAL_HANDLER // If we've been forcefully assigned an animation type already, we shouldn't do the custom attack animation logic @@ -167,11 +98,11 @@ if (isliving(attacked_atom)) var/mob/living/target = attacked_atom - if (blaster_strike) + if (source.last_projectile_pb) image_override += image(icon = 'icons/obj/mining.dmi', icon_state = "crusher_dagger_blaster") angle_override += 0 animation_override += ATTACK_ANIMATION_PIERCE - blaster_strike = FALSE + source.last_projectile_pb = FALSE return if (target.has_status_effect(/datum/status_effect/crusher_mark)) @@ -179,33 +110,62 @@ image_override += image(icon = 'icons/obj/mining.dmi', icon_state = "crusher_dagger_melee") -/datum/crusher_skin/dagger/proc/on_fired_blast(obj/item/kinetic_crusher/source, atom/target, mob/living/user, obj/projectile/destabilizer/destabilizer) +/datum/atom_skin/crusher_skin/dagger/proc/on_fired_blast(obj/item/kinetic_crusher/source, atom/target, mob/living/user, obj/projectile/destabilizer/destabilizer) SIGNAL_HANDLER if (isliving(target) && get_dist(target, user) <= 1) - blaster_strike = TRUE user.do_item_attack_animation(target, used_item = source) -/datum/crusher_skin/glaive - name = "glaive" - retool_icon_state = "crusher_glaive" - retool_inhand_icon = "crusher_glaive" - retool_lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - retool_righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - retool_inhand_x = 64 - retool_inhand_y = 64 +/datum/atom_skin/crusher_skin/glaive + new_name = "proto-kinetic glaive" + preview_name = "Glaive" + new_icon_state = "crusher_glaive" + new_inhand_icon = "crusher_glaive" + new_lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + new_righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + new_inhandx = 64 + new_inhandy = 64 + +// Locked skins that cannot be selected normally +/datum/atom_skin/crusher_skin/locked + abstract_type = /datum/atom_skin/crusher_skin/locked + +/datum/atom_skin/crusher_skin/locked/ashen_skull + preview_name = "Skull" + new_icon_state = "crusher_skull" + new_inhand_icon = "crusher_skull" + new_projectile_icon_state = "pulse_skull" + +/// Unlockable (or forced) skins +/obj/item/crusher_trophy/retool_kit + name = "crusher retool kit" + desc = "A toolkit for changing the crusher's appearance without affecting the device's function." + icon = 'icons/obj/mining.dmi' + icon_state = "retool_kit" + denied_type = /obj/item/crusher_trophy/retool_kit + + /// What skin do we apply when attached + var/datum/atom_skin/crusher_skin/forced_skin + +/obj/item/crusher_trophy/retool_kit/effect_desc() + return "the crusher to have the appearance of \a [forced_skin::preview_name]" + +/obj/item/crusher_trophy/retool_kit/add_to(obj/item/kinetic_crusher/pkc, mob/user) + . = ..() + if(!.) + return + + pkc.update_reskin(forced_skin) + +/obj/item/crusher_trophy/retool_kit/remove_from(obj/item/kinetic_crusher/pkc) + pkc.update_reskin(null) // resets reskin component + return ..() /obj/item/crusher_trophy/retool_kit/ashenskull name = "ashen skull" desc = "It burns with the flame of the necropolis, whispering in your ear. It demands to be bound to a suitable weapon." icon_state = "retool_kit_skull" - forced_skin = /datum/crusher_skin/ashen_skull + forced_skin = /datum/atom_skin/crusher_skin/locked/ashen_skull /obj/item/crusher_trophy/retool_kit/ashenskull/effect_desc() return "the crusher to appear corrupted by infernal powers" - -/datum/crusher_skin/ashen_skull - retool_icon_state = "crusher_skull" - retool_inhand_icon = "crusher_skull" - retool_projectile_icon_state = "pulse_skull" - normal_skin = FALSE diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8b404aa5f0e..bea7ec2e543 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,3 +1,20 @@ +// Clipboard skins +/datum/atom_skin/clipboard + abstract_type = /datum/atom_skin/clipboard + change_inhand_icon_state = TRUE + +/datum/atom_skin/clipboard/brown + preview_name = "Brown" + new_icon_state = "clipboard" + +/datum/atom_skin/clipboard/black + preview_name = "Black" + new_icon_state = "clipboard_black" + +/datum/atom_skin/clipboard/white + preview_name = "White" + new_icon_state = "clipboard_white" + /** * Clipboard */ @@ -15,12 +32,6 @@ resistance_flags = FLAMMABLE custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) - unique_reskin = list( - "Brown" = "clipboard", - "Black" = "clipboard_black", - "White" = "clipboard_white", - ) - unique_reskin_changes_inhand = TRUE /// The stored pen var/obj/item/pen/pen @@ -40,6 +51,7 @@ /obj/item/clipboard/Initialize(mapload) update_appearance() . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/clipboard) /obj/item/clipboard/Destroy() QDEL_NULL(pen) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 29b6ceeef0e..572939355b8 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -177,6 +177,38 @@ time = 3 SECONDS category = CAT_TOOLS +// Skins for captain's fountain pen +/datum/atom_skin/cap_pen + abstract_type = /datum/atom_skin/cap_pen + +/datum/atom_skin/cap_pen/apply(atom/apply_to) + . = ..() + apply_to.desc = "It's an expensive [preview_name] fountain pen. The nib is quite sharp." + +/datum/atom_skin/cap_pen/clear_skin(atom/clear_from) + . = ..() + clear_from.desc = initial(clear_from.desc) + +/datum/atom_skin/cap_pen/oak + preview_name = "Oak" + new_icon_state = "pen-fountain-o" + +/datum/atom_skin/cap_pen/gold + preview_name = "Gold" + new_icon_state = "pen-fountain-g" + +/datum/atom_skin/cap_pen/rosewood + preview_name = "Rosewood" + new_icon_state = "pen-fountain-r" + +/datum/atom_skin/cap_pen/black_silver + preview_name = "Black and Silver" + new_icon_state = "pen-fountain-b" + +/datum/atom_skin/cap_pen/command_blue + preview_name = "Command Blue" + new_icon_state = "pen-fountain-cb" + /obj/item/pen/fountain/captain name = "captain's fountain pen" desc = "It's an expensive Oak fountain pen. The nib is quite sharp." @@ -187,22 +219,15 @@ custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT*7.5) sharpness = SHARP_EDGED resistance_flags = FIRE_PROOF - unique_reskin = list( - "Oak" = "pen-fountain-o", - "Gold" = "pen-fountain-g", - "Rosewood" = "pen-fountain-r", - "Black and Silver" = "pen-fountain-b", - "Command Blue" = "pen-fountain-cb" - ) embed_type = /datum/embedding/pen/captain dart_insert_casing_icon_state = "overlay_fountainpen_gold" dart_insert_projectile_icon_state = "overlay_fountainpen_gold_proj" var/list/overlay_reskin = list( - "Oak" = "overlay_fountainpen_gold", - "Gold" = "overlay_fountainpen_gold", - "Rosewood" = "overlay_fountainpen_gold", - "Black and Silver" = "overlay_fountainpen", - "Command Blue" = "overlay_fountainpen_gold" + /datum/atom_skin/cap_pen/black_silver::preview_name = "overlay_fountainpen", + /datum/atom_skin/cap_pen/command_blue::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/gold::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/oak::preview_name = "overlay_fountainpen_gold", + /datum/atom_skin/cap_pen/rosewood::preview_name = "overlay_fountainpen_gold", ) /datum/embedding/pen/captain @@ -210,24 +235,21 @@ /obj/item/pen/fountain/captain/Initialize(mapload) . = ..() - AddComponent(/datum/component/butchering, \ - speed = 20 SECONDS, \ - effectiveness = 115, \ + AddComponent( \ + /datum/component/butchering, \ + speed = 20 SECONDS, \ + effectiveness = 115, \ ) + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/cap_pen) //the pen is mightier than the sword RegisterSignal(src, COMSIG_DART_INSERT_PARENT_RESKINNED, PROC_REF(reskin_dart_insert)) -/obj/item/pen/fountain/captain/reskin_obj(mob/M) - ..() - if(current_skin) - desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." - - -/obj/item/pen/fountain/captain/proc/reskin_dart_insert(datum/component/dart_insert/insert_comp) +/obj/item/pen/fountain/captain/proc/reskin_dart_insert(datum/component/dart_insert/insert_comp, skin) + SIGNAL_HANDLER if(!istype(insert_comp)) //You really shouldn't be sending this signal from anything other than a dart_insert component return - insert_comp.casing_overlay_icon_state = overlay_reskin[current_skin] - insert_comp.projectile_overlay_icon_state = "[overlay_reskin[current_skin]]_proj" + insert_comp.casing_overlay_icon_state = overlay_reskin[skin] + insert_comp.projectile_overlay_icon_state = "[overlay_reskin[skin]]_proj" /obj/item/pen/item_ctrl_click(mob/living/carbon/user) if(loc != user) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 7ba9ec3158d..5511f6a6ca5 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -9,7 +9,6 @@ pickup_sound = 'sound/items/handling/gun/gun_pick_up.ogg' drop_sound = 'sound/items/handling/gun/gun_drop.ogg' sound_vary = TRUE - unique_reskin_changes_base_icon_state = TRUE min_recoil = 0.1 diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 06a8b50c566..6f4b9be9330 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -97,8 +97,7 @@ . = ..() var/live_ammo = get_ammo(FALSE, FALSE) . += "[live_ammo ? live_ammo : "None"] of those are live rounds." - if (current_skin) - . += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].") + . += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].") /obj/item/gun/ballistic/revolver/ignition_effect(atom/A, mob/user) if(last_fire && last_fire + 15 SECONDS > world.time) @@ -112,6 +111,47 @@ base_icon_state = "c38" fire_sound = 'sound/items/weapons/gun/revolver/shot.ogg' +// 38 special skins +/datum/atom_skin/det_revolver + abstract_type = /datum/atom_skin/det_revolver + change_base_icon_state = TRUE + +/datum/atom_skin/det_revolver/default + preview_name = "Default" + new_icon_state = "c38" + +/datum/atom_skin/det_revolver/fitz_special + preview_name = "Fitz Special" + new_icon_state = "c38_fitz" + +/datum/atom_skin/det_revolver/police_positive_special + preview_name = "Police Positive Special" + new_icon_state = "c38_police" + +/datum/atom_skin/det_revolver/blued_steel + preview_name = "Blued Steel" + new_icon_state = "c38_blued" + +/datum/atom_skin/det_revolver/stainless_steel + preview_name = "Stainless Steel" + new_icon_state = "c38_stainless" + +/datum/atom_skin/det_revolver/gold_trim + preview_name = "Gold Trim" + new_icon_state = "c38_trim" + +/datum/atom_skin/det_revolver/golden + preview_name = "Golden" + new_icon_state = "c38_gold" + +/datum/atom_skin/det_revolver/peacemaker + preview_name = "The Peacemaker" + new_icon_state = "c38_peacemaker" + +/datum/atom_skin/det_revolver/black_panther + preview_name = "Black Panther" + new_icon_state = "c38_panther" + /obj/item/gun/ballistic/revolver/c38/detective name = "\improper Colt Detective Special" desc = "A classic, if not outdated, law enforcement firearm. Uses .38 Special rounds. \nSome spread rumors that if you loosen the barrel with a wrench, you can \"improve\" it." @@ -126,17 +166,10 @@ misfire_percentage_increment = 25 //about 1 in 4 rounds, which increases rapidly every shot obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Default" = "c38", - "Fitz Special" = "c38_fitz", - "Police Positive Special" = "c38_police", - "Blued Steel" = "c38_blued", - "Stainless Steel" = "c38_stainless", - "Gold Trim" = "c38_trim", - "Golden" = "c38_gold", - "The Peacemaker" = "c38_peacemaker", - "Black Panther" = "c38_panther" - ) + +/obj/item/gun/ballistic/revolver/c38/detective/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/det_revolver) /obj/item/gun/ballistic/revolver/badass name = "\improper Badass Revolver" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 437b406b296..2d85dbee063 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -285,6 +285,35 @@ /obj/item/gun/ballistic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin +// Double barrel shotgun skins +/datum/atom_skin/bar_shotgun + abstract_type = /datum/atom_skin/bar_shotgun + change_base_icon_state = TRUE + +/datum/atom_skin/bar_shotgun/default + preview_name = "Standard Finish" + new_icon_state = "dshotgun" + +/datum/atom_skin/bar_shotgun/dark_red + preview_name = "Dark Red Finish" + new_icon_state = "dshotgun_d" + +/datum/atom_skin/bar_shotgun/ash + preview_name = "Ash" + new_icon_state = "dshotgun_f" + +/datum/atom_skin/bar_shotgun/faded_grey + preview_name = "Faded Grey" + new_icon_state = "dshotgun_g" + +/datum/atom_skin/bar_shotgun/maple + preview_name = "Maple" + new_icon_state = "dshotgun_l" + +/datum/atom_skin/bar_shotgun/rosewood + preview_name = "Rosewood" + new_icon_state = "dshotgun_p" + ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// @@ -304,18 +333,15 @@ sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME rack_sound_volume = 0 - unique_reskin = list("Default" = "dshotgun", - "Dark Red Finish" = "dshotgun_d", - "Ash" = "dshotgun_f", - "Faded Grey" = "dshotgun_g", - "Maple" = "dshotgun_l", - "Rosewood" = "dshotgun_p" - ) semi_auto = TRUE bolt_type = BOLT_TYPE_NO_BOLT can_be_sawn_off = TRUE pb_knockback = 3 // it's a super shotgun! +/obj/item/gun/ballistic/shotgun/doublebarrel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bar_shotgun) + /obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user) . = ..() if(.) diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index f21c08cdb0c..d88a427277c 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -1,3 +1,31 @@ +// Gel skins +/datum/atom_skin/med_gel + abstract_type = /datum/atom_skin/med_gel + +/datum/atom_skin/med_gel/blue + preview_name = "Blue" + new_icon_state = "medigel_blue" + +/datum/atom_skin/med_gel/cyan + preview_name = "Cyan" + new_icon_state = "medigel_cyan" + +/datum/atom_skin/med_gel/green + preview_name = "Green" + new_icon_state = "medigel_green" + +/datum/atom_skin/med_gel/red + preview_name = "Red" + new_icon_state = "medigel_red" + +/datum/atom_skin/med_gel/orange + preview_name = "Orange" + new_icon_state = "medigel_orange" + +/datum/atom_skin/med_gel/purple + preview_name = "Purple" + new_icon_state = "medigel_purple" + /obj/item/reagent_containers/medigel name = "medical gel" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap." @@ -23,15 +51,11 @@ var/apply_method = "spray" //the thick gel is sprayed and then dries into patch like film. var/self_delay = 30 custom_price = PAYCHECK_CREW * 2 - unique_reskin = list( - "Blue" = "medigel_blue", - "Cyan" = "medigel_cyan", - "Green" = "medigel_green", - "Red" = "medigel_red", - "Orange" = "medigel_orange", - "Purple" = "medigel_purple" - ) +/obj/item/reagent_containers/medigel/Initialize(mapload) + . = ..() + if(icon_state == "medigel") // oh yeah baby raw icon state check to make sure we can't reskin preset gels + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/med_gel) /obj/item/reagent_containers/medigel/mode_change_message(mob/user) var/squirt_mode = amount_per_transfer_from_this == initial(amount_per_transfer_from_this) @@ -78,21 +102,18 @@ name = "medical gel (libital)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains libital, for treating cuts and bruises. Libital does minor liver damage. Diluted with granibitaluri." icon_state = "brutegel" - current_skin = "brutegel" list_reagents = list(/datum/reagent/medicine/c2/libital = 24, /datum/reagent/medicine/granibitaluri = 36) /obj/item/reagent_containers/medigel/aiuri name = "medical gel (aiuri)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains aiuri, useful for treating burns. Aiuri does minor eye damage. Diluted with granibitaluri." icon_state = "burngel" - current_skin = "burngel" list_reagents = list(/datum/reagent/medicine/c2/aiuri = 24, /datum/reagent/medicine/granibitaluri = 36) /obj/item/reagent_containers/medigel/synthflesh name = "medical gel (synthflesh)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, a slightly toxic medicine capable of healing bruises, burns, and husks." icon_state = "synthgel" - current_skin = "synthgel" list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 60) list_reagents_purity = 1 amount_per_transfer_from_this = 60 @@ -117,6 +138,5 @@ name = "sterilizer gel" desc = "gel bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." icon_state = "medigel_blue" - current_skin = "medigel_blue" list_reagents = list(/datum/reagent/space_cleaner/sterilizine = 60) custom_price = PAYCHECK_CREW * 2 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 869131dd5e8..4c4f0dbcbf9 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -420,6 +420,23 @@ . = ..() icon_state = pick("sprayer_sus_1", "sprayer_sus_2", "sprayer_sus_3", "sprayer_sus_4", "sprayer_sus_5","sprayer_sus_6", "sprayer_sus_7", "sprayer_sus_8") +// Spray bottle skins +/datum/atom_skin/med_spray + abstract_type = /datum/atom_skin/med_spray + change_inhand_icon_state = TRUE + +/datum/atom_skin/med_spray/red + preview_name = "Red" + new_icon_state = "sprayer_med_red" + +/datum/atom_skin/med_spray/yellow + preview_name = "Yellow" + new_icon_state = "sprayer_med_yellow" + +/datum/atom_skin/med_spray/blue + preview_name = "Blue" + new_icon_state = "sprayer_med_blue" + /obj/item/reagent_containers/spray/medical name = "medical spray bottle" icon = 'icons/obj/medical/chemical.dmi' @@ -428,20 +445,10 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' volume = 100 - unique_reskin = list("Red" = "sprayer_med_red", - "Yellow" = "sprayer_med_yellow", - "Blue" = "sprayer_med_blue") -/obj/item/reagent_containers/spray/medical/reskin_obj(mob/M) - ..() - switch(icon_state) - if("sprayer_med_red") - inhand_icon_state = "sprayer_med_red" - if("sprayer_med_yellow") - inhand_icon_state = "sprayer_med_yellow" - if("sprayer_med_blue") - inhand_icon_state = "sprayer_med_blue" - M.update_held_items() +/obj/item/reagent_containers/spray/medical/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/med_spray) /obj/item/reagent_containers/spray/hercuri name = "medical spray (hercuri)" diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index b0f9a9f3b7e..963ff89ceb6 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -270,6 +270,7 @@ #include "recycle_recycling.dm" #include "required_map_items.dm" #include "resist.dm" +#include "reskin_validation.dm" #include "reta_system.dm" #include "say.dm" #include "screenshot_airlocks.dm" diff --git a/code/modules/unit_tests/reskin_validation.dm b/code/modules/unit_tests/reskin_validation.dm new file mode 100644 index 00000000000..85e454058ce --- /dev/null +++ b/code/modules/unit_tests/reskin_validation.dm @@ -0,0 +1,15 @@ +/datum/unit_test/reskin_validation + +/datum/unit_test/reskin_validation/Run() + var/list/known_names = list() + for(var/datum/atom_skin/skin as anything in valid_subtypesof(/datum/atom_skin)) + if(isnull(skin::preview_name)) + TEST_FAIL("Reskin [skin] is missing a preview_name.") + // preview names are bundled by abstract types + else if(known_names["[skin::preview_name]-[skin::abstract_type]"]) + TEST_FAIL("Reskin [skin] has a duplicate preview_name [skin::preview_name].") + else + known_names["[skin::preview_name]-[skin::abstract_type]"] = TRUE + + if(skin::new_icon && skin::new_icon_state && !icon_exists(skin::new_icon, skin::new_icon_state)) + TEST_FAIL("Reskin [skin] has a new_icon_state [skin::new_icon_state] that does not exist in file [skin::new_icon].") diff --git a/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm b/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm index c0a614fb414..e52a51a1f5e 100644 --- a/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm +++ b/modular_skyrat/master_files/code/game/objects/items/holy_weapons.dm @@ -4,22 +4,50 @@ name = "crusader helmet" desc = "Helfen, Wehren, Heilen." icon_state = "knight_generic" - unique_reskin = list( - "Basic" = "knight_generic", - "Winged" = "knight_winged", - "Horned" = "knight_horned", - ) + +/obj/item/clothing/head/helmet/chaplain/bland/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/chaplain_helm) + +/datum/atom_skin/chaplain_helm + abstract_type = /datum/atom_skin/chaplain_helm + +/datum/atom_skin/chaplain_helm/basic + preview_name = "Basic" + new_icon_state = "knight_generic" + +/datum/atom_skin/chaplain_helm/winged + preview_name = "Winged" + new_icon_state = "knight_winged" + +/datum/atom_skin/chaplain_helm/horned + preview_name = "Horned" + new_icon_state = "knight_horned" /obj/item/clothing/suit/chaplainsuit/armor/templar/generic icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/chaplain.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/chaplain.dmi' desc = "Protect the weak and defenceless, live by honor and glory, and fight for the welfare of all!" icon_state = "knight_generic" - unique_reskin = list( - "Basic" = "knight_generic", - "Teutonic" = "knight_teutonic", - "Hospitaller" = "knight_hospitaller", - ) + +/obj/item/clothing/suit/chaplainsuit/armor/templar/generic/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/chaplain_armor) + +/datum/atom_skin/chaplain_armor + abstract_type = /datum/atom_skin/chaplain_armor + +/datum/atom_skin/chaplain_armor/basic + preview_name = "Basic" + new_icon_state = "knight_generic" + +/datum/atom_skin/chaplain_armor/teutonic + preview_name = "Teutonic" + new_icon_state = "knight_teutonic" + +/datum/atom_skin/chaplain_armor/hospitaller + preview_name = "Hospitaller" + new_icon_state = "knight_hospitaller" /obj/item/storage/box/holy/knight name = "knight's kit" diff --git a/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm b/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm index 1057ba78f94..c072be9d28a 100644 --- a/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm +++ b/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm @@ -105,19 +105,21 @@ desc = "A robust messenger bag for security related needs." icon_state = "messenger_security_black" inhand_icon_state = "messenger_security_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "messenger_security_black", - RESKIN_WORN_ICON_STATE = "messenger_security_black", - RESKIN_INHAND_STATE = "messenger_security_black", - ), - "White Variant" = list( - RESKIN_ICON_STATE = "messenger_security_white", - RESKIN_WORN_ICON_STATE = "messenger_security_white", - RESKIN_INHAND_STATE = "messenger_security_white", - ), - ) + +/obj/item/storage/backpack/messenger/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/sec_messenger) + +/datum/atom_skin/sec_messenger + abstract_type = /datum/atom_skin/sec_messenger + +/datum/atom_skin/sec_messenger/black + preview_name = "Black Variant" + new_icon_state = "messenger_security_black" + +/datum/atom_skin/sec_messenger/white + preview_name = "White Variant" + new_icon_state = "messenger_security_white" /obj/item/storage/backpack/messenger/explorer name = "explorer messenger bag" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/suits.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/suits.dm index 0a3f35ca836..9696a892d62 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/suits.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/suits.dm @@ -109,29 +109,65 @@ icon_state = "lucifer" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Pride" = "lucifer", - "Wrath" = "justice", - "Gluttony" = "malina", - "Envy" = "zdara", - "Vanity" = "cereberus", - ) + +/obj/item/clothing/under/suit/skyrat/inferno/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/inferno_suit) + +/datum/atom_skin/inferno_suit + abstract_type = /datum/atom_skin/inferno_suit + +/datum/atom_skin/inferno_suit/pride + preview_name = "Pride" + new_icon_state = "lucifer" + +/datum/atom_skin/inferno_suit/wrath + preview_name = "Wrath" + new_icon_state = "justice" + +/datum/atom_skin/inferno_suit/gluttony + preview_name = "Gluttony" + new_icon_state = "malina" + +/datum/atom_skin/inferno_suit/envy + preview_name = "Envy" + new_icon_state = "zdara" + +/datum/atom_skin/inferno_suit/vanity + preview_name = "Vanity" + new_icon_state = "cereberus" /obj/item/clothing/under/suit/skyrat/inferno/skirt name = "inferno suitskirt" icon_state = "modeus" obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Lust" = "modeus", - "Sloth" = "pande", - ) + +/obj/item/clothing/under/suit/skyrat/inferno/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/inferno_suitskirt) + +/datum/atom_skin/inferno_suitskirt + abstract_type = /datum/atom_skin/inferno_suitskirt + +/datum/atom_skin/inferno_suitskirt/lust + preview_name = "Lust" + new_icon_state = "modeus" + +/datum/atom_skin/inferno_suitskirt/sloth + preview_name = "Sloth" + new_icon_state = "pande" /obj/item/clothing/under/suit/skyrat/inferno/beeze name = "designer inferno suit" desc = "A fancy tail-coated suit with a fluffy bow emblazoned on the chest, complete with an NT pin." icon_state = "beeze" obj_flags = null - unique_reskin = null + +/obj/item/clothing/under/suit/skyrat/inferno/beeze/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/suit/skyrat/helltaker name = "red shirt with white pants" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm index 5ed33297162..8cae9eeaacb 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm @@ -22,24 +22,33 @@ icon_state = "util_sec" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION can_adjust = FALSE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "util_sec", - RESKIN_WORN_ICON_STATE = "util_sec" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "util_sec_old", - RESKIN_WORN_ICON_STATE = "util_sec_old" - ), - ) + +/obj/item/clothing/under/rank/security/skyrat/utility/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_utility) + +/datum/atom_skin/security_utility + abstract_type = /datum/atom_skin/security_utility + +/datum/atom_skin/security_utility/blue + preview_name = "Blue Variant" + new_icon_state = "util_sec" + +/datum/atom_skin/security_utility/red + preview_name = "Red Variant" + new_icon_state = "util_sec_old" /obj/item/clothing/under/rank/security/skyrat/utility/redsec desc = "A utility uniform worn by trained Security officers." icon_state = "util_sec_old" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION can_adjust = FALSE - unique_reskin = null + +/obj/item/clothing/under/rank/security/skyrat/utility/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/skyrat/utility/redsec/syndicate armor_type = /datum/armor/clothing_under/redsec_syndicate @@ -53,17 +62,21 @@ can_adjust = TRUE alt_covers_chest = FALSE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "security_skirt", - RESKIN_WORN_ICON_STATE = "security_skirt" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "security_skirt_red", - RESKIN_WORN_ICON_STATE = "security_skirt_red" - ), - ) + +/obj/item/clothing/under/rank/security/peacekeeper/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_skirt) + +/datum/atom_skin/security_peacekeeper_skirt + abstract_type = /datum/atom_skin/security_peacekeeper_skirt + +/datum/atom_skin/security_peacekeeper_skirt/blue + preview_name = "Blue Variant" + new_icon_state = "security_skirt" + +/datum/atom_skin/security_peacekeeper_skirt/red + preview_name = "Red Variant" + new_icon_state = "security_skirt_red" /obj/item/clothing/under/rank/security/peacekeeper/skirt_redsec name = "security battle dress" @@ -71,20 +84,30 @@ worn_icon_state = "security_skirt_redsec" icon_state = "security_skirt_redsec" can_adjust = TRUE - unique_reskin = null alt_covers_chest = FALSE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY +/obj/item/clothing/under/rank/security/peacekeeper/skirt_redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /obj/item/clothing/under/rank/security/peacekeeper/skirt_hos name = "head of security battle dress" desc = "An asymmetrical, unisex uniform with the legs replaced by a utility skirt. This version is specifically designed for the head of the security department!" worn_icon_state = "security_skirt_hos" icon_state = "security_skirt_hos" can_adjust = TRUE - unique_reskin = null alt_covers_chest = FALSE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY +/obj/item/clothing/under/rank/security/peacekeeper/skirt_hos/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /obj/item/clothing/under/rank/security/peacekeeper/trousers name = "security trousers" desc = "Some Peacekeeper-blue combat trousers. Probably should pair it with a vest for safety." @@ -95,53 +118,61 @@ can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION female_sprite_flags = FEMALE_UNIFORM_NO_BREASTS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "workpants_blue", - RESKIN_WORN_ICON_STATE = "workpants_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "workpants_white", - RESKIN_WORN_ICON_STATE = "workpants_white" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "workpants_red", - RESKIN_WORN_ICON_STATE = "workpants_red" - ), - ) + +/obj/item/clothing/under/rank/security/peacekeeper/trousers/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_trousers) + +/datum/atom_skin/security_peacekeeper_trousers + abstract_type = /datum/atom_skin/security_peacekeeper_trousers + +/datum/atom_skin/security_peacekeeper_trousers/blue + preview_name = "Blue Variant" + new_icon_state = "workpants_blue" + +/datum/atom_skin/security_peacekeeper_trousers/white + preview_name = "White Variant" + new_icon_state = "workpants_white" + +/datum/atom_skin/security_peacekeeper_trousers/red + preview_name = "Red Variant" + new_icon_state = "workpants_red" /obj/item/clothing/under/rank/security/peacekeeper/trousers/shorts name = "security shorts" desc = "Some Peacekeeper-blue combat shorts. Definitely should pair it with a vest for safety." icon_state = "workshorts_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant, Short" = list( - RESKIN_ICON_STATE = "workshorts_blue", - RESKIN_WORN_ICON_STATE = "workshorts_blue" - ), - "Blue Variant, Short Short" = list( - RESKIN_ICON_STATE = "workshorts_blue_short", - RESKIN_WORN_ICON_STATE = "workshorts_blue_short" - ), - "White Variant, Short" = list( - RESKIN_ICON_STATE = "workshorts_white", - RESKIN_WORN_ICON_STATE = "workshorts_white" - ), - "White Variant, Short Short" = list( - RESKIN_ICON_STATE = "workshorts_white_short", - RESKIN_WORN_ICON_STATE = "workshorts_white_short" - ), - "Red Variant, Short" = list( - RESKIN_ICON_STATE = "workshorts_red", - RESKIN_WORN_ICON_STATE = "workshorts_red" - ), - "Red Variant, Short Short" = list( - RESKIN_ICON_STATE = "workshorts_red_short", - RESKIN_WORN_ICON_STATE = "workshorts_red_short" - ), - ) + +/obj/item/clothing/under/rank/security/peacekeeper/trousers/shorts/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_shorts) + +/datum/atom_skin/security_peacekeeper_shorts + abstract_type = /datum/atom_skin/security_peacekeeper_shorts + +/datum/atom_skin/security_peacekeeper_shorts/blue_short + preview_name = "Blue Variant, Short" + new_icon_state = "workshorts_blue" + +/datum/atom_skin/security_peacekeeper_shorts/blue_short_short + preview_name = "Blue Variant, Short Short" + new_icon_state = "workshorts_blue_short" + +/datum/atom_skin/security_peacekeeper_shorts/white_short + preview_name = "White Variant, Short" + new_icon_state = "workshorts_white" + +/datum/atom_skin/security_peacekeeper_shorts/white_short_short + preview_name = "White Variant, Short Short" + new_icon_state = "workshorts_white_short" + +/datum/atom_skin/security_peacekeeper_shorts/red_short + preview_name = "Red Variant, Short" + new_icon_state = "workshorts_red" + +/datum/atom_skin/security_peacekeeper_shorts/red_short_short + preview_name = "Red Variant, Short Short" + new_icon_state = "workshorts_red_short" /obj/item/clothing/under/rank/security/peacekeeper/jumpsuit name = "security jumpsuit" @@ -150,17 +181,21 @@ can_adjust = TRUE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "jumpsuit_blue", - RESKIN_WORN_ICON_STATE = "jumpsuit_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "jumpsuit_red", - RESKIN_WORN_ICON_STATE = "jumpsuit_red" - ), - ) + +/obj/item/clothing/under/rank/security/peacekeeper/jumpsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_jumpsuit) + +/datum/atom_skin/security_peacekeeper_jumpsuit + abstract_type = /datum/atom_skin/security_peacekeeper_jumpsuit + +/datum/atom_skin/security_peacekeeper_jumpsuit/blue + preview_name = "Blue Variant" + new_icon_state = "jumpsuit_blue" + +/datum/atom_skin/security_peacekeeper_jumpsuit/red + preview_name = "Red Variant" + new_icon_state = "jumpsuit_red" /obj/item/clothing/under/rank/security/officer/skirt name = "security jumpskirt" @@ -178,17 +213,21 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY gets_cropped_on_taurs = FALSE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "shortskirt_blue", - RESKIN_WORN_ICON_STATE = "shortskirt_blue" - ), - "Black Variant" = list( - RESKIN_ICON_STATE = "shortskirt_black", - RESKIN_WORN_ICON_STATE = "shortskirt_black" - ), - ) + +/obj/item/clothing/under/rank/security/peacekeeper/shortskirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_shortskirt) + +/datum/atom_skin/security_peacekeeper_shortskirt + abstract_type = /datum/atom_skin/security_peacekeeper_shortskirt + +/datum/atom_skin/security_peacekeeper_shortskirt/blue + preview_name = "Blue Variant" + new_icon_state = "shortskirt_blue" + +/datum/atom_skin/security_peacekeeper_shortskirt/black + preview_name = "Black Variant" + new_icon_state = "shortskirt_black" /obj/item/clothing/under/rank/security/peacekeeper/miniskirt name = "security miniskirt" @@ -198,22 +237,25 @@ gets_cropped_on_taurs = FALSE can_adjust = TRUE body_parts_covered = GROIN | LEGS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "miniskirt", - RESKIN_WORN_ICON_STATE = "miniskirt" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "miniskirt_red", - RESKIN_WORN_ICON_STATE = "miniskirt_red" - ), - "Black Variant" = list( - RESKIN_ICON_STATE = "miniskirt_black", - RESKIN_WORN_ICON_STATE = "miniskirt_black" - ), - ) +/obj/item/clothing/under/rank/security/peacekeeper/miniskirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_peacekeeper_miniskirt) + +/datum/atom_skin/security_peacekeeper_miniskirt + abstract_type = /datum/atom_skin/security_peacekeeper_miniskirt + +/datum/atom_skin/security_peacekeeper_miniskirt/blue + preview_name = "Blue Variant" + new_icon_state = "miniskirt" + +/datum/atom_skin/security_peacekeeper_miniskirt/red + preview_name = "Red Variant" + new_icon_state = "miniskirt_red" + +/datum/atom_skin/security_peacekeeper_miniskirt/black + preview_name = "Black Variant" + new_icon_state = "miniskirt_black" /* * HEAD OF SECURITY diff --git a/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm b/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm index 3b17f1762c1..336dab6ecb6 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm @@ -33,17 +33,29 @@ has_sensor = HAS_SENSORS armor_type = /datum/armor/clothing_under supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - unique_reskin = list( - RESKIN_NT = "tactifool_blue", - RESKIN_CHARCOAL = "tactifool" - ) resistance_flags = FLAMMABLE -/obj/item/clothing/under/syndicate/tacticool/reskin_obj(mob/M) - ..() - if(current_skin && current_skin == RESKIN_CHARCOAL) - desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." //Default decription of the normal tacticool - inhand_icon_state = "bl_suit" //May as well, while we're updating it +/obj/item/clothing/under/syndicate/tacticool/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/tacticool_turtleneck) + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) + +/datum/atom_skin/tacticool_turtleneck + abstract_type = /datum/atom_skin/tacticool_turtleneck + +/datum/atom_skin/tacticool_turtleneck/nt + preview_name = RESKIN_NT + new_icon_state = "tactifool_blue" + +/datum/atom_skin/tacticool_turtleneck/charcoal + preview_name = RESKIN_CHARCOAL + new_icon_state = "tactifool" + +/obj/item/clothing/under/syndicate/tacticool/proc/on_reskin() + SIGNAL_HANDLER + if(icon_state == "tactifool") + desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." + inhand_icon_state = "bl_suit" /obj/item/clothing/under/syndicate/tacticool/skirt //Overwrites the 'fake' one. Zero armor, sensors, and default blue. More Balanced to make station-available. name = "tacticool skirtleneck" @@ -54,10 +66,21 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - unique_reskin = list( - RESKIN_NT = "tactifool_blue_skirt", - RESKIN_CHARCOAL = "tactifool_skirt" - ) + +/obj/item/clothing/under/syndicate/tacticool/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/tacticool_skirtleneck) + +/datum/atom_skin/tacticool_skirtleneck + abstract_type = /datum/atom_skin/tacticool_skirtleneck + +/datum/atom_skin/tacticool_skirtleneck/nt + preview_name = RESKIN_NT + new_icon_state = "tactifool_blue_skirt" + +/datum/atom_skin/tacticool_skirtleneck/charcoal + preview_name = RESKIN_CHARCOAL + new_icon_state = "tactifool_skirt" /obj/item/clothing/under/syndicate/bloodred/sleepytime/sensors //Halloween-only has_sensor = HAS_SENSORS @@ -83,15 +106,27 @@ alt_covers_chest = TRUE armor_type = /datum/armor/clothing_under/syndicate supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - unique_reskin = list( - RESKIN_SYNDIE = "syndicate_red", - RESKIN_CHARCOAL = "syndicate" - ) -/obj/item/clothing/under/syndicate/skyrat/tactical/reskin_obj(mob/M) - ..() - if(current_skin && current_skin == RESKIN_CHARCOAL) - desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants." //(Digital camo? Brown? What?) +/obj/item/clothing/under/syndicate/skyrat/tactical/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/tactical_turtleneck) + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) + +/datum/atom_skin/tactical_turtleneck + abstract_type = /datum/atom_skin/tactical_turtleneck + +/datum/atom_skin/tactical_turtleneck/syndie + preview_name = RESKIN_SYNDIE + new_icon_state = "syndicate_red" + +/datum/atom_skin/tactical_turtleneck/charcoal + preview_name = RESKIN_CHARCOAL + new_icon_state = "syndicate" + +/obj/item/clothing/under/syndicate/skyrat/tactical/proc/on_reskin() + SIGNAL_HANDLER + if(icon_state == "syndicate") + desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants." inhand_icon_state = "bl_suit" /obj/item/clothing/under/syndicate/skyrat/tactical/skirt @@ -102,14 +137,25 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - unique_reskin = list( - RESKIN_SYNDIE = "syndicate_red_skirt", - RESKIN_CHARCOAL = "syndicate_skirt" - ) -/obj/item/clothing/under/syndicate/skyrat/tactical/skirt/reskin_obj(mob/M) - ..() - if(current_skin && current_skin == RESKIN_CHARCOAL) +/obj/item/clothing/under/syndicate/skyrat/tactical/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/tactical_skirtleneck) + +/datum/atom_skin/tactical_skirtleneck + abstract_type = /datum/atom_skin/tactical_skirtleneck + +/datum/atom_skin/tactical_skirtleneck/syndie + preview_name = RESKIN_SYNDIE + new_icon_state = "syndicate_red_skirt" + +/datum/atom_skin/tactical_skirtleneck/charcoal + preview_name = RESKIN_CHARCOAL + new_icon_state = "syndicate_skirt" + +/obj/item/clothing/under/syndicate/skyrat/tactical/skirt/on_reskin() + . = ..() + if(icon_state == "syndicate_skirt") desc = "A non-descript and slightly suspicious looking skirtleneck." inhand_icon_state = "bl_suit" diff --git a/modular_skyrat/master_files/code/modules/loadout/categories/donator_personal.dm b/modular_skyrat/master_files/code/modules/loadout/categories/donator_personal.dm index e1421bcf2d6..f3a2cae73f7 100644 --- a/modular_skyrat/master_files/code/modules/loadout/categories/donator_personal.dm +++ b/modular_skyrat/master_files/code/modules/loadout/categories/donator_personal.dm @@ -98,19 +98,16 @@ /datum/loadout_item/head/caligram_cap_tan name = "Blacktide Tan Softcap" item_path = /obj/item/clothing/head/caligram_cap_tan - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN // ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") /datum/loadout_item/uniform/caligram_fatigues_tan name = "Blacktide Tan Fatigues" item_path = /obj/item/clothing/under/jumpsuit/caligram_fatigues_tan - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN // ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") /datum/loadout_item/suit/caligram_parka_tan name = "Blacktide Tan Coat" item_path = /obj/item/clothing/suit/jacket/caligram_parka_tan - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN // ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") /datum/loadout_item/suit/caligram_parka_vest_tan @@ -118,7 +115,6 @@ item_path = /obj/item/clothing/suit/armor/vest/caligram_parka_vest_tan // ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") restricted_roles = list(JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/suit/brasspriest name = "Brasspriest Coat" @@ -464,14 +460,12 @@ item_path = /obj/item/clothing/suit/armor/hos/elofy // ckeywhitelist = list("october23") restricted_roles = list(JOB_HEAD_OF_SECURITY) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/elofy name = "Solar Admiral Hat" item_path = /obj/item/clothing/head/hats/hos/elofy ckeywhitelist = list("october23") restricted_roles = list(JOB_HEAD_OF_SECURITY) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/pocket_items/transponder name = "Broken Helian Transponder" diff --git a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm index 267b795529c..98d8a2d2521 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm @@ -18,79 +18,80 @@ slowdown = 6 // The snail's shell is what's making them slow. obj_flags = IMMUTABLE_SLOW //This should hopefully solve other issues involing it as well. alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //This makes them layer over tails like the cult backpack; some tails really shouldn't appear over them! - uses_advanced_reskins = TRUE - unique_reskin = list( - "Conical Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "coneshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "coneshell" - ), - "Round Shell" = list( - RESKIN_ICON = 'icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "snailshell", - RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', - RESKIN_WORN_ICON_STATE = "snailshell" - ), - "Cinnamon Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "cinnamonshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "cinnamonshell" - ), - "Caramel Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "caramelshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "caramelshell" - ), - "Metal Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "mechashell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "mechashell" - ), - "Pyramid Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "pyramidshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "pyramidshell" - ), - "Ivory Pyramid Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "pyramidshellwhite", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "pyramidshellwhite" - ), - "Spiral Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "spiralshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "spiralshell" - ), - "Ivory Spiral Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "spiralshellwhite", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "spiralshellwhite" - ), - "Rocky Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "rockshell", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "rockshell" - ), - "Ivory Rocky Shell" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi', - RESKIN_ICON_STATE = "rockshellwhite", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "rockshellwhite" - ), - ) /obj/item/storage/backpack/snail/Initialize(mapload) . = ..() atom_storage.max_total_storage = 30 + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/snail_shell) + +/datum/atom_skin/snail_shell + abstract_type = /datum/atom_skin/snail_shell + +/datum/atom_skin/snail_shell/conical + preview_name = "Conical Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "coneshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/round + preview_name = "Round Shell" + new_icon = 'icons/obj/storage/backpack.dmi' + new_icon_state = "snailshell" + new_worn_icon = 'icons/mob/clothing/back/backpack.dmi' + +/datum/atom_skin/snail_shell/cinnamon + preview_name = "Cinnamon Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "cinnamonshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/caramel + preview_name = "Caramel Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "caramelshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/metal + preview_name = "Metal Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "mechashell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/pyramid + preview_name = "Pyramid Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "pyramidshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/pyramid_ivory + preview_name = "Ivory Pyramid Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "pyramidshellwhite" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/spiral + preview_name = "Spiral Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "spiralshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/spiral_ivory + preview_name = "Ivory Spiral Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "spiralshellwhite" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/rocky + preview_name = "Rocky Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "rockshell" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + +/datum/atom_skin/snail_shell/rocky_ivory + preview_name = "Ivory Rocky Shell" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + new_icon_state = "rockshellwhite" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' /obj/item/storage/backpack/snail/attackby(obj/item/core, mob/user) if(!istype(core, /obj/item/assembly/signaler/anomaly/bluespace)) diff --git a/modular_skyrat/modules/black_mesa/code/armor.dm b/modular_skyrat/modules/black_mesa/code/armor.dm index cfbd7afec2d..1f0f8255452 100644 --- a/modular_skyrat/modules/black_mesa/code/armor.dm +++ b/modular_skyrat/modules/black_mesa/code/armor.dm @@ -6,25 +6,29 @@ icon = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecucloth.dmi' worn_icon = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob.dmi' worn_icon_digi = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob_digi.dmi' - uses_advanced_reskins = TRUE - unique_reskin = list( - "Basic" = list( - RESKIN_ICON_STATE = "ceramic_vest", - RESKIN_WORN_ICON_STATE = "ceramic_vest" - ), - "Corpsman" = list( - RESKIN_ICON_STATE = "ceramic_vest_medic", - RESKIN_WORN_ICON_STATE = "ceramic_vest_medic" - ), - "Basic Black" = list( - RESKIN_ICON_STATE = "ceramic_vest_black", - RESKIN_WORN_ICON_STATE = "ceramic_vest_black" - ), - "Corpsman Black" = list( - RESKIN_ICON_STATE = "ceramic_vest_medic_black", - RESKIN_WORN_ICON_STATE = "ceramic_vest_medic_black" - ), - ) + +/obj/item/clothing/suit/armor/vest/hecu/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hecu_vest) + +/datum/atom_skin/hecu_vest + abstract_type = /datum/atom_skin/hecu_vest + +/datum/atom_skin/hecu_vest/basic + preview_name = "Basic" + new_icon_state = "ceramic_vest" + +/datum/atom_skin/hecu_vest/corpsman + preview_name = "Corpsman" + new_icon_state = "ceramic_vest_medic" + +/datum/atom_skin/hecu_vest/basic_black + preview_name = "Basic Black" + new_icon_state = "ceramic_vest_black" + +/datum/atom_skin/hecu_vest/corpsman_black + preview_name = "Corpsman Black" + new_icon_state = "ceramic_vest_medic_black" /datum/armor/vest_hecu melee = 40 @@ -44,25 +48,29 @@ icon = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecucloth.dmi' worn_icon = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob.dmi' worn_icon_digi = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob_muzzled.dmi' - uses_advanced_reskins = TRUE - unique_reskin = list( - "Basic" = list( - RESKIN_ICON_STATE = "ceramic_helmet", - RESKIN_WORN_ICON_STATE = "ceramic_helmet" - ), - "Corpsman" = list( - RESKIN_ICON_STATE = "ceramic_helmet_medic", - RESKIN_WORN_ICON_STATE = "ceramic_helmet_medic" - ), - "Basic Black" = list( - RESKIN_ICON_STATE = "ceramic_helmet_black", - RESKIN_WORN_ICON_STATE = "ceramic_helmet_black" - ), - "Corpsman Black" = list( - RESKIN_ICON_STATE = "ceramic_helmet_medic_black", - RESKIN_WORN_ICON_STATE = "ceramic_helmet_medic_black" - ), - ) + +/obj/item/clothing/head/helmet/hecu/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hecu_helmet) + +/datum/atom_skin/hecu_helmet + abstract_type = /datum/atom_skin/hecu_helmet + +/datum/atom_skin/hecu_helmet/basic + preview_name = "Basic" + new_icon_state = "ceramic_helmet" + +/datum/atom_skin/hecu_helmet/corpsman + preview_name = "Corpsman" + new_icon_state = "ceramic_helmet_medic" + +/datum/atom_skin/hecu_helmet/basic_black + preview_name = "Basic Black" + new_icon_state = "ceramic_helmet_black" + +/datum/atom_skin/hecu_helmet/corpsman_black + preview_name = "Corpsman Black" + new_icon_state = "ceramic_helmet_medic_black" /datum/armor/helmet_hecu melee = 30 diff --git a/modular_skyrat/modules/black_mesa/code/ghost_spawners.dm b/modular_skyrat/modules/black_mesa/code/ghost_spawners.dm index e856f22eb57..d13a66f10cb 100644 --- a/modular_skyrat/modules/black_mesa/code/ghost_spawners.dm +++ b/modular_skyrat/modules/black_mesa/code/ghost_spawners.dm @@ -95,8 +95,12 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/syndicate.dmi' icon_state = "urban_camo" inhand_icon_state = "w_suit" - uses_advanced_reskins = FALSE - unique_reskin = null + +/obj/item/clothing/under/rank/security/officer/hecu/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/backpack/ert/odst/hecu name = "hecu backpack" @@ -105,17 +109,21 @@ worn_icon_digi = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob_digi.dmi' icon_state = "hecu_pack" worn_icon_state = "hecu_pack" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Olive" = list( - RESKIN_ICON_STATE = "hecu_pack", - RESKIN_WORN_ICON_STATE = "hecu_pack" - ), - "Black" = list( - RESKIN_ICON_STATE = "hecu_pack_black", - RESKIN_WORN_ICON_STATE = "hecu_pack_black" - ), - ) + +/obj/item/storage/backpack/ert/odst/hecu/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hecu_backpack) + +/datum/atom_skin/hecu_backpack + abstract_type = /datum/atom_skin/hecu_backpack + +/datum/atom_skin/hecu_backpack/olive + preview_name = "Olive" + new_icon_state = "hecu_pack" + +/datum/atom_skin/hecu_backpack/black + preview_name = "Black" + new_icon_state = "hecu_pack_black" /obj/item/storage/belt/military/assault/hecu name = "hecu warbelt" @@ -124,17 +132,21 @@ worn_icon_digi = 'modular_skyrat/modules/awaymissions_skyrat/icons/hecumob_digi.dmi' icon_state = "hecu_belt" worn_icon_state = "hecu_belt" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Olive" = list( - RESKIN_ICON_STATE = "hecu_belt", - RESKIN_WORN_ICON_STATE = "hecu_belt" - ), - "Black" = list( - RESKIN_ICON_STATE = "hecu_belt_black", - RESKIN_WORN_ICON_STATE = "hecu_belt_black" - ), - ) + +/obj/item/storage/belt/military/assault/hecu/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hecu_warbelt) + +/datum/atom_skin/hecu_warbelt + abstract_type = /datum/atom_skin/hecu_warbelt + +/datum/atom_skin/hecu_warbelt/olive + preview_name = "Olive" + new_icon_state = "hecu_belt" + +/datum/atom_skin/hecu_warbelt/black + preview_name = "Black" + new_icon_state = "hecu_belt_black" /datum/outfit/hecu name = "HECU Grunt" diff --git a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_head.dm b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_head.dm index c8b6dd6e956..d9f04c01c82 100644 --- a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_head.dm +++ b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_head.dm @@ -5,74 +5,63 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' icon_state = "blastwave_helmet" flags_inv = HIDEHAIR - uses_advanced_reskins = TRUE - unique_reskin = list( - "Default (Purple)" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_helmet", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_helmet" - ), - "Red" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_helmet_r", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_helmet_r" - ), - "Green" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_helmet_g", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_helmet_g" - ), - "Blue" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_helmet_b", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_helmet_b" - ), - "Yellow" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_helmet_y", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_helmet_y" - ) - ) + +/obj/item/clothing/head/blastwave/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blastwave_helmet) + +/datum/atom_skin/blastwave_helmet + abstract_type = /datum/atom_skin/blastwave_helmet + +/datum/atom_skin/blastwave_helmet/default + preview_name = "Default (Purple)" + new_icon_state = "blastwave_helmet" + +/datum/atom_skin/blastwave_helmet/red + preview_name = "Red" + new_icon_state = "blastwave_helmet_r" + +/datum/atom_skin/blastwave_helmet/green + preview_name = "Green" + new_icon_state = "blastwave_helmet_g" + +/datum/atom_skin/blastwave_helmet/blue + preview_name = "Blue" + new_icon_state = "blastwave_helmet_b" + +/datum/atom_skin/blastwave_helmet/yellow + preview_name = "Yellow" + new_icon_state = "blastwave_helmet_y" /obj/item/clothing/head/blastwave/officer name = "blastwave peaked cap" desc = "A simple, militaristic cap." icon_state = "blastwave_offcap" flags_inv = 0 - unique_reskin = list( - "Default (Purple)" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_offcap", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_offcap" - ), - "Red" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_offcap_r", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_offcap_r" - ), - "Green" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_offcap_g", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_offcap_g" - ), - "Blue" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_offcap_b", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_offcap_b" - ), - "Yellow" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "blastwave_offcap_y", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_offcap_y" - ) - ) + +/obj/item/clothing/head/blastwave/officer/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blastwave_officer_cap) + +/datum/atom_skin/blastwave_officer_cap + abstract_type = /datum/atom_skin/blastwave_officer_cap + +/datum/atom_skin/blastwave_officer_cap/default + preview_name = "Default (Purple)" + new_icon_state = "blastwave_offcap" + +/datum/atom_skin/blastwave_officer_cap/red + preview_name = "Red" + new_icon_state = "blastwave_offcap_r" + +/datum/atom_skin/blastwave_officer_cap/green + preview_name = "Green" + new_icon_state = "blastwave_offcap_g" + +/datum/atom_skin/blastwave_officer_cap/blue + preview_name = "Blue" + new_icon_state = "blastwave_offcap_b" + +/datum/atom_skin/blastwave_officer_cap/yellow + preview_name = "Yellow" + new_icon_state = "blastwave_offcap_y" diff --git a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_suit.dm b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_suit.dm index 411767918ca..67727437ff7 100644 --- a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_suit.dm +++ b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_suit.dm @@ -6,36 +6,30 @@ worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi' icon_state = "blastwave_suit" body_parts_covered = CHEST|GROIN|LEGS|ARMS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Default (Purple)" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "blastwave_suit", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_suit" - ), - "Red" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "blastwave_suit_r", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_suit_r" - ), - "Green" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "blastwave_suit_g", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_suit_g" - ), - "Blue" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "blastwave_suit_b", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_suit_b" - ), - "Yellow" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "blastwave_suit_y", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_suit_y" - ) - ) + +/obj/item/clothing/suit/blastwave/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blastwave_trenchcoat) + +/datum/atom_skin/blastwave_trenchcoat + abstract_type = /datum/atom_skin/blastwave_trenchcoat + +/datum/atom_skin/blastwave_trenchcoat/default + preview_name = "Default (Purple)" + new_icon_state = "blastwave_suit" + +/datum/atom_skin/blastwave_trenchcoat/red + preview_name = "Red" + new_icon_state = "blastwave_suit_r" + +/datum/atom_skin/blastwave_trenchcoat/green + preview_name = "Green" + new_icon_state = "blastwave_suit_g" + +/datum/atom_skin/blastwave_trenchcoat/blue + preview_name = "Blue" + new_icon_state = "blastwave_suit_b" + +/datum/atom_skin/blastwave_trenchcoat/yellow + preview_name = "Yellow" + new_icon_state = "blastwave_suit_y" diff --git a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_uniform.dm b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_uniform.dm index 9bb18d94c07..628aef48733 100644 --- a/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_uniform.dm +++ b/modular_skyrat/modules/blastwave_outfits/code/clothing/blastwave_uniform.dm @@ -6,36 +6,30 @@ worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/uniform_digi.dmi' icon_state = "blastwave_uniform" can_adjust = FALSE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Default (Purple)" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/uniforms.dmi', - RESKIN_ICON_STATE = "blastwave_uniform", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/uniform.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_uniform" - ), - "Red" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/uniforms.dmi', - RESKIN_ICON_STATE = "blastwave_uniform_r", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/uniform.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_uniform_r" - ), - "Green" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/uniforms.dmi', - RESKIN_ICON_STATE = "blastwave_uniform_g", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/uniform.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_uniform_g" - ), - "Blue" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/uniforms.dmi', - RESKIN_ICON_STATE = "blastwave_uniform_b", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/uniform.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_uniform_b" - ), - "Yellow" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/uniforms.dmi', - RESKIN_ICON_STATE = "blastwave_uniform_y", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/uniform.dmi', - RESKIN_WORN_ICON_STATE = "blastwave_uniform_y" - ) - ) + +/obj/item/clothing/under/blastwave/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blastwave_uniform) + +/datum/atom_skin/blastwave_uniform + abstract_type = /datum/atom_skin/blastwave_uniform + +/datum/atom_skin/blastwave_uniform/default + preview_name = "Default (Purple)" + new_icon_state = "blastwave_uniform" + +/datum/atom_skin/blastwave_uniform/red + preview_name = "Red" + new_icon_state = "blastwave_uniform_r" + +/datum/atom_skin/blastwave_uniform/green + preview_name = "Green" + new_icon_state = "blastwave_uniform_g" + +/datum/atom_skin/blastwave_uniform/blue + preview_name = "Blue" + new_icon_state = "blastwave_uniform_b" + +/datum/atom_skin/blastwave_uniform/yellow + preview_name = "Yellow" + new_icon_state = "blastwave_uniform_y" diff --git a/modular_skyrat/modules/blueshield/code/clothing.dm b/modular_skyrat/modules/blueshield/code/clothing.dm index bcc9a14bbef..2a32407eaf2 100644 --- a/modular_skyrat/modules/blueshield/code/clothing.dm +++ b/modular_skyrat/modules/blueshield/code/clothing.dm @@ -124,27 +124,25 @@ icon_state = "blueshieldarmor" body_parts_covered = CHEST armor_type = /datum/armor/suit_armor/blueshield - uses_advanced_reskins = TRUE - unique_reskin = list( - "Slim" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "blueshieldarmor", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "blueshieldarmor", - ), - "Marine" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "bs_marine", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "bs_marine", - ), - "Bulky" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "vest_black", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "vest_black", - ), - ) + +/obj/item/clothing/suit/armor/vest/blueshield/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blueshield_armor) + +/datum/atom_skin/blueshield_armor + abstract_type = /datum/atom_skin/blueshield_armor + +/datum/atom_skin/blueshield_armor/slim + preview_name = "Slim" + new_icon_state = "blueshieldarmor" + +/datum/atom_skin/blueshield_armor/marine + preview_name = "Marine" + new_icon_state = "bs_marine" + +/datum/atom_skin/blueshield_armor/bulky + preview_name = "Bulky" + new_icon_state = "vest_black" /datum/armor/suit_armor/blueshield bomb = 30 @@ -156,11 +154,13 @@ desc = "An expensive kevlar-lined jacket with a golden badge on the chest and \"NT\" emblazoned on the back. It weighs surprisingly little, despite how heavy it looks." icon_state = "blueshield" body_parts_covered = CHEST|ARMS - unique_reskin = null /obj/item/clothing/suit/armor/vest/blueshield/jacket/Initialize(mapload) . = ..() AddComponent(/datum/component/toggle_icon) + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/suit/hooded/wintercoat/skyrat/blueshield name = "blueshield's winter coat" diff --git a/modular_skyrat/modules/clock_cult/code/items/weaponry.dm b/modular_skyrat/modules/clock_cult/code/items/weaponry.dm index 750788a9381..01c5bb08a1e 100644 --- a/modular_skyrat/modules/clock_cult/code/items/weaponry.dm +++ b/modular_skyrat/modules/clock_cult/code/items/weaponry.dm @@ -293,10 +293,14 @@ icon = 'modular_skyrat/modules/clock_cult/icons/weapons/ammo.dmi' icon_state = "762_brass" ammo_type = /obj/item/ammo_casing/strilka310/lionhunter/clock - unique_reskin = NONE max_ammo = 3 multiple_sprites = AMMO_BOX_PER_BULLET +/obj/item/ammo_box/speedloader/strilka310/lionhunter/clock/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/pouch/ammo/clock diff --git a/modular_skyrat/modules/curatorbundle/Mushy.dm b/modular_skyrat/modules/curatorbundle/Mushy.dm index ee9c688a3ef..333e9ccaa14 100644 --- a/modular_skyrat/modules/curatorbundle/Mushy.dm +++ b/modular_skyrat/modules/curatorbundle/Mushy.dm @@ -23,22 +23,22 @@ slowdown = 1 clothing_flags = THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Male Mush" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "mush_male", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "mush_male" - ), - "Female Mush" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "mush_female", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "mush_female" - ) - ) +/obj/item/clothing/suit/mush/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/mush_suit) + +/datum/atom_skin/mush_suit + abstract_type = /datum/atom_skin/mush_suit + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi' + +/datum/atom_skin/mush_suit/male + preview_name = "Male Mush" + new_icon_state = "mush_male" + +/datum/atom_skin/mush_suit/female + preview_name = "Female Mush" + new_icon_state = "mush_female" /obj/item/storage/box/hero/mushperson name = "Mushy The Mushperson - 2305" diff --git a/modular_skyrat/modules/customization/modules/clothing/glasses/hud.dm b/modular_skyrat/modules/customization/modules/clothing/glasses/hud.dm index 5b9aa47f47c..7c6e185af14 100644 --- a/modular_skyrat/modules/customization/modules/clothing/glasses/hud.dm +++ b/modular_skyrat/modules/customization/modules/clothing/glasses/hud.dm @@ -6,7 +6,6 @@ icon_state = "hudpatch" base_icon_state = "hudpatch" inhand_icon_state = "sunhudmed" - uses_advanced_reskins = TRUE can_switch_eye = TRUE //See modular_skyrat\modules\customization\modules\clothing\glasses\glasses.dm actions_types = list(/datum/action/item_action/flip) @@ -24,16 +23,20 @@ clothing_traits = list(TRAIT_MEDICAL_HUD) glass_colour_type = /datum/client_colour/glass_colour/lightblue - unique_reskin = list( - "Eyepatch" = list( - RESKIN_ICON_STATE = "medpatch", - RESKIN_WORN_ICON_STATE = "medpatch" - ), - "Fake Blindfold" = list( - RESKIN_ICON_STATE = "medfold", - RESKIN_WORN_ICON_STATE = "medfold" - ) - ) +/obj/item/clothing/glasses/hud/eyepatch/med/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/medpatch) + +/datum/atom_skin/medpatch + abstract_type = /datum/atom_skin/medpatch + +/datum/atom_skin/medpatch/eyepatch + preview_name = "Eyepatch" + new_icon_state = "medpatch" + +/datum/atom_skin/medpatch/fake_blindfold + preview_name = "Fake Blindfold" + new_icon_state = "medfold" /obj/item/clothing/glasses/hud/eyepatch/meson name = "mesons eyepatch HUD" @@ -46,16 +49,20 @@ lighting_cutoff = LIGHTING_CUTOFF_MEDIUM glass_colour_type = /datum/client_colour/glass_colour/lightgreen - unique_reskin = list( - "Eyepatch" = list( - RESKIN_ICON_STATE = "mesonpatch", - RESKIN_WORN_ICON_STATE = "mesonpatch" - ), - "Fake Blindfold" = list( - RESKIN_ICON_STATE = "mesonfold", - RESKIN_WORN_ICON_STATE = "mesonfold" - ) - ) +/obj/item/clothing/glasses/hud/eyepatch/meson/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/mesonpatch) + +/datum/atom_skin/mesonpatch + abstract_type = /datum/atom_skin/mesonpatch + +/datum/atom_skin/mesonpatch/eyepatch + preview_name = "Eyepatch" + new_icon_state = "mesonpatch" + +/datum/atom_skin/mesonpatch/fake_blindfold + preview_name = "Fake Blindfold" + new_icon_state = "mesonfold" /obj/item/clothing/glasses/hud/eyepatch/diagnostic name = "diagnostic eyepatch HUD" @@ -65,16 +72,20 @@ clothing_traits = list(TRAIT_DIAGNOSTIC_HUD) glass_colour_type = /datum/client_colour/glass_colour/lightorange - unique_reskin = list( - "Eyepatch" = list( - RESKIN_ICON_STATE = "robopatch", - RESKIN_WORN_ICON_STATE = "robopatch" - ), - "Fake Blindfold" = list( - RESKIN_ICON_STATE = "robofold", - RESKIN_WORN_ICON_STATE = "robofold" - ) - ) +/obj/item/clothing/glasses/hud/eyepatch/diagnostic/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/robopatch) + +/datum/atom_skin/robopatch + abstract_type = /datum/atom_skin/robopatch + +/datum/atom_skin/robopatch/eyepatch + preview_name = "Eyepatch" + new_icon_state = "robopatch" + +/datum/atom_skin/robopatch/fake_blindfold + preview_name = "Fake Blindfold" + new_icon_state = "robofold" /obj/item/clothing/glasses/hud/eyepatch/sci name = "science eyepatch HUD" @@ -83,17 +94,20 @@ base_icon_state = "scipatch" clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) - unique_reskin = list( - "Eyepatch" = list( - RESKIN_ICON_STATE = "scipatch", - RESKIN_WORN_ICON_STATE = "scipatch" - ), - "Fake Blindfold" = list( - RESKIN_ICON_STATE = "scifold", - RESKIN_WORN_ICON_STATE = "scifold" - ) - ) +/obj/item/clothing/glasses/hud/eyepatch/sci/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/scipatch) +/datum/atom_skin/scipatch + abstract_type = /datum/atom_skin/scipatch + +/datum/atom_skin/scipatch/eyepatch + preview_name = "Eyepatch" + new_icon_state = "scipatch" + +/datum/atom_skin/scipatch/fake_blindfold + preview_name = "Fake Blindfold" + new_icon_state = "scifold" /// BLINDFOLD HUDS /// /obj/item/clothing/glasses/trickblindfold/obsolete diff --git a/modular_skyrat/modules/customization/modules/clothing/masks/paper.dm b/modular_skyrat/modules/customization/modules/clothing/masks/paper.dm index 8f87da13da0..dcbd76207fb 100644 --- a/modular_skyrat/modules/customization/modules/clothing/masks/paper.dm +++ b/modular_skyrat/modules/customization/modules/clothing/masks/paper.dm @@ -10,7 +10,7 @@ if(trigger_flags & TRIGGER_SECONDARY_ACTION) paper_mask.adjust_mask(usr) else - paper_mask.reskin_obj(usr) + paper_mask.check_pen(usr) /obj/item/clothing/mask/paper name = "paper mask" @@ -23,33 +23,6 @@ interaction_flags_click = NEED_DEXTERITY w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust/papermask) - unique_reskin = list( - "Blank" = "mask_paper", - "Neutral" = "mask_neutral", - "Eye" = "mask_eye", - "Sleep" = "mask_sleep", - "Heart" = "mask_heart", - "Core" = "mask_core", - "Plus" = "mask_plus", - "Square" = "mask_square", - "Bullseye" = "mask_bullseye", - "Vertical" = "mask_vertical", - "Horizontal" = "mask_horizontal", - "X" = "mask_x", - "Bug" = "mask_bug", - "Double" = "mask_double", - "Mark" = "mask_mark", - "Line" = "mask_line", - "Minus" = "mask_minus", - "Four" = "mask_four", - "Diamond" = "mask_diamond", - "Cat" = "mask_cat", - "Big Eye" = "mask_bigeye", - "Good" = "mask_good", - "Bad" = "mask_bad", - "Happy" = "mask_happy", - "Sad" = "mask_sad", - ) /// Whether or not the mask is currently being layered over (or under!) hair. FALSE/null means the mask is layered over the hair (this is how it starts off). var/wear_hair_over @@ -60,6 +33,112 @@ . = ..() if(wear_hair_over) alternate_worn_layer = BACK_LAYER + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/paper_mask, infinite = TRUE) + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(check_pen)) + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) + +/datum/atom_skin/paper_mask + abstract_type = /datum/atom_skin/paper_mask + +/datum/atom_skin/paper_mask/blank + preview_name = "Blank" + new_icon_state = "mask_paper" + +/datum/atom_skin/paper_mask/neutral + preview_name = "Neutral" + new_icon_state = "mask_neutral" + +/datum/atom_skin/paper_mask/eye + preview_name = "Eye" + new_icon_state = "mask_eye" + +/datum/atom_skin/paper_mask/sleepy + preview_name = "Sleep" + new_icon_state = "mask_sleep" + +/datum/atom_skin/paper_mask/heart + preview_name = "Heart" + new_icon_state = "mask_heart" + +/datum/atom_skin/paper_mask/core + preview_name = "Core" + new_icon_state = "mask_core" + +/datum/atom_skin/paper_mask/plus + preview_name = "Plus" + new_icon_state = "mask_plus" + +/datum/atom_skin/paper_mask/square + preview_name = "Square" + new_icon_state = "mask_square" + +/datum/atom_skin/paper_mask/bullseye + preview_name = "Bullseye" + new_icon_state = "mask_bullseye" + +/datum/atom_skin/paper_mask/vertical + preview_name = "Vertical" + new_icon_state = "mask_vertical" + +/datum/atom_skin/paper_mask/horizontal + preview_name = "Horizontal" + new_icon_state = "mask_horizontal" + +/datum/atom_skin/paper_mask/x + preview_name = "X" + new_icon_state = "mask_x" + +/datum/atom_skin/paper_mask/bug + preview_name = "Bug" + new_icon_state = "mask_bug" + +/datum/atom_skin/paper_mask/double + preview_name = "Double" + new_icon_state = "mask_double" + +/datum/atom_skin/paper_mask/mark + preview_name = "Mark" + new_icon_state = "mask_mark" + +/datum/atom_skin/paper_mask/line + preview_name = "Line" + new_icon_state = "mask_line" + +/datum/atom_skin/paper_mask/minus + preview_name = "Minus" + new_icon_state = "mask_minus" + +/datum/atom_skin/paper_mask/four + preview_name = "Four" + new_icon_state = "mask_four" + +/datum/atom_skin/paper_mask/diamond + preview_name = "Diamond" + new_icon_state = "mask_diamond" + +/datum/atom_skin/paper_mask/cat + preview_name = "Cat" + new_icon_state = "mask_cat" + +/datum/atom_skin/paper_mask/big_eye + preview_name = "Big Eye" + new_icon_state = "mask_bigeye" + +/datum/atom_skin/paper_mask/good + preview_name = "Good" + new_icon_state = "mask_good" + +/datum/atom_skin/paper_mask/bad + preview_name = "Bad" + new_icon_state = "mask_bad" + +/datum/atom_skin/paper_mask/happy + preview_name = "Happy" + new_icon_state = "mask_happy" + +/datum/atom_skin/paper_mask/sad + preview_name = "Sad" + new_icon_state = "mask_sad" /obj/item/clothing/mask/paper/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() @@ -83,21 +162,21 @@ context[SCREENTIP_CONTEXT_CTRL_LMB] = "Hide/Show Strap" return CONTEXTUAL_SCREENTIP_SET -/obj/item/clothing/mask/paper/reskin_obj(mob/user) +/obj/item/clothing/mask/paper/proc/check_pen(datum/source, mob/user) + SIGNAL_HANDLER if(!user.is_holding_item_of_type(/obj/item/pen)) balloon_alert(user, "must be holding a pen!") - return - - . = ..() + return CLICK_ACTION_BLOCKING + return NONE +/obj/item/clothing/mask/paper/proc/on_reskin(datum/source, skin_name) + SIGNAL_HANDLER var/mob/living/carbon/carbon_user - if(iscarbon(user)) - carbon_user = user + if(ismob(loc) && iscarbon(loc)) + carbon_user = loc if(carbon_user && carbon_user.wear_mask == src) carbon_user.update_worn_mask() - current_skin = null //so we can infinitely reskin - /obj/item/clothing/mask/paper/proc/adjust_mask(mob/living/carbon/human/user) if(!istype(user)) return diff --git a/modular_skyrat/modules/customization/modules/clothing/neck/_neck.dm b/modular_skyrat/modules/customization/modules/clothing/neck/_neck.dm index a4236970e59..3d428b07479 100644 --- a/modular_skyrat/modules/customization/modules/clothing/neck/_neck.dm +++ b/modular_skyrat/modules/customization/modules/clothing/neck/_neck.dm @@ -46,17 +46,21 @@ name = "\proper the head of security's mantle" desc = "A plated mantle that one might wrap around the upper torso. The 'scales' of the garment signify the members of security and how you're carrying them on your shoulders." icon_state = "hosmantle" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "hosmantle", - RESKIN_WORN_ICON_STATE = "hosmantle" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "hosmantle_blue", - RESKIN_WORN_ICON_STATE = "hosmantle_blue" - ), - ) + +/obj/item/clothing/neck/mantle/hosmantle/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_mantle) + +/datum/atom_skin/hos_mantle + abstract_type = /datum/atom_skin/hos_mantle + +/datum/atom_skin/hos_mantle/red + preview_name = "Red Variant" + new_icon_state = "hosmantle" + +/datum/atom_skin/hos_mantle/blue + preview_name = "Blue Variant" + new_icon_state = "hosmantle_blue" /obj/item/clothing/neck/mantle/bsmantle name = "\proper the blueshield's mantle" diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/armor.dm b/modular_skyrat/modules/customization/modules/clothing/suits/armor.dm index 09a742f5e6d..a61469563db 100644 --- a/modular_skyrat/modules/customization/modules/clothing/suits/armor.dm +++ b/modular_skyrat/modules/customization/modules/clothing/suits/armor.dm @@ -7,9 +7,14 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' icon_state = "warden_syndie" - current_skin = "warden_syndie" //prevents reskinning supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION +/obj/item/clothing/suit/armor/vest/warden/syndicate/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + // HEAD OF PERSONNEL /obj/item/clothing/suit/armor/vest/hop/hop_formal name = "head of personnel's parade jacket" diff --git a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm index f0092327cad..e84f771e6af 100644 --- a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm +++ b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm @@ -304,17 +304,21 @@ icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi' icon_state = "caligram_cap_tan" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Tan Variant" = list( - RESKIN_ICON_STATE = "caligram_cap_tan", - RESKIN_WORN_ICON_STATE = "caligram_cap_tan" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "caligram_cap_blue", - RESKIN_WORN_ICON_STATE = "caligram_cap_blue" - ) - ) + +/obj/item/clothing/head/caligram_cap_tan/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/caligram_cap) + +/datum/atom_skin/caligram_cap + abstract_type = /datum/atom_skin/caligram_cap + +/datum/atom_skin/caligram_cap/tan + preview_name = "Tan Variant" + new_icon_state = "caligram_cap_tan" + +/datum/atom_skin/caligram_cap/blue + preview_name = "Blue Variant" + new_icon_state = "caligram_cap_blue" // Donation reward for Raxraus /obj/item/clothing/under/jumpsuit/caligram_fatigues_tan @@ -325,17 +329,21 @@ worn_icon_digi = 'modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi' icon_state = "caligram_fatigues_tan" worn_icon_state = "caligram_fatigues_tan" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Tan Variant" = list( - RESKIN_ICON_STATE = "caligram_fatigues_tan", - RESKIN_WORN_ICON_STATE = "caligram_fatigues_tan" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "caligram_fatigues_blue", - RESKIN_WORN_ICON_STATE = "caligram_fatigues_blue" - ) - ) + +/obj/item/clothing/under/jumpsuit/caligram_fatigues_tan/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/caligram_fatigues) + +/datum/atom_skin/caligram_fatigues + abstract_type = /datum/atom_skin/caligram_fatigues + +/datum/atom_skin/caligram_fatigues/tan + preview_name = "Tan Variant" + new_icon_state = "caligram_fatigues_tan" + +/datum/atom_skin/caligram_fatigues/blue + preview_name = "Blue Variant" + new_icon_state = "caligram_fatigues_blue" // Donation reward for Raxraus /obj/item/clothing/suit/jacket/caligram_parka_tan @@ -346,21 +354,25 @@ icon_state = "caligram_parka_tan" body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|LEGS|ARMS|HANDS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Tan Variant" = list( - RESKIN_ICON_STATE = "caligram_parka_tan", - RESKIN_WORN_ICON_STATE = "caligram_parka_tan" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "caligram_parka_blue", - RESKIN_WORN_ICON_STATE = "caligram_parka_blue" - ), - "Blue Patchless Variant" = list( - RESKIN_ICON_STATE = "caligram_parka_patchless_blue", - RESKIN_WORN_ICON_STATE = "caligram_parka_patchless_blue" - ) - ) + +/obj/item/clothing/suit/jacket/caligram_parka_tan/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/caligram_parka) + +/datum/atom_skin/caligram_parka + abstract_type = /datum/atom_skin/caligram_parka + +/datum/atom_skin/caligram_parka/tan + preview_name = "Tan Variant" + new_icon_state = "caligram_parka_tan" + +/datum/atom_skin/caligram_parka/blue + preview_name = "Blue Variant" + new_icon_state = "caligram_parka_blue" + +/datum/atom_skin/caligram_parka/blue_patchless + preview_name = "Blue Patchless Variant" + new_icon_state = "caligram_parka_patchless_blue" // Donation reward for Raxraus /obj/item/clothing/suit/armor/vest/caligram_parka_vest_tan @@ -372,17 +384,21 @@ inhand_icon_state = "armor" body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|LEGS|ARMS|HANDS - uses_advanced_reskins = TRUE - unique_reskin = list( - "Tan Variant" = list( - RESKIN_ICON_STATE = "caligram_parka_vest_tan", - RESKIN_WORN_ICON_STATE = "caligram_parka_vest_tan" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "caligram_parka_vest_blue", - RESKIN_WORN_ICON_STATE = "caligram_parka_vest_blue" - ) - ) + +/obj/item/clothing/suit/armor/vest/caligram_parka_vest_tan/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/caligram_parka_vest) + +/datum/atom_skin/caligram_parka_vest + abstract_type = /datum/atom_skin/caligram_parka_vest + +/datum/atom_skin/caligram_parka_vest/tan + preview_name = "Tan Variant" + new_icon_state = "caligram_parka_vest_tan" + +/datum/atom_skin/caligram_parka_vest/blue + preview_name = "Blue Variant" + new_icon_state = "caligram_parka_vest_blue" // Donation reward for ChillyLobster /obj/item/clothing/suit/jacket/brasspriest @@ -581,7 +597,6 @@ icon_state = "silver_dress_boots" worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/feet.dmi' supports_variations_flags = NONE - uses_advanced_reskins = FALSE /****************LEGACY REWARDS***************/ @@ -1649,25 +1664,29 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/korpstech, 32) body_parts_covered = CHEST|GROIN|LEGS|ARMS cold_protection = CHEST|GROIN|LEGS|ARMS supports_variations_flags = NONE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black-Blue" = list( - RESKIN_ICON_STATE = "coat_blackblue", - RESKIN_WORN_ICON_STATE = "coat_blackblue" - ), - "Black-Red" = list( - RESKIN_ICON_STATE = "coat_blackred", - RESKIN_WORN_ICON_STATE = "coat_blackred" - ), - "White-Red" = list( - RESKIN_ICON_STATE = "coat_whitered", - RESKIN_WORN_ICON_STATE = "coat_whitered" - ), - "White-Blue" = list( - RESKIN_ICON_STATE = "coat_whiteblue", - RESKIN_WORN_ICON_STATE = "coat_whiteblue" - ) - ) + +/obj/item/clothing/suit/armor/hos/elofy/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/anime_coat) + +/datum/atom_skin/anime_coat + abstract_type = /datum/atom_skin/anime_coat + +/datum/atom_skin/anime_coat/black_blue + preview_name = "Black-Blue" + new_icon_state = "coat_blackblue" + +/datum/atom_skin/anime_coat/black_red + preview_name = "Black-Red" + new_icon_state = "coat_blackred" + +/datum/atom_skin/anime_coat/white_red + preview_name = "White-Red" + new_icon_state = "coat_whitered" + +/datum/atom_skin/anime_coat/white_blue + preview_name = "White-Blue" + new_icon_state = "coat_whiteblue" /obj/item/clothing/suit/armor/hos/elofy/examine_more(mob/user) . = ..() @@ -1683,18 +1702,21 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/korpstech, 32) icon ='modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi' icon_state = "hat_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "White" = list( - RESKIN_ICON_STATE = "hat_white", - RESKIN_WORN_ICON_STATE = "hat_white" - ), - "Black" = list( - RESKIN_ICON_STATE = "hat_black", - RESKIN_WORN_ICON_STATE = "hat_black" - ) - ) +/obj/item/clothing/head/hats/hos/elofy/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/anime_hat) + +/datum/atom_skin/anime_hat + abstract_type = /datum/atom_skin/anime_hat + +/datum/atom_skin/anime_hat/white + preview_name = "White" + new_icon_state = "hat_white" + +/datum/atom_skin/anime_hat/black + preview_name = "Black" + new_icon_state = "hat_black" /obj/item/clothing/gloves/elofy name = "anime admiral gloves" @@ -1705,17 +1727,21 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/korpstech, 32) icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/gloves.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/hands.dmi' icon_state = "gloves_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "White" = list( - RESKIN_ICON_STATE = "gloves_white", - RESKIN_WORN_ICON_STATE = "gloves_white" - ), - "Black" = list( - RESKIN_ICON_STATE = "gloves_black", - RESKIN_WORN_ICON_STATE = "gloves_black" - ) - ) + +/obj/item/clothing/gloves/elofy/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/anime_gloves) + +/datum/atom_skin/anime_gloves + abstract_type = /datum/atom_skin/anime_gloves + +/datum/atom_skin/anime_gloves/white + preview_name = "White" + new_icon_state = "gloves_white" + +/datum/atom_skin/anime_gloves/black + preview_name = "Black" + new_icon_state = "gloves_black" /obj/item/clothing/shoes/jackboots/elofy name = "anime admiral boots" @@ -1726,21 +1752,25 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/korpstech, 32) icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/shoes.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/feet.dmi' icon_state = "boots_blackblue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black-Red" = list( - RESKIN_ICON_STATE = "boots_blackred", - RESKIN_WORN_ICON_STATE = "boots_blackred" - ), - "White-Red" = list( - RESKIN_ICON_STATE = "boots_whitered", - RESKIN_WORN_ICON_STATE = "boots_whitered" - ), - "White-Blue" = list( - RESKIN_ICON_STATE = "boots_whiteblue", - RESKIN_WORN_ICON_STATE = "boots_whiteblue" - ) - ) + +/obj/item/clothing/shoes/jackboots/elofy/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/anime_boots) + +/datum/atom_skin/anime_boots + abstract_type = /datum/atom_skin/anime_boots + +/datum/atom_skin/anime_boots/black_red + preview_name = "Black-Red" + new_icon_state = "boots_blackred" + +/datum/atom_skin/anime_boots/white_red + preview_name = "White-Red" + new_icon_state = "boots_whitered" + +/datum/atom_skin/anime_boots/white_blue + preview_name = "White-Blue" + new_icon_state = "boots_whiteblue" // Donation reward for grasshand /obj/item/clothing/under/rank/civilian/chaplain/divine_archer/noble diff --git a/modular_skyrat/modules/exp_corps/code/clothing.dm b/modular_skyrat/modules/exp_corps/code/clothing.dm index f1a0196d199..cfd067611f1 100644 --- a/modular_skyrat/modules/exp_corps/code/clothing.dm +++ b/modular_skyrat/modules/exp_corps/code/clothing.dm @@ -21,17 +21,21 @@ worn_icon_state = "webbing_exp_corps" icon = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' - uses_advanced_reskins = TRUE - unique_reskin = list( - "Webbing" = list( - RESKIN_ICON_STATE = "webbing_exp_corps", - RESKIN_WORN_ICON_STATE = "webbing_exp_corps" - ), - "Belt" = list( - RESKIN_ICON_STATE = "belt_exp_corps", - RESKIN_WORN_ICON_STATE = "belt_exp_corps" - ), - ) + +/obj/item/storage/belt/military/expeditionary_corps/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/exp_corps_webbing) + +/datum/atom_skin/exp_corps_webbing + abstract_type = /datum/atom_skin/exp_corps_webbing + +/datum/atom_skin/exp_corps_webbing/webbing + preview_name = "Webbing" + new_icon_state = "webbing_exp_corps" + +/datum/atom_skin/exp_corps_webbing/belt + preview_name = "Belt" + new_icon_state = "belt_exp_corps" /obj/item/storage/belt/military/expeditionary_corps/combat_tech name = "combat tech's chest rig" @@ -134,17 +138,21 @@ inhand_icon_state = "backpack" icon = 'modular_skyrat/modules/exp_corps/icons/backpack.dmi' worn_icon = 'modular_skyrat/modules/exp_corps/icons/mob_backpack.dmi' - uses_advanced_reskins = TRUE - unique_reskin = list( - "Backpack" = list( - RESKIN_ICON_STATE = "exp_corps", - RESKIN_WORN_ICON_STATE = "exp_corps" - ), - "Belt" = list( - RESKIN_ICON_STATE = "exp_corps_satchel", - RESKIN_WORN_ICON_STATE = "exp_corps_satchel" - ), - ) + +/obj/item/storage/backpack/duffelbag/expeditionary_corps/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/exp_corps_bag) + +/datum/atom_skin/exp_corps_bag + abstract_type = /datum/atom_skin/exp_corps_bag + +/datum/atom_skin/exp_corps_bag/backpack + preview_name = "Backpack" + new_icon_state = "exp_corps" + +/datum/atom_skin/exp_corps_bag/belt + preview_name = "Belt" + new_icon_state = "exp_corps_satchel" /obj/item/clothing/suit/armor/vest/expeditionary_corps name = "expeditionary corps armor vest" diff --git a/modular_skyrat/modules/exp_corps/code/gear.dm b/modular_skyrat/modules/exp_corps/code/gear.dm index 1451b5d1556..525fbe13d79 100644 --- a/modular_skyrat/modules/exp_corps/code/gear.dm +++ b/modular_skyrat/modules/exp_corps/code/gear.dm @@ -94,10 +94,12 @@ /obj/item/storage/pouch/ammo/marksman name = "marksman's knife pouch" - unique_reskin = NONE /obj/item/storage/pouch/ammo/marksman/Initialize(mapload) . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) create_storage(storage_type = /datum/storage/marksman) /datum/storage/marksman diff --git a/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm b/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm index 066ed010d40..d294c0cb1bc 100644 --- a/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm +++ b/modular_skyrat/modules/gladiator/code/game/objects/items/gladiator_items.dm @@ -34,7 +34,6 @@ worn_icon = 'modular_skyrat/modules/gladiator/icons/berserk_suit.dmi' icon_state = "berk_cape" inhand_icon_state = "" //lul - uses_advanced_reskins = FALSE resistance_flags = INDESTRUCTIBLE /obj/item/clothing/neck/warrior_cape/loadout //Subtype for loadout item so i can make it not "indestructible" diff --git a/modular_skyrat/modules/goofsec/code/department_guards.dm b/modular_skyrat/modules/goofsec/code/department_guards.dm index 661df827c21..cd22b5fbf00 100644 --- a/modular_skyrat/modules/goofsec/code/department_guards.dm +++ b/modular_skyrat/modules/goofsec/code/department_guards.dm @@ -9,7 +9,12 @@ /obj/item/clothing/under/rank/security/officer/blueshirt/skyrat //Effectively the same as TG's blueshirt, including icon. The /skyrat path makes it easier for sorting. name = "science guard's uniform" - unique_reskin = null + +/obj/item/clothing/under/rank/security/officer/blueshirt/skyrat/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/officer/blueshirt/skyrat/orderly name = "orderly uniform" @@ -54,9 +59,14 @@ //Effectively the same as TG's blueshirt, including icon. The /skyrat path makes it easier for sorting. icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' - unique_reskin = null supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON +/obj/item/clothing/suit/armor/vest/blueshirt/skyrat/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /obj/item/clothing/suit/armor/vest/blueshirt/skyrat/guard //Badge-less version of the blueshirt vest icon_state = "guard_armor" worn_icon_state = "guard_armor" @@ -87,7 +97,12 @@ /obj/item/clothing/head/helmet/blueshirt/skyrat //Effectively the same as TG's blueshirt, including icon. The /skyrat path makes it easier for sorting. //The base one is used for science guards, and the sprite is unchanged - unique_reskin = null + +/obj/item/clothing/head/helmet/blueshirt/skyrat/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/head/helmet/blueshirt/skyrat/guard //Version of the blueshirt helmet without a blue line. Used by all dept guards right now. icon = 'modular_skyrat/master_files/icons/obj/clothing/head/helmet.dmi' diff --git a/modular_skyrat/modules/hev_suit/code/hev_suit.dm b/modular_skyrat/modules/hev_suit/code/hev_suit.dm index 4603328ac95..1224307292d 100644 --- a/modular_skyrat/modules/hev_suit/code/hev_suit.dm +++ b/modular_skyrat/modules/hev_suit/code/hev_suit.dm @@ -718,25 +718,29 @@ visor_flags_inv = null visor_flags = null slowdown = 0 - uses_advanced_reskins = TRUE - unique_reskin = list( - "Basic" = list( - RESKIN_ICON_STATE = "hecu_helm", - RESKIN_WORN_ICON_STATE = "hecu_helm" - ), - "Corpsman" = list( - RESKIN_ICON_STATE = "hecu_helm_medic", - RESKIN_WORN_ICON_STATE = "hecu_helm_medic" - ), - "Basic Black" = list( - RESKIN_ICON_STATE = "hecu_helm_black", - RESKIN_WORN_ICON_STATE = "hecu_helm_black" - ), - "Corpsman Black" = list( - RESKIN_ICON_STATE = "hecu_helm_medic_black", - RESKIN_WORN_ICON_STATE = "hecu_helm_medic_black" - ), - ) + +/obj/item/clothing/head/helmet/space/hev_suit/pcv/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pcv_helmet) + +/datum/atom_skin/pcv_helmet + abstract_type = /datum/atom_skin/pcv_helmet + +/datum/atom_skin/pcv_helmet/basic + preview_name = "Basic" + new_icon_state = "hecu_helm" + +/datum/atom_skin/pcv_helmet/corpsman + preview_name = "Corpsman" + new_icon_state = "hecu_helm_medic" + +/datum/atom_skin/pcv_helmet/basic_black + preview_name = "Basic Black" + new_icon_state = "hecu_helm_black" + +/datum/atom_skin/pcv_helmet/corpsman_black + preview_name = "Corpsman Black" + new_icon_state = "hecu_helm_medic_black" /datum/armor/hev_suit_pcv melee = 30 @@ -777,25 +781,6 @@ resistance_flags = FIRE_PROOF|ACID_PROOF|FREEZE_PROOF clothing_flags = SNUG_FIT show_hud = FALSE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Basic" = list( - RESKIN_ICON_STATE = "hecu_vest", - RESKIN_WORN_ICON_STATE = "hecu_vest" - ), - "Corpsman" = list( - RESKIN_ICON_STATE = "hecu_vest_medic", - RESKIN_WORN_ICON_STATE = "hecu_vest_medic" - ), - "Basic Black" = list( - RESKIN_ICON_STATE = "hecu_vest_black", - RESKIN_WORN_ICON_STATE = "hecu_vest_black" - ), - "Corpsman Black" = list( - RESKIN_ICON_STATE = "hecu_vest_medic_black", - RESKIN_WORN_ICON_STATE = "hecu_vest_medic_black" - ), - ) activation_song = null // removal of song only standard suit will have the song @@ -843,9 +828,35 @@ acid_static_cooldown = PCV_COOLDOWN_ACID suit_name = "PCV MARK II" +/obj/item/clothing/suit/space/hev_suit/pcv/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pcv_vest) + +/datum/atom_skin/pcv_vest + abstract_type = /datum/atom_skin/pcv_vest + +/datum/atom_skin/pcv_vest/basic + preview_name = "Basic" + new_icon_state = "hecu_vest" + +/datum/atom_skin/pcv_vest/corpsman + preview_name = "Corpsman" + new_icon_state = "hecu_vest_medic" + +/datum/atom_skin/pcv_vest/basic_black + preview_name = "Basic Black" + new_icon_state = "hecu_vest_black" + +/datum/atom_skin/pcv_vest/corpsman_black + preview_name = "Corpsman Black" + new_icon_state = "hecu_vest_medic_black" + /obj/item/clothing/suit/space/hev_suit/pcv/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if(!current_skin) + var/datum/component/reskinable_item/reskin_component = GetComponent(/datum/component/reskinable_item) + if(!reskin_component) + return + if(!reskin_component.has_skin()) context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin" return CONTEXTUAL_SCREENTIP_SET diff --git a/modular_skyrat/modules/hyposprays/code/hypovials.dm b/modular_skyrat/modules/hyposprays/code/hypovials.dm index c57fa945fd0..7bd8de42f18 100644 --- a/modular_skyrat/modules/hyposprays/code/hypovials.dm +++ b/modular_skyrat/modules/hyposprays/code/hypovials.dm @@ -13,19 +13,50 @@ var/chem_color = "#FFFFFF" //Used for hypospray overlay var/type_suffix = "-s" fill_icon = 'modular_skyrat/modules/hyposprays/icons/hypospray_fillings.dmi' - current_skin = "hypovial" - unique_reskin = list( - "Sterile" = "hypovial", - "Generic" = "hypovial-generic", - "Brute" = "hypovial-brute", - "Burn" = "hypovial-burn", - "Toxin" = "hypovial-tox", - "Oxyloss" = "hypovial-oxy", - "Crit" = "hypovial-crit", - "Buff" = "hypovial-buff", - "Custom" = "hypovial-custom", - ) +/obj/item/reagent_containers/cup/vial/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hypovial) + +/datum/atom_skin/hypovial + abstract_type = /datum/atom_skin/hypovial + +/datum/atom_skin/hypovial/sterile + preview_name = "Sterile" + new_icon_state = "hypovial" + +/datum/atom_skin/hypovial/generic + preview_name = "Generic" + new_icon_state = "hypovial-generic" + +/datum/atom_skin/hypovial/brute + preview_name = "Brute" + new_icon_state = "hypovial-brute" + +/datum/atom_skin/hypovial/burn + preview_name = "Burn" + new_icon_state = "hypovial-burn" + +/datum/atom_skin/hypovial/toxin + preview_name = "Toxin" + new_icon_state = "hypovial-tox" + +/datum/atom_skin/hypovial/oxyloss + preview_name = "Oxyloss" + new_icon_state = "hypovial-oxy" + +/datum/atom_skin/hypovial/crit + preview_name = "Crit" + new_icon_state = "hypovial-crit" + +/datum/atom_skin/hypovial/buff + preview_name = "Buff" + new_icon_state = "hypovial-buff" + +/datum/atom_skin/hypovial/custom + preview_name = "Custom" + new_icon_state = "hypovial-custom" + /// The original icon file where our overlays reside. var/original_icon = 'modular_skyrat/modules/hyposprays/icons/vials.dmi' @@ -41,27 +72,30 @@ . = ..() . += span_notice("Ctrl-Shift-Click to reskin or set a custom color.") -/obj/item/reagent_containers/cup/vial/click_ctrl_shift(mob/user, obj/item/I) - current_skin = null +/obj/item/reagent_containers/cup/vial/click_ctrl_shift(mob/user, obj/item/held_item) + var/datum/component/reskinable_item/reskin_component = GetComponent(/datum/component/reskinable_item) + if(isnull(reskin_component)) + return icon_state = initial(icon_state) - icon = original_icon + icon = initial(icon) greyscale_colors = null - reskin_obj(user) + reskin_component.reskin_obj(user) -/obj/item/reagent_containers/cup/vial/proc/on_reskin() - if(current_skin == "Custom") - icon_state = unique_reskin["Sterile"] - current_skin = unique_reskin["Sterile"] - var/atom/fake_atom = src - var/list/allowed_configs = list() - var/config = initial(fake_atom.greyscale_config) - allowed_configs += "[config]" - if(greyscale_colors == null) - greyscale_colors = "#FFFF00" - var/datum/greyscale_modify_menu/menu = new(src, usr, allowed_configs) - menu.ui_interact(usr) - else - icon_state = unique_reskin[current_skin] +/obj/item/reagent_containers/cup/vial/proc/on_reskin(datum/source, datum/atom_skin/applied_skin) + if(!istype(applied_skin, /datum/atom_skin/hypovial/custom)) + return + icon_state = "hypovial" + open_custom_greyscale_menu() + +/obj/item/reagent_containers/cup/vial/proc/open_custom_greyscale_menu() + var/list/allowed_greyscale_configs = list("[initial(greyscale_config)]") + if(isnull(greyscale_colors)) + greyscale_colors = "#FFFF00" + var/mob/user = usr + if(isnull(user)) + return + var/datum/greyscale_modify_menu/greyscale_menu = new(src, user, allowed_greyscale_configs) + greyscale_menu.ui_interact(user) /obj/item/reagent_containers/cup/vial/update_overlays() . = ..() @@ -113,23 +147,53 @@ name = "large hypovial" icon_state = "hypoviallarge" fill_icon_state = "hypoviallarge_fill" - current_skin = "hypoviallarge" desc = "A large, 100u capacity vial that fits only in the most deluxe hyposprays." volume = 100 possible_transfer_amounts = list(1,2,5,10,20,30,40,50,100) type_suffix = "-l" - unique_reskin = list( - "Sterile" = "hypoviallarge", - "Generic" = "hypoviallarge-generic", - "Brute" = "hypoviallarge-brute", - "Burn" = "hypoviallarge-burn", - "Toxin" = "hypoviallarge-tox", - "Oxyloss" = "hypoviallarge-oxy", - "Crit" = "hypoviallarge-crit", - "Buff" = "hypoviallarge-buff", - "Custom" = "hypoviallarge-custom", - ) +/obj/item/reagent_containers/cup/vial/large/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hypovial_large) + +/datum/atom_skin/hypovial_large + abstract_type = /datum/atom_skin/hypovial_large + +/datum/atom_skin/hypovial_large/sterile + preview_name = "Sterile" + new_icon_state = "hypoviallarge" + +/datum/atom_skin/hypovial_large/generic + preview_name = "Generic" + new_icon_state = "hypoviallarge-generic" + +/datum/atom_skin/hypovial_large/brute + preview_name = "Brute" + new_icon_state = "hypoviallarge-brute" + +/datum/atom_skin/hypovial_large/burn + preview_name = "Burn" + new_icon_state = "hypoviallarge-burn" + +/datum/atom_skin/hypovial_large/toxin + preview_name = "Toxin" + new_icon_state = "hypoviallarge-tox" + +/datum/atom_skin/hypovial_large/oxyloss + preview_name = "Oxyloss" + new_icon_state = "hypoviallarge-oxy" + +/datum/atom_skin/hypovial_large/crit + preview_name = "Crit" + new_icon_state = "hypoviallarge-crit" + +/datum/atom_skin/hypovial_large/buff + preview_name = "Buff" + new_icon_state = "hypoviallarge-buff" + +/datum/atom_skin/hypovial_large/custom + preview_name = "Custom" + new_icon_state = "hypoviallarge-custom" /obj/item/reagent_containers/cup/vial/large/style/ icon_state = "hypoviallarge" diff --git a/modular_skyrat/modules/mining_vendor_additions/code/order_mining.dm b/modular_skyrat/modules/mining_vendor_additions/code/order_mining.dm index e3a34128466..d1714dc0ded 100644 --- a/modular_skyrat/modules/mining_vendor_additions/code/order_mining.dm +++ b/modular_skyrat/modules/mining_vendor_additions/code/order_mining.dm @@ -6,35 +6,13 @@ purchase_path = /obj/item/suit_voucher cost_per_order = 2000 -/obj/item/kinetic_crusher - uses_advanced_reskins = TRUE - unique_reskin = list( - "Crusher" = list( - RESKIN_ICON = 'icons/obj/mining.dmi', - RESKIN_ICON_STATE = "crusher", - RESKIN_INHAND_L = 'icons/mob/inhands/weapons/hammers_lefthand.dmi', - RESKIN_INHAND_R = 'icons/mob/inhands/weapons/hammers_righthand.dmi', - RESKIN_INHAND_STATE = "crusher0", - ), - "Glaive" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/kinetic_glaive.dmi', - RESKIN_ICON_STATE = "crusher-glaive", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi', - RESKIN_WORN_ICON_STATE = "crusher-glaive", - RESKIN_INHAND_L = 'modular_skyrat/master_files/icons/mob/64x64_lefthand.dmi', - RESKIN_INHAND_R = 'modular_skyrat/master_files/icons/mob/64x64_righthand.dmi', - ), - ) +/obj/item/kinetic_crusher/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) -/obj/item/kinetic_crusher/setup_reskinning() - if(!check_setup_reskinning()) - return - - // We already register context regardless in Initialize. - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - -/obj/item/kinetic_crusher/post_reskin(mob/our_mob) - if(icon_state == "crusher-glaive") +/obj/item/kinetic_crusher/proc/on_reskin(mob/our_mob) + SIGNAL_HANDLER + if(icon_state == "crusher_glaive") name = "proto-kinetic glaive" desc = "A modified proto-kinetic crusher, it is still little more than various mining tools cobbled together \ into a high-tech knife on a stick with a handguard and goliath-leather grip. While equally as effective as its unmodified compatriots, \ diff --git a/modular_skyrat/modules/modular_items/code/bags.dm b/modular_skyrat/modules/modular_items/code/bags.dm index 164c9114cd8..51e2f99df52 100644 --- a/modular_skyrat/modules/modular_items/code/bags.dm +++ b/modular_skyrat/modules/modular_items/code/bags.dm @@ -19,16 +19,6 @@ icon = 'modular_skyrat/modules/modular_items/icons/storage.dmi' icon_state = "ammopouch" custom_price = PAYCHECK_CREW * 4 - // this is just to have post_reskin called later - uses_advanced_reskins = TRUE - unique_reskin = list( - "Ammo Pouch" = list( - RESKIN_ICON_STATE = "ammopouch" - ), - "Casing Pouch" = list( - RESKIN_ICON_STATE = "casingpouch" - ), - ) /obj/item/storage/pouch/ammo/Initialize(mapload) . = ..() @@ -37,8 +27,22 @@ atom_storage.max_slots = 3 atom_storage.numerical_stacking = FALSE atom_storage.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/ammo_pouch) + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) -/obj/item/storage/pouch/ammo/post_reskin(mob/our_mob) +/datum/atom_skin/ammo_pouch + abstract_type = /datum/atom_skin/ammo_pouch + +/datum/atom_skin/ammo_pouch/ammo + preview_name = "Ammo Pouch" + new_icon_state = "ammopouch" + +/datum/atom_skin/ammo_pouch/casing + preview_name = "Casing Pouch" + new_icon_state = "casingpouch" + +/obj/item/storage/pouch/ammo/proc/on_reskin() + SIGNAL_HANDLER if(icon_state == "casingpouch") name = "casing pouch" desc = "A pouch for your ammo that goes in your pocket, carefully segmented for holding shell casings and nothing else." diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm index c797f678696..a831235d39a 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm @@ -331,8 +331,6 @@ desc = "A strange looking air filter. It may not be a good idea to breathe this in..." icon = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/lewd_items.dmi' icon_state = "filter_pink" - unique_reskin = list("pink" = "filter_pink", - "teal" = "filter_teal") w_class = WEIGHT_CLASS_SMALL custom_materials = list( /datum/material/glass = SHEET_MATERIAL_AMOUNT, @@ -348,6 +346,18 @@ /obj/item/reagent_containers/cup/lewd_filter/Initialize(mapload) . = ..() update_icon() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/lewd_filter) + +/datum/atom_skin/lewd_filter + abstract_type = /datum/atom_skin/lewd_filter + +/datum/atom_skin/lewd_filter/pink + preview_name = "pink" + new_icon_state = "filter_pink" + +/datum/atom_skin/lewd_filter/teal + preview_name = "teal" + new_icon_state = "filter_teal" // Legacy code from reagent_containers class. Most likely not really needed and can be cleared /obj/item/reagent_containers/cup/lewd_filter/get_part_rating() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/kink_collars.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/kink_collars.dm index e9a8ad5d171..4de1f1822b2 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/kink_collars.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/kink_collars.dm @@ -36,17 +36,6 @@ slot_flags = ITEM_SLOT_NECK w_class = WEIGHT_CLASS_SMALL interaction_flags_click = NEED_DEXTERITY - unique_reskin = list("Cyan" = "collar_cyan", - "Yellow" = "collar_yellow", - "Green" = "collar_green", - "Red" = "collar_red", - "Latex" = "collar_latex", - "Orange" = "collar_orange", - "White" = "collar_white", - "Purple" = "collar_purple", - "Black" = "collar_black", - "Black-teal" = "collar_tealblack", - "Spike" = "collar_spike") kink_collar = TRUE /// What the name on the tag is var/tagname = null @@ -67,6 +56,54 @@ var/id = REF(src) var/obj/item/key/kink_collar/collar_key = key collar_key.key_id = id + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/kink_collar) + +/datum/atom_skin/kink_collar + abstract_type = /datum/atom_skin/kink_collar + +/datum/atom_skin/kink_collar/cyan + preview_name = "Cyan" + new_icon_state = "collar_cyan" + +/datum/atom_skin/kink_collar/yellow + preview_name = "Yellow" + new_icon_state = "collar_yellow" + +/datum/atom_skin/kink_collar/green + preview_name = "Green" + new_icon_state = "collar_green" + +/datum/atom_skin/kink_collar/red + preview_name = "Red" + new_icon_state = "collar_red" + +/datum/atom_skin/kink_collar/latex + preview_name = "Latex" + new_icon_state = "collar_latex" + +/datum/atom_skin/kink_collar/orange + preview_name = "Orange" + new_icon_state = "collar_orange" + +/datum/atom_skin/kink_collar/white + preview_name = "White" + new_icon_state = "collar_white" + +/datum/atom_skin/kink_collar/purple + preview_name = "Purple" + new_icon_state = "collar_purple" + +/datum/atom_skin/kink_collar/black + preview_name = "Black" + new_icon_state = "collar_black" + +/datum/atom_skin/kink_collar/black_teal + preview_name = "Black-teal" + new_icon_state = "collar_tealblack" + +/datum/atom_skin/kink_collar/spike + preview_name = "Spike" + new_icon_state = "collar_spike" //rename collar code @@ -86,17 +123,6 @@ icon_state = "lock_collar_cyan" treat_path = /obj/item/key/kink_collar interaction_flags_click = NEED_DEXTERITY - unique_reskin = list("Cyan" = "lock_collar_cyan", - "Yellow" = "lock_collar_yellow", - "Green" = "lock_collar_green", - "Red" = "lock_collar_red", - "Latex" = "lock_collar_latex", - "Orange" = "lock_collar_orange", - "White" = "lock_collar_white", - "Purple" = "lock_collar_purple", - "Black" = "lock_collar_black", - "Black-teal" = "lock_collar_tealblack", - "Spike" = "lock_collar_spike") /// If the collar is currently locked var/locked = FALSE /// If the collar has been broken or not @@ -105,6 +131,54 @@ /obj/item/clothing/neck/kink_collar/locked/Initialize(mapload) . = ..() create_storage(storage_type = /datum/storage/pockets/small/kink_collar/locked) + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/kink_collar_locked) + +/datum/atom_skin/kink_collar_locked + abstract_type = /datum/atom_skin/kink_collar_locked + +/datum/atom_skin/kink_collar_locked/cyan + preview_name = "Cyan" + new_icon_state = "lock_collar_cyan" + +/datum/atom_skin/kink_collar_locked/yellow + preview_name = "Yellow" + new_icon_state = "lock_collar_yellow" + +/datum/atom_skin/kink_collar_locked/green + preview_name = "Green" + new_icon_state = "lock_collar_green" + +/datum/atom_skin/kink_collar_locked/red + preview_name = "Red" + new_icon_state = "lock_collar_red" + +/datum/atom_skin/kink_collar_locked/latex + preview_name = "Latex" + new_icon_state = "lock_collar_latex" + +/datum/atom_skin/kink_collar_locked/orange + preview_name = "Orange" + new_icon_state = "lock_collar_orange" + +/datum/atom_skin/kink_collar_locked/white + preview_name = "White" + new_icon_state = "lock_collar_white" + +/datum/atom_skin/kink_collar_locked/purple + preview_name = "Purple" + new_icon_state = "lock_collar_purple" + +/datum/atom_skin/kink_collar_locked/black + preview_name = "Black" + new_icon_state = "lock_collar_black" + +/datum/atom_skin/kink_collar_locked/black_teal + preview_name = "Black-teal" + new_icon_state = "lock_collar_tealblack" + +/datum/atom_skin/kink_collar_locked/spike + preview_name = "Spike" + new_icon_state = "lock_collar_spike" //spawn thing in collar @@ -169,17 +243,57 @@ var/keyname = null /// The ID of the key to pair with a collar. Will normally be the ref of the collar var/key_id = null //Adding same unique id to key - unique_reskin = list("Cyan" = "collar_key_blue", - "Yellow" = "collar_key_yellow", - "Green" = "collar_key_green", - "Red" = "collar_key_red", - "Latex" = "collar_key_latex", - "Orange" = "collar_key_orange", - "White" = "collar_key_white", - "Purple" = "collar_key_purple", - "Black" = "collar_key_black", - "Metal" = "collar_key_metal", - "Black-teal" = "collar_key_tealblack") + +/obj/item/key/kink_collar/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/kink_collar_key) + +/datum/atom_skin/kink_collar_key + abstract_type = /datum/atom_skin/kink_collar_key + +/datum/atom_skin/kink_collar_key/cyan + preview_name = "Cyan" + new_icon_state = "collar_key_blue" + +/datum/atom_skin/kink_collar_key/yellow + preview_name = "Yellow" + new_icon_state = "collar_key_yellow" + +/datum/atom_skin/kink_collar_key/green + preview_name = "Green" + new_icon_state = "collar_key_green" + +/datum/atom_skin/kink_collar_key/red + preview_name = "Red" + new_icon_state = "collar_key_red" + +/datum/atom_skin/kink_collar_key/latex + preview_name = "Latex" + new_icon_state = "collar_key_latex" + +/datum/atom_skin/kink_collar_key/orange + preview_name = "Orange" + new_icon_state = "collar_key_orange" + +/datum/atom_skin/kink_collar_key/white + preview_name = "White" + new_icon_state = "collar_key_white" + +/datum/atom_skin/kink_collar_key/purple + preview_name = "Purple" + new_icon_state = "collar_key_purple" + +/datum/atom_skin/kink_collar_key/black + preview_name = "Black" + new_icon_state = "collar_key_black" + +/datum/atom_skin/kink_collar_key/metal + preview_name = "Metal" + new_icon_state = "collar_key_metal" + +/datum/atom_skin/kink_collar_key/black_teal + preview_name = "Black-teal" + new_icon_state = "collar_key_tealblack" //changing name of key in case if we using multiple collars with same color /obj/item/key/kink_collar/attack_self(mob/user) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/stripper_outfit.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/stripper_outfit.dm index 62cf2592837..3e668683065 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/stripper_outfit.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/stripper_outfit.dm @@ -12,13 +12,50 @@ icon_state = "stripper_cyan" inhand_icon_state = "b_suit" interaction_flags_click = NEED_DEXTERITY - unique_reskin = list("Cyan" = "stripper_cyan", - "Yellow" = "stripper_yellow", - "Green" = "stripper_green", - "Red" = "stripper_red", - "Latex" = "stripper_latex", - "Orange" = "stripper_orange", - "White" = "stripper_white", - "Purple" = "stripper_purple", - "Black" = "stripper_black", - "Black-teal" = "stripper_tealblack") + +/obj/item/clothing/under/stripper_outfit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/stripper_outfit) + +/datum/atom_skin/stripper_outfit + abstract_type = /datum/atom_skin/stripper_outfit + +/datum/atom_skin/stripper_outfit/cyan + preview_name = "Cyan" + new_icon_state = "stripper_cyan" + +/datum/atom_skin/stripper_outfit/yellow + preview_name = "Yellow" + new_icon_state = "stripper_yellow" + +/datum/atom_skin/stripper_outfit/green + preview_name = "Green" + new_icon_state = "stripper_green" + +/datum/atom_skin/stripper_outfit/red + preview_name = "Red" + new_icon_state = "stripper_red" + +/datum/atom_skin/stripper_outfit/latex + preview_name = "Latex" + new_icon_state = "stripper_latex" + +/datum/atom_skin/stripper_outfit/orange + preview_name = "Orange" + new_icon_state = "stripper_orange" + +/datum/atom_skin/stripper_outfit/white + preview_name = "White" + new_icon_state = "stripper_white" + +/datum/atom_skin/stripper_outfit/purple + preview_name = "Purple" + new_icon_state = "stripper_purple" + +/datum/atom_skin/stripper_outfit/black + preview_name = "Black" + new_icon_state = "stripper_black" + +/datum/atom_skin/stripper_outfit/black_teal + preview_name = "Black-teal" + new_icon_state = "stripper_tealblack" diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm index 1fef2ec9fa4..dcba0b3d264 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm @@ -14,13 +14,23 @@ /// Leash line visual for the hooked item var/datum/beam/leash_line/leash_line - unique_reskin = list( - "Pink" = "neckleash_pink", - "Teal" = "neckleash_teal", - ) - COOLDOWN_DECLARE(tug_cd) +/obj/item/clothing/erp_leash/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/erp_leash) + +/datum/atom_skin/erp_leash + abstract_type = /datum/atom_skin/erp_leash + +/datum/atom_skin/erp_leash/pink + preview_name = "Pink" + new_icon_state = "neckleash_pink" + +/datum/atom_skin/erp_leash/teal + preview_name = "Teal" + new_icon_state = "neckleash_teal" + /// HERE BE DRAGONS /// /// Checks; leashing start diff --git a/modular_skyrat/modules/nanotrasen_naval_command/code/clothing.dm b/modular_skyrat/modules/nanotrasen_naval_command/code/clothing.dm index 0313c68010b..a03706c6fa2 100644 --- a/modular_skyrat/modules/nanotrasen_naval_command/code/clothing.dm +++ b/modular_skyrat/modules/nanotrasen_naval_command/code/clothing.dm @@ -96,4 +96,9 @@ icon = 'icons/obj/clothing/glasses.dmi' worn_icon = 'icons/mob/clothing/eyes.dmi' icon_state = "sun" - unique_reskin = null + +/obj/item/clothing/glasses/hud/security/sunglasses/black/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm b/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm index 5d853ec74e5..3f834a92bef 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/plant_bag.dm @@ -1,58 +1,64 @@ #define RESKIN_LINEN "Linen" -/obj/item/storage/bag/plants - uses_advanced_reskins = TRUE - unique_reskin = list( - "Original" = list( - RESKIN_ICON = 'icons/obj/service/hydroponics/equipment.dmi', - RESKIN_ICON_STATE = "plantbag", - RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "plantbag", - ), - RESKIN_LINEN = list( - RESKIN_ICON = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi', - RESKIN_ICON_STATE = "plantbag_primitive", - RESKIN_WORN_ICON = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi', - RESKIN_WORN_ICON_STATE = "plantbag_primitive", - ), - ) +/obj/item/storage/bag/plants/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/plant_bag) + +/datum/atom_skin/plant_bag + abstract_type = /datum/atom_skin/plant_bag + +/datum/atom_skin/plant_bag/original + preview_name = "Original" + new_icon = 'icons/obj/service/hydroponics/equipment.dmi' + new_icon_state = "plantbag" + new_worn_icon = 'icons/mob/clothing/belt.dmi' + +/datum/atom_skin/plant_bag/linen + preview_name = RESKIN_LINEN + new_icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi' + new_icon_state = "plantbag_primitive" + new_worn_icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi' // This is so the linen reskin shows properly in the suit storage. /obj/item/storage/bag/plants/build_worn_icon(default_layer, default_icon_file, isinhands, female_uniform, override_state, override_file, mutant_styles) - if(default_layer == SUIT_STORE_LAYER && current_skin == RESKIN_LINEN) - override_file = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi' - + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + if(default_layer == SUIT_STORE_LAYER) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + if(reskin_component.is_using_skin(/datum/atom_skin/plant_bag/linen)) + override_file = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn_mirror.dmi' + break return ..() /// Simple helper to reskin this item into its primitive variant. /obj/item/storage/bag/plants/proc/make_primitive() - current_skin = RESKIN_LINEN + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) - icon = unique_reskin[current_skin][RESKIN_ICON] - icon_state = unique_reskin[current_skin][RESKIN_ICON_STATE] - worn_icon = unique_reskin[current_skin][RESKIN_WORN_ICON] - worn_icon_state = unique_reskin[current_skin][RESKIN_WORN_ICON_STATE] - - update_appearance() + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + reskin_component.set_skin_by_name(RESKIN_LINEN) /// A helper for the primitive variant, for mappers. /obj/item/storage/bag/plants/primitive - current_skin = RESKIN_LINEN // Just so it displays properly when in suit storage - uses_advanced_reskins = FALSE - unique_reskin = null icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag.dmi' icon_state = "plantbag_primitive" worn_icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/plant_bag_worn.dmi' worn_icon_state = "plantbag_primitive" +/obj/item/storage/bag/plants/primitive/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /obj/item/storage/bag/plants/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) . = ..() if(!isprimitivedemihuman(crafter) && !isashwalker(crafter)) return make_primitive() -/obj/item/storage/bag/plants/portaseeder - uses_advanced_reskins = FALSE - unique_reskin = null +/obj/item/storage/bag/plants/portaseeder/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) #undef RESKIN_LINEN diff --git a/modular_skyrat/modules/sec_haul/code/peacekeeper/armadyne_clothing.dm b/modular_skyrat/modules/sec_haul/code/peacekeeper/armadyne_clothing.dm index 87b3585da21..de35907f410 100644 --- a/modular_skyrat/modules/sec_haul/code/peacekeeper/armadyne_clothing.dm +++ b/modular_skyrat/modules/sec_haul/code/peacekeeper/armadyne_clothing.dm @@ -28,7 +28,12 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' icon_state = "armadyne_trench" - current_skin = "armadyne_trench" //prevents reskinning + +/obj/item/clothing/suit/armor/hos/trenchcoat/armadyne/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/suit/armor/vest/peacekeeper/armadyne name = "armadyne jacket" @@ -54,7 +59,6 @@ icon_state = "armadyne_glasses" worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' - uses_advanced_reskins = FALSE /obj/item/clothing/gloves/combat/peacekeeper/armadyne name = "armadyne combat gloves" diff --git a/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_clothing.dm b/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_clothing.dm index 8e3594d3856..8a4072be5f8 100644 --- a/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_clothing.dm +++ b/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_clothing.dm @@ -52,33 +52,33 @@ icon_state = "policeofficerpatrolcap" supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON armor_type = /datum/armor/head_helmet - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "policeofficercap", - RESKIN_WORN_ICON_STATE = "policeofficercap" - ), - "Black and Blue Variant" = list( - RESKIN_ICON_STATE = "policeofficerpatrolcap", - RESKIN_WORN_ICON_STATE = "policeofficerpatrolcap" - ), - "Sillitoe Variant" = list( - RESKIN_ICON_STATE = "policetrafficcap", - RESKIN_WORN_ICON_STATE = "policetrafficcap" - ), - "Long Kesh Variant" = list( - RESKIN_ICON_STATE = "corrections_officer", - RESKIN_WORN_ICON_STATE = "corrections_officer" - ), - "Sillitoe Variant" = list( - RESKIN_ICON_STATE = "policetrafficcap", - RESKIN_WORN_ICON_STATE = "policetrafficcap" - ), - "Cadet Variant" = list( - RESKIN_ICON_STATE = "policecadetcap", - RESKIN_WORN_ICON_STATE = "policecadetcap" - ), - ) + +/obj/item/clothing/head/hats/warden/police/patrol/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/police_patrol_cap) + +/datum/atom_skin/police_patrol_cap + abstract_type = /datum/atom_skin/police_patrol_cap + +/datum/atom_skin/police_patrol_cap/blue + preview_name = "Blue Variant" + new_icon_state = "policeofficercap" + +/datum/atom_skin/police_patrol_cap/black_blue + preview_name = "Black and Blue Variant" + new_icon_state = "policeofficerpatrolcap" + +/datum/atom_skin/police_patrol_cap/sillitoe + preview_name = "Sillitoe Variant" + new_icon_state = "policetrafficcap" + +/datum/atom_skin/police_patrol_cap/long_kesh + preview_name = "Long Kesh Variant" + new_icon_state = "corrections_officer" + +/datum/atom_skin/police_patrol_cap/cadet + preview_name = "Cadet Variant" + new_icon_state = "policecadetcap" /obj/item/clothing/glasses/hud/security/sunglasses/peacekeeper name = "peacekeeper hud glasses" diff --git a/modular_skyrat/modules/syndie_edits/code/syndie_edits.dm b/modular_skyrat/modules/syndie_edits/code/syndie_edits.dm index 134da314059..e0642c7bb07 100644 --- a/modular_skyrat/modules/syndie_edits/code/syndie_edits.dm +++ b/modular_skyrat/modules/syndie_edits/code/syndie_edits.dm @@ -108,7 +108,6 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' icon_state = "webbingds" worn_icon_state = "webbingds" - uses_advanced_reskins = FALSE /obj/item/clothing/suit/armor/bulletproof/old desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." diff --git a/modular_skyrat/modules/tarkon/code/clothing/neck.dm b/modular_skyrat/modules/tarkon/code/clothing/neck.dm index acb0dc8b31b..8edab363039 100644 --- a/modular_skyrat/modules/tarkon/code/clothing/neck.dm +++ b/modular_skyrat/modules/tarkon/code/clothing/neck.dm @@ -4,14 +4,18 @@ worn_icon = 'modular_skyrat/modules/tarkon/icons/mob/clothing/neck.dmi' icon = 'modular_skyrat/modules/tarkon/icons/obj/clothing/neck.dmi' icon_state = "armplate_shemaugh" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Caped Variant" = list( - RESKIN_ICON_STATE = "armplate_shemaugh", - RESKIN_WORN_ICON_STATE = "armplate_shemaugh" - ), - "Capeless Variant" = list( - RESKIN_ICON_STATE = "armplate", - RESKIN_WORN_ICON_STATE = "armplate" - ), - ) + +/obj/item/clothing/neck/security_cape/tarkon/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/tarkon_gauntlet) + +/datum/atom_skin/tarkon_gauntlet + abstract_type = /datum/atom_skin/tarkon_gauntlet + +/datum/atom_skin/tarkon_gauntlet/caped + preview_name = "Caped Variant" + new_icon_state = "armplate_shemaugh" + +/datum/atom_skin/tarkon_gauntlet/capeless + preview_name = "Capeless Variant" + new_icon_state = "armplate" diff --git a/modular_zubbers/code/datums/components/reskinnable_atom.dm b/modular_zubbers/code/datums/components/reskinnable_atom.dm new file mode 100644 index 00000000000..69b88da27b4 --- /dev/null +++ b/modular_zubbers/code/datums/components/reskinnable_atom.dm @@ -0,0 +1,37 @@ +/datum/atom_skin + /// Optional, worn_icon to change the atom to when applied + var/new_worn_icon + /// The in-hand icon state for held items. + var/new_inhand_icon_state + /// The left side in-hand icon state for held items. + var/new_left_inhand + /// The right side in-hand icon state for held items. + var/new_right_inhand + +/datum/atom_skin/apply(atom/apply_to) + . = ..() + if(isitem(apply_to)) + var/obj/item/item_apply_to = apply_to + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, worn_icon, new_worn_icon, reset_missing) + if(change_inhand_icon_state && isitem(apply_to)) + var/obj/item/item_apply_to = apply_to + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, inhand_icon_state, new_inhand_icon_state, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, lefthand_file, new_left_inhand, reset_missing) + APPLY_VAR_OR_RESET_INITIAL(item_apply_to, righthand_file, new_right_inhand, reset_missing) + +/datum/atom_skin/clear_skin(atom/clear_from) + . = ..() + if(isitem(clear_from)) + var/obj/item/item_clear_from = clear_from + RESET_INITIAL_IF_SET(item_clear_from, worn_icon, new_worn_icon) + if(change_inhand_icon_state && isitem(clear_from)) + var/obj/item/item_clear_from = clear_from + RESET_INITIAL_IF_SET(item_clear_from, inhand_icon_state, new_inhand_icon_state) + RESET_INITIAL_IF_SET(item_clear_from, lefthand_file, new_left_inhand) + RESET_INITIAL_IF_SET(item_clear_from, righthand_file, new_right_inhand) + +/datum/component/reskinable_item/proc/is_using_skin(path) + return current_skin && istype(current_skin, path) + +/datum/component/reskinable_item/proc/has_skin() + return current_skin != null diff --git a/modular_zubbers/code/game/Items/storage/backpack.dm b/modular_zubbers/code/game/Items/storage/backpack.dm index df19d37efb6..996ae4d20f0 100644 --- a/modular_zubbers/code/game/Items/storage/backpack.dm +++ b/modular_zubbers/code/game/Items/storage/backpack.dm @@ -1,22 +1,23 @@ -/obj/item/storage/backpack/duffelbag/med - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "duffel-med", - RESKIN_INHAND_L = 'modular_zubbers/icons/mob/inhands/equipment/backpack_lefthand.dmi', - RESKIN_INHAND_R = 'modular_zubbers/icons/mob/inhands/equipment/backpack_righthand.dmi', - RESKIN_INHAND_STATE = "duffel-med", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi', - RESKIN_WORN_ICON_STATE = "duffel-med", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "duffel-medical", - RESKIN_INHAND_L = 'icons/mob/inhands/equipment/backpack_lefthand.dmi', - RESKIN_INHAND_R = 'icons/mob/inhands/equipment/backpack_righthand.dmi', - RESKIN_INHAND_STATE = "duffel-med", - RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', - RESKIN_WORN_ICON_STATE = "duffel-medical", - ), - ) +/obj/item/storage/backpack/duffelbag/med/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/medical_duffelbag) + +/datum/atom_skin/medical_duffelbag + abstract_type = /datum/atom_skin/medical_duffelbag + +/datum/atom_skin/medical_duffelbag/korve + preview_name = "korve" + new_icon_state = "duffel-med" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi' + new_icon = 'modular_zubbers/icons/obj/storage/backpack.dmi' + new_left_inhand = 'modular_zubbers/icons/mob/inhands/equipment/backpack_lefthand.dmi' + new_right_inhand = 'modular_zubbers/icons/mob/inhands/equipment/backpack_righthand.dmi' + +/datum/atom_skin/medical_duffelbag/default + preview_name = "default" + new_icon_state = "duffel-medical" + new_worn_icon = 'icons/mob/clothing/back/backpack.dmi' + new_icon = 'icons/obj/storage/backpack.dmi' + new_left_inhand = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + new_right_inhand = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + new_inhand_icon_state = "duffel-med" diff --git a/modular_zubbers/code/game/objects/items/stacks/medical.dm b/modular_zubbers/code/game/objects/items/stacks/medical.dm index 49de0f5e375..ced0591a467 100644 --- a/modular_zubbers/code/game/objects/items/stacks/medical.dm +++ b/modular_zubbers/code/game/objects/items/stacks/medical.dm @@ -1,12 +1,16 @@ -/obj/item/stack/medical/bone_gel - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bone-gel", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bone-gel", - ), - ) +/obj/item/stack/medical/bone_gel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bone_gel) + +/datum/atom_skin/bone_gel + abstract_type = /datum/atom_skin/bone_gel + +/datum/atom_skin/bone_gel/korve + preview_name = "korve" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + new_icon_state = "bone-gel" + +/datum/atom_skin/bone_gel/default + preview_name = "default" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + new_icon_state = "bone-gel" diff --git a/modular_zubbers/code/modules/clothing/accessory/accessory.dm b/modular_zubbers/code/modules/clothing/accessory/accessory.dm index 9dd2ec741c0..caf7a98a74c 100644 --- a/modular_zubbers/code/modules/clothing/accessory/accessory.dm +++ b/modular_zubbers/code/modules/clothing/accessory/accessory.dm @@ -40,40 +40,125 @@ /obj/item/clothing/accessory/fake/medal name = "plastic medal" desc = "Yeah nice try buddy. They won't record this one. Especially since it reads 'youre winnar!!'. Alt-Click to reskin!" - unique_reskin = list( - "Bronze" = "bronze", - "Bronze Heart" = "bronze_heart", - "Silver" = "silver", - "Gold" = "gold", - "Plasma" = "plasma", - "Cargo" = "cargo", - "Paperwork" = "medal_paperwork", - "Medical Second Class" = "med_medal", - "Medical First Class" = "med_medal2", - "Atmosian" = "elderatmosian", - "Emergency Service - General" = "emergencyservices", - "Emergency Service - Engineering" = "emergencyservices_engi", - "Emergency Service - Medical" = "emergencyservices_med" - ) + +/obj/item/clothing/accessory/fake/medal/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/medal) + +/datum/atom_skin/medal + abstract_type = /datum/atom_skin/medal + +/datum/atom_skin/medal/bronze + preview_name = "Bronze" + new_icon_state = "bronze" + +/datum/atom_skin/medal/bronze_heart + preview_name = "Bronze Heart" + new_icon_state = "bronze_heart" + +/datum/atom_skin/medal/silver + preview_name = "Silver" + new_icon_state = "silver" + +/datum/atom_skin/medal/gold + preview_name = "Gold" + new_icon_state = "gold" + +/datum/atom_skin/medal/plasma + preview_name = "Plasma" + new_icon_state = "plasma" + +/datum/atom_skin/medal/cargo + preview_name = "Cargo" + new_icon_state = "cargo" + +/datum/atom_skin/medal/paperwork + preview_name = "Paperwork" + new_icon_state = "medal_paperwork" + +/datum/atom_skin/medal/medical_second_class + preview_name = "Medical Second Class" + new_icon_state = "med_medal" + +/datum/atom_skin/medal/medical_first_class + preview_name = "Medical First Class" + new_icon_state = "med_medal2" + +/datum/atom_skin/medal/atmosian + preview_name = "Atmosian" + new_icon_state = "elderatmosian" + +/datum/atom_skin/medal/emergency_general + preview_name = "Emergency Service - General" + new_icon_state = "emergencyservices" + +/datum/atom_skin/medal/emergency_engineering + preview_name = "Emergency Service - Engineering" + new_icon_state = "emergencyservices_engi" + +/datum/atom_skin/medal/emergency_medical + preview_name = "Emergency Service - Medical" + new_icon_state = "emergencyservices_med" + // Pride Pin Over-ride /obj/item/clothing/accessory/pride icon = 'modular_skyrat/master_files/icons/obj/clothing/accessories.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/accessories.dmi' - unique_reskin = list( - "Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - "Intersex Pride" = "pride_intersex", - "Lesbian Pride" = "pride_lesbian", - "Man-Loving-Man / Gay Pride" = "pride_mlm", - "Genderfluid Pride" = "pride_genderfluid", - "Genderqueer Pride" = "pride_genderqueer", - "Aromantic Pride" = "pride_aromantic", -) +/obj/item/clothing/accessory/pride/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pride) + +/datum/atom_skin/pride + abstract_type = /datum/atom_skin/pride + +/datum/atom_skin/pride/rainbow + preview_name = "Rainbow Pride" + new_icon_state = "pride" + +/datum/atom_skin/pride/bisexual + preview_name = "Bisexual Pride" + new_icon_state = "pride_bi" + +/datum/atom_skin/pride/pansexual + preview_name = "Pansexual Pride" + new_icon_state = "pride_pan" + +/datum/atom_skin/pride/asexual + preview_name = "Asexual Pride" + new_icon_state = "pride_ace" + +/datum/atom_skin/pride/nonbinary + preview_name = "Non-binary Pride" + new_icon_state = "pride_enby" + +/datum/atom_skin/pride/transgender + preview_name = "Transgender Pride" + new_icon_state = "pride_trans" + +/datum/atom_skin/pride/intersex + preview_name = "Intersex Pride" + new_icon_state = "pride_intersex" + +/datum/atom_skin/pride/lesbian + preview_name = "Lesbian Pride" + new_icon_state = "pride_lesbian" + +/datum/atom_skin/pride/mlm + preview_name = "Man-Loving-Man / Gay Pride" + new_icon_state = "pride_mlm" + +/datum/atom_skin/pride/genderfluid + preview_name = "Genderfluid Pride" + new_icon_state = "pride_genderfluid" + +/datum/atom_skin/pride/genderqueer + preview_name = "Genderqueer Pride" + new_icon_state = "pride_genderqueer" + +/datum/atom_skin/pride/aromantic + preview_name = "Aromantic Pride" + new_icon_state = "pride_aromantic" // Dogtags /obj/item/clothing/accessory/dogtags @@ -295,18 +380,53 @@ Potential future ideas: greyscale_config = /datum/greyscale_config/medals/glow greyscale_config_worn = /datum/greyscale_config/medals/glow/worn greyscale_colors = "#7effff" - unique_reskin = list( - "Crystal" = "necklace_crystal", - "Bar" = "necklace_bar", - "Hollow Bar" = "necklace_bar_hollow", - "Diamond" = "necklace_diamond", - "Hollow Diamond" = "necklace_diamond_hollow", - "Shard" = "necklace_shard", - "Hollow Shard" = "necklace_shard_hollow", - "Triangle" = "necklace_triangle", - "Hollow Triangle" = "necklace_triangle_hollow", - "Circle" = "necklace_circle", - ) + +/obj/item/clothing/accessory/bubber/acc_medal/glowcrystal/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/glowcrystal) + +/datum/atom_skin/glowcrystal + abstract_type = /datum/atom_skin/glowcrystal + +/datum/atom_skin/glowcrystal/crystal + preview_name = "Crystal" + new_icon_state = "necklace_crystal" + +/datum/atom_skin/glowcrystal/bar + preview_name = "Bar" + new_icon_state = "necklace_bar" + +/datum/atom_skin/glowcrystal/bar_hollow + preview_name = "Hollow Bar" + new_icon_state = "necklace_bar_hollow" + +/datum/atom_skin/glowcrystal/diamond + preview_name = "Diamond" + new_icon_state = "necklace_diamond" + +/datum/atom_skin/glowcrystal/diamond_hollow + preview_name = "Hollow Diamond" + new_icon_state = "necklace_diamond_hollow" + +/datum/atom_skin/glowcrystal/shard + preview_name = "Shard" + new_icon_state = "necklace_shard" + +/datum/atom_skin/glowcrystal/shard_hollow + preview_name = "Hollow Shard" + new_icon_state = "necklace_shard_hollow" + +/datum/atom_skin/glowcrystal/triangle + preview_name = "Triangle" + new_icon_state = "necklace_triangle" + +/datum/atom_skin/glowcrystal/triangle_hollow + preview_name = "Hollow Triangle" + new_icon_state = "necklace_triangle_hollow" + +/datum/atom_skin/glowcrystal/circle + preview_name = "Circle" + new_icon_state = "necklace_circle" /* // Rank pins diff --git a/modular_zubbers/code/modules/clothing/donator_clothing.dm b/modular_zubbers/code/modules/clothing/donator_clothing.dm index d432e3c419d..da70fa1d61b 100644 --- a/modular_zubbers/code/modules/clothing/donator_clothing.dm +++ b/modular_zubbers/code/modules/clothing/donator_clothing.dm @@ -32,7 +32,6 @@ worn_icon = 'modular_zubbers/icons/mob/clothing/under/idmaco_worn.dmi' supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION worn_icon_digi = 'modular_zubbers/icons/mob/clothing/under/idmaco_worn_digi.dmi' - uses_advanced_reskins = FALSE resistance_flags = FIRE_PROOF /obj/item/clothing/under/rank/idma_utility diff --git a/modular_zubbers/code/modules/clothing/gloves/misc.dm b/modular_zubbers/code/modules/clothing/gloves/misc.dm index 3c26e654084..7eb04b29d49 100644 --- a/modular_zubbers/code/modules/clothing/gloves/misc.dm +++ b/modular_zubbers/code/modules/clothing/gloves/misc.dm @@ -35,28 +35,35 @@ icon = 'modular_zubbers/icons/obj/clothing/gloves.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/hands.dmi' icon_state = "civilprotection" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Metro Cop" = list( - RESKIN_ICON_STATE = "civilprotection", - RESKIN_WORN_ICON_STATE = "civilprotection" - ), - "Overwatch" = list( - RESKIN_ICON_STATE = "overwatch", - RESKIN_WORN_ICON_STATE = "overwatch" - ), - ) +/obj/item/clothing/gloves/color/black/security/metrocop/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/metrocop_gloves) + +/datum/atom_skin/metrocop_gloves + abstract_type = /datum/atom_skin/metrocop_gloves + +/datum/atom_skin/metrocop_gloves/metro_cop + preview_name = "Metro Cop" + new_icon_state = "civilprotection" + +/datum/atom_skin/metrocop_gloves/overwatch + preview_name = "Overwatch" + new_icon_state = "overwatch" //MGS stuff sprited by Crumpaloo for onlyplateau, please credit when porting, which you obviously have permission to do. /obj/item/clothing/gloves/color/black/security/snake name = "stealth gloves" desc = "We will forsake our countries." - uses_advanced_reskins = FALSE icon = 'modular_zubbers/icons/obj/clothing/gloves/gloves.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/gloves/gloves.dmi' icon_state = "snake" - unique_reskin = null + +/obj/item/clothing/gloves/color/black/security/snake/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/gloves/bubber/snake name = "big boss' gloves" diff --git a/modular_zubbers/code/modules/clothing/head/helmet.dm b/modular_zubbers/code/modules/clothing/head/helmet.dm index 2f799b70458..f849cbffb9b 100644 --- a/modular_zubbers/code/modules/clothing/head/helmet.dm +++ b/modular_zubbers/code/modules/clothing/head/helmet.dm @@ -9,37 +9,41 @@ icon_state = "metrocopHelm" inhand_icon_state = null armor_type = /datum/armor/head_helmet - uses_advanced_reskins = TRUE - unique_reskin = list( - "Metrocop" = list( - RESKIN_ICON_STATE = "metrocopHelm", - RESKIN_WORN_ICON_STATE = "metrocopHelm" - ), - "Medical Cop" = list( - RESKIN_ICON_STATE = "medicalofficer", - RESKIN_WORN_ICON_STATE = "medicalofficer" - ), - "Green" = list( - RESKIN_ICON_STATE = "overseer", - RESKIN_WORN_ICON_STATE = "overseer" - ), - "Puppet" = list( - RESKIN_ICON_STATE = "dv_mask", - RESKIN_WORN_ICON_STATE = "dv_mask" - ), - "White Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_white", - RESKIN_WORN_ICON_STATE = "overwatch_white" - ), - "Overwatch" = list( - RESKIN_ICON_STATE = "overwatch", - RESKIN_WORN_ICON_STATE = "overwatch" - ), - "Red Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_red", - RESKIN_WORN_ICON_STATE = "overwatch_red" - ), - ) + +/obj/item/clothing/head/helmet/metrocophelmet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/metrocop_helmet) + +/datum/atom_skin/metrocop_helmet + abstract_type = /datum/atom_skin/metrocop_helmet + +/datum/atom_skin/metrocop_helmet/metrocop + preview_name = "Metrocop" + new_icon_state = "metrocopHelm" + +/datum/atom_skin/metrocop_helmet/medical + preview_name = "Medical Cop" + new_icon_state = "medicalofficer" + +/datum/atom_skin/metrocop_helmet/green + preview_name = "Green" + new_icon_state = "overseer" + +/datum/atom_skin/metrocop_helmet/puppet + preview_name = "Puppet" + new_icon_state = "dv_mask" + +/datum/atom_skin/metrocop_helmet/overwatch_white + preview_name = "White Overwatch" + new_icon_state = "overwatch_white" + +/datum/atom_skin/metrocop_helmet/overwatch + preview_name = "Overwatch" + new_icon_state = "overwatch" + +/datum/atom_skin/metrocop_helmet/overwatch_red + preview_name = "Red Overwatch" + new_icon_state = "overwatch_red" /obj/item/clothing/head/helmet/abductor/fake name = "Kabrus Utility Helmet" @@ -649,28 +653,32 @@ icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "kepi_sec_red" - uses_advanced_reskins = TRUE armor_type = /datum/armor/head_helmet strip_delay = 60 supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON - unique_reskin = list( - "Red Security Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_red", - RESKIN_WORN_ICON_STATE = "kepi_sec_red" - ), - "Blue Security Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_blue", - RESKIN_WORN_ICON_STATE = "kepi_sec_blue" - ), - "White Security Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_white", - RESKIN_WORN_ICON_STATE = "kepi_sec_white" - ), - "Black Security Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_black", - RESKIN_WORN_ICON_STATE = "kepi_sec_black" - ), - ) + +/obj/item/clothing/head/security_kepi/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_kepi) + +/datum/atom_skin/security_kepi + abstract_type = /datum/atom_skin/security_kepi + +/datum/atom_skin/security_kepi/red + preview_name = "Red Security Kepi" + new_icon_state = "kepi_sec_red" + +/datum/atom_skin/security_kepi/blue + preview_name = "Blue Security Kepi" + new_icon_state = "kepi_sec_blue" + +/datum/atom_skin/security_kepi/white + preview_name = "White Security Kepi" + new_icon_state = "kepi_sec_white" + +/datum/atom_skin/security_kepi/black + preview_name = "Black Security Kepi" + new_icon_state = "kepi_sec_black" /obj/item/clothing/head/hos_kepi name = "HoS kepi" @@ -678,19 +686,23 @@ icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "kepi_sec_red_hos" - uses_advanced_reskins = TRUE armor_type = /datum/armor/hats_hos strip_delay = 60 - unique_reskin = list( - "Red HoS Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_red_hos", - RESKIN_WORN_ICON_STATE = "kepi_sec_red_hos" - ), - "Blue HoS Kepi" = list( - RESKIN_ICON_STATE = "kepi_sec_blue_hos", - RESKIN_WORN_ICON_STATE = "kepi_sec_blue_hos" - ), - ) + +/obj/item/clothing/head/hos_kepi/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_kepi) + +/datum/atom_skin/hos_kepi + abstract_type = /datum/atom_skin/hos_kepi + +/datum/atom_skin/hos_kepi/red + preview_name = "Red HoS Kepi" + new_icon_state = "kepi_sec_red_hos" + +/datum/atom_skin/hos_kepi/blue + preview_name = "Blue HoS Kepi" + new_icon_state = "kepi_sec_blue_hos" // END HATS ADDED BY APRIL diff --git a/modular_zubbers/code/modules/clothing/mask/clown.dm b/modular_zubbers/code/modules/clothing/mask/clown.dm index e337cb89731..06ff179c9a1 100644 --- a/modular_zubbers/code/modules/clothing/mask/clown.dm +++ b/modular_zubbers/code/modules/clothing/mask/clown.dm @@ -18,20 +18,42 @@ resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) dog_fashion = /datum/dog_fashion/head/clown - obj_flags = parent_type::obj_flags | INFINITE_RESKIN - unique_reskin = list( - "Down Clown" = "blueclown", - "Jumbo" = "greenclown", - "Stepchild" = "redclown", - "Banana Brained" = "yellowclown", - "Rhubarb Rubber" = "purpleclown" - ) + obj_flags = parent_type::obj_flags -/obj/item/clothing/mask/gas/bubber/clown/reskin_obj(mob/user) +/obj/item/clothing/mask/gas/bubber/clown/Initialize(mapload) . = ..() - user.update_worn_mask() - voice_filter = null // performer masks expect to be talked through + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/coloured_clown_mask, infinite = TRUE) + RegisterSignal(src, COMSIG_OBJ_RESKIN, PROC_REF(on_reskin)) +/datum/atom_skin/coloured_clown_mask + abstract_type = /datum/atom_skin/coloured_clown_mask + +/datum/atom_skin/coloured_clown_mask/down_clown + preview_name = "Down Clown" + new_icon_state = "blueclown" + +/datum/atom_skin/coloured_clown_mask/jumbo + preview_name = "Jumbo" + new_icon_state = "greenclown" + +/datum/atom_skin/coloured_clown_mask/stepchild + preview_name = "Stepchild" + new_icon_state = "redclown" + +/datum/atom_skin/coloured_clown_mask/banana_brained + preview_name = "Banana Brained" + new_icon_state = "yellowclown" + +/datum/atom_skin/coloured_clown_mask/rhubarb_rubber + preview_name = "Rhubarb Rubber" + new_icon_state = "purpleclown" + +/obj/item/clothing/mask/gas/bubber/clown/proc/on_reskin(datum/source, skin_name) + SIGNAL_HANDLER + if(ismob(loc)) + var/mob/clown = loc + clown.update_worn_mask() + voice_filter = null // performer masks expect to be talked through /obj/item/clothing/mask/gas/half_mask name = "tacticool neck gaiter" diff --git a/modular_zubbers/code/modules/clothing/neck/collars.dm b/modular_zubbers/code/modules/clothing/neck/collars.dm index f04b215b04e..4bf4321ca3b 100644 --- a/modular_zubbers/code/modules/clothing/neck/collars.dm +++ b/modular_zubbers/code/modules/clothing/neck/collars.dm @@ -23,7 +23,6 @@ greyscale_config_inhand_right = /datum/greyscale_config/collar/gps/righthand greyscale_colors = "#8B96B7#505665" flags_1 = IS_PLAYER_COLORABLE_1 - unique_reskin = null resistance_flags = FIRE_PROOF /obj/item/clothing/neck/kink_collar/locked/gps/Initialize(mapload) @@ -33,6 +32,9 @@ register_context() update_icon(UPDATE_OVERLAYS) RegisterSignal(src, COMSIG_NAME_CHANGED, PROC_REF(on_update_name)) + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/neck/kink_collar/locked/gps/proc/on_update_name() SIGNAL_HANDLER diff --git a/modular_zubbers/code/modules/clothing/neck/neck.dm b/modular_zubbers/code/modules/clothing/neck/neck.dm index a56e88d6b26..c60055e0421 100644 --- a/modular_zubbers/code/modules/clothing/neck/neck.dm +++ b/modular_zubbers/code/modules/clothing/neck/neck.dm @@ -651,16 +651,42 @@ greyscale_colors = null greyscale_config = null greyscale_config_worn = null - obj_flags = UNIQUE_RENAME | INFINITE_RESKIN - unique_reskin = list( - "Rainbow Scarf" = "scarf_rainbow", - "Bisexual Scarf" = "scarf_bi", - "Pansexual Scarf" = "scarf_pan", - "Asexual Scarf" = "scarf_ace", - "Gay Scarf" = "scarf_gay", - "Transgender Scarf" = "scarf_trans", - "Lesbian Scarf" = "scarf_lesbian", - ) + obj_flags = UNIQUE_RENAME + +/obj/item/clothing/neck/scarf/pride/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/pride_scarf, infinite = TRUE) + +/datum/atom_skin/pride_scarf + abstract_type = /datum/atom_skin/pride_scarf + +/datum/atom_skin/pride_scarf/rainbow + preview_name = "Rainbow Scarf" + new_icon_state = "scarf_rainbow" + +/datum/atom_skin/pride_scarf/bisexual + preview_name = "Bisexual Scarf" + new_icon_state = "scarf_bi" + +/datum/atom_skin/pride_scarf/pansexual + preview_name = "Pansexual Scarf" + new_icon_state = "scarf_pan" + +/datum/atom_skin/pride_scarf/asexual + preview_name = "Asexual Scarf" + new_icon_state = "scarf_ace" + +/datum/atom_skin/pride_scarf/gay + preview_name = "Gay Scarf" + new_icon_state = "scarf_gay" + +/datum/atom_skin/pride_scarf/transgender + preview_name = "Transgender Scarf" + new_icon_state = "scarf_trans" + +/datum/atom_skin/pride_scarf/lesbian + preview_name = "Lesbian Scarf" + new_icon_state = "scarf_lesbian" //Shadekin Fur Scarf Sprites by Boviro of Bubberstation /obj/item/clothing/neck/scarf/shadekin diff --git a/modular_zubbers/code/modules/clothing/shoes/boots.dm b/modular_zubbers/code/modules/clothing/shoes/boots.dm index d96ef50e643..7edf478b0a4 100644 --- a/modular_zubbers/code/modules/clothing/shoes/boots.dm +++ b/modular_zubbers/code/modules/clothing/shoes/boots.dm @@ -317,8 +317,12 @@ worn_icon = 'modular_zubbers/icons/mob/clothing/feet/feet.dmi' worn_icon_digi = 'modular_zubbers/icons/mob/clothing/feet/feet_digi.dmi' icon_state = "heel-jackboots" - uses_advanced_reskins = FALSE - unique_reskin = NONE + +/obj/item/clothing/shoes/jackboots/heel/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) // Diesel Boots | Sprites by Fluff from Bad Deathclaw /obj/item/clothing/shoes/jackboots/diesel_m diff --git a/modular_zubbers/code/modules/clothing/suits/armor.dm b/modular_zubbers/code/modules/clothing/suits/armor.dm index b383c5e93af..778a23b6d17 100644 --- a/modular_zubbers/code/modules/clothing/suits/armor.dm +++ b/modular_zubbers/code/modules/clothing/suits/armor.dm @@ -6,22 +6,25 @@ icon_state = "vest_worn" inhand_icon_state = null armor_type = /datum/armor/suit_armor - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Pattern" = list( - RESKIN_ICON_STATE = "vest_worn_red", - RESKIN_WORN_ICON_STATE = "vest_worn_red" - ), - "Neutral Pattern" = list( - RESKIN_ICON_STATE = "vest_worn", - RESKIN_WORN_ICON_STATE = "vest_worn", - ), - "Blue Pattern" = list( - RESKIN_ICON_STATE = "vest_worn_blue", - RESKIN_WORN_ICON_STATE = "vest_worn_blue", - RESKIN_SUPPORTS_VARIATIONS_FLAGS = NONE - ) - ) + +/datum/atom_skin/collared_vest + abstract_type = /datum/atom_skin/collared_vest + +/datum/atom_skin/collared_vest/red + preview_name = "Red Pattern" + new_icon_state = "vest_worn_red" + +/datum/atom_skin/collared_vest/neutral + preview_name = "Neutral Pattern" + new_icon_state = "vest_worn" + +/datum/atom_skin/collared_vest/blue + preview_name = "Blue Pattern" + new_icon_state = "vest_worn_blue" + +/obj/item/clothing/suit/armor/vest/collared_vest/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/collared_vest) /obj/item/clothing/suit/armor/vest/secjacket // Port from TG Station (DrTuxedo) name = "security jacket" @@ -118,34 +121,38 @@ icon = 'modular_zubbers/icons/obj/clothing/suits/armor.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/suits/armor.dmi' icon_state = "civilprotection" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Metro Cop" = list( - RESKIN_ICON_STATE = "civilprotection", - RESKIN_WORN_ICON_STATE = "civilprotection" - ), - "MetroCop Coat" = list( - RESKIN_ICON_STATE = "cp_trenchcoat", - RESKIN_WORN_ICON_STATE = "cp_trenchcoat" - ), - "Medic" = list( - RESKIN_ICON_STATE = "medicalofficer", - RESKIN_WORN_ICON_STATE = "medicalofficer" - ), - "Red Trim" = list( - RESKIN_ICON_STATE = "dv_vest", - RESKIN_WORN_ICON_STATE = "dv_vest" - ), - "White Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_white", - RESKIN_WORN_ICON_STATE = "overwatch_white" - ), - "Overwatch" = list( - RESKIN_ICON_STATE = "overwatch", - RESKIN_WORN_ICON_STATE = "overwatch" - ), - "Red Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_red", - RESKIN_WORN_ICON_STATE = "overwatch_red" - ), - ) + +/obj/item/clothing/suit/armor/vest/alt/sec/metrocop/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/metrocop_armor) + +/datum/atom_skin/metrocop_armor + abstract_type = /datum/atom_skin/metrocop_armor + +/datum/atom_skin/metrocop_armor/metro_cop + preview_name = "Metro Cop" + new_icon_state = "civilprotection" + +/datum/atom_skin/metrocop_armor/metro_coat + preview_name = "MetroCop Coat" + new_icon_state = "cp_trenchcoat" + +/datum/atom_skin/metrocop_armor/medic + preview_name = "Medic" + new_icon_state = "medicalofficer" + +/datum/atom_skin/metrocop_armor/red_trim + preview_name = "Red Trim" + new_icon_state = "dv_vest" + +/datum/atom_skin/metrocop_armor/overwatch_white + preview_name = "White Overwatch" + new_icon_state = "overwatch_white" + +/datum/atom_skin/metrocop_armor/overwatch + preview_name = "Overwatch" + new_icon_state = "overwatch" + +/datum/atom_skin/metrocop_armor/overwatch_red + preview_name = "Red Overwatch" + new_icon_state = "overwatch_red" diff --git a/modular_zubbers/code/modules/clothing/under/security.dm b/modular_zubbers/code/modules/clothing/under/security.dm index 873278c0764..4941731266f 100644 --- a/modular_zubbers/code/modules/clothing/under/security.dm +++ b/modular_zubbers/code/modules/clothing/under/security.dm @@ -31,30 +31,33 @@ icon_state = "civilprotection" inhand_icon_state = null can_adjust = FALSE - uses_advanced_reskins = TRUE - unique_reskin = list( - "MetroCop" = list( - RESKIN_ICON_STATE = "civilprotection", - RESKIN_WORN_ICON_STATE = "civilprotection" - ), - "Red" = list( - RESKIN_ICON_STATE = "divisionallead", - RESKIN_WORN_ICON_STATE = "divisionallead" - ), - "White Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_white", - RESKIN_WORN_ICON_STATE = "overwatch_white" - ), - "Overwatch" = list( - RESKIN_ICON_STATE = "overwatch", - RESKIN_WORN_ICON_STATE = "overwatch" - ), - "Red Overwatch" = list( - RESKIN_ICON_STATE = "overwatch_red", - RESKIN_WORN_ICON_STATE = "overwatch_red" - ), - ) +/obj/item/clothing/under/rank/security/metrocop/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/metrocop) + +/datum/atom_skin/metrocop + abstract_type = /datum/atom_skin/metrocop + +/datum/atom_skin/metrocop/metro + preview_name = "MetroCop" + new_icon_state = "civilprotection" + +/datum/atom_skin/metrocop/red + preview_name = "Red" + new_icon_state = "divisionallead" + +/datum/atom_skin/metrocop/overwatch_white + preview_name = "White Overwatch" + new_icon_state = "overwatch_white" + +/datum/atom_skin/metrocop/overwatch + preview_name = "Overwatch" + new_icon_state = "overwatch" + +/datum/atom_skin/metrocop/overwatch_red + preview_name = "Red Overwatch" + new_icon_state = "overwatch_red" //MGS stuff sprited by Crumpaloo for onlyplateau, please credit when porting, which you obviously have permission to do. /obj/item/clothing/under/rank/security/snake @@ -63,7 +66,6 @@ icon = 'modular_zubbers/icons/obj/clothing/under/syndicate.dmi' worn_icon = 'modular_zubbers/icons/mob/clothing/under/syndicate.dmi' icon_state = "snake" - uses_advanced_reskins = FALSE /obj/item/clothing/under/rank/security/camo name = "armored camouflage uniform" @@ -79,4 +81,3 @@ greyscale_colors = "#A53228#333333#292929" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION can_adjust = FALSE - uses_advanced_reskins = FALSE diff --git a/modular_zubbers/code/modules/clothing/under/skirts_dresses.dm b/modular_zubbers/code/modules/clothing/under/skirts_dresses.dm index 7b53d917be5..f0d1533ea67 100644 --- a/modular_zubbers/code/modules/clothing/under/skirts_dresses.dm +++ b/modular_zubbers/code/modules/clothing/under/skirts_dresses.dm @@ -41,9 +41,22 @@ can_adjust = FALSE alternate_worn_layer = ABOVE_SHOES_LAYER gets_cropped_on_taurs = FALSE - unique_reskin = list( - "Right" = "midnight_right", - "Left" = "midnight_left", - "Middle" = "midnight_mid" - ) +/obj/item/clothing/under/dress/bubber/midnight_gown/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/midnight_gown) + +/datum/atom_skin/midnight_gown + abstract_type = /datum/atom_skin/midnight_gown + +/datum/atom_skin/midnight_gown/right + preview_name = "Right" + new_icon_state = "midnight_right" + +/datum/atom_skin/midnight_gown/left + preview_name = "Left" + new_icon_state = "midnight_left" + +/datum/atom_skin/midnight_gown/middle + preview_name = "Middle" + new_icon_state = "midnight_mid" diff --git a/modular_zubbers/code/modules/debug_tools/toolgun_module/phys_build.dm b/modular_zubbers/code/modules/debug_tools/toolgun_module/phys_build.dm index e66ab41d314..b16c627f4ae 100644 --- a/modular_zubbers/code/modules/debug_tools/toolgun_module/phys_build.dm +++ b/modular_zubbers/code/modules/debug_tools/toolgun_module/phys_build.dm @@ -18,13 +18,13 @@ return FALSE var/list/pick = list() if(choised_mode == "Wall mode") - pick = init_paths(/turf/closed/wall) + pick = init_subtypes_w_path_keys(/turf/closed/wall) if(choised_mode == "Turf mode") - pick = init_paths(/turf/open) + pick = init_subtypes_w_path_keys(/turf/open) for(var/turf/open/space/T in pick) pick -= T if(choised_mode == "Structure mode") - pick = init_paths(/obj/machinery/door) + pick = init_subtypes_w_path_keys(/obj/machinery/door) selected_atom = tgui_input_list(user, "Selected object:", "Toolgun work", pick) return TRUE diff --git a/modular_zubbers/code/modules/item_reskins/plastic.dm b/modular_zubbers/code/modules/item_reskins/plastic.dm index 57ff5ba0c8a..c9bd7add796 100644 --- a/modular_zubbers/code/modules/item_reskins/plastic.dm +++ b/modular_zubbers/code/modules/item_reskins/plastic.dm @@ -1,11 +1,15 @@ -/obj/item/grenade/c4 - uses_advanced_reskins = TRUE - unique_reskin = list( - "Moth" = list( - RESKIN_ICON = 'modular_zubbers/code/modules/item_reskins/mothbomb.dmi', - RESKIN_ICON_STATE= "moffplush_bomb", - ), - "C4" = list( - RESKIN_ICON_STATE = "plastic-explosive0", - ), - ) +/obj/item/grenade/c4/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/c4) + +/datum/atom_skin/c4 + abstract_type = /datum/atom_skin/c4 + +/datum/atom_skin/c4/moth + preview_name = "Moth" + new_icon = 'modular_zubbers/code/modules/item_reskins/mothbomb.dmi' + new_icon_state = "moffplush_bomb" + +/datum/atom_skin/c4/default + preview_name = "C4" + new_icon_state = "plastic-explosive0" diff --git a/modular_zubbers/code/modules/loadout/categories/gloves.dm b/modular_zubbers/code/modules/loadout/categories/gloves.dm index 3d9bd5b028f..8cd6f7ec204 100644 --- a/modular_zubbers/code/modules/loadout/categories/gloves.dm +++ b/modular_zubbers/code/modules/loadout/categories/gloves.dm @@ -114,7 +114,6 @@ name = "Security Gloves" item_path = /obj/item/clothing/gloves/color/black/security restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/gloves/combat/peacekeeper/armadyne name = "Armadyne Combat Gloves" @@ -147,7 +146,6 @@ /datum/loadout_item/gloves/elofy name = "Solar Admiral Gloves" item_path = /obj/item/clothing/gloves/elofy - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN // ckeywhitelist = list("october23") /datum/loadout_item/gloves/hypnoring_sharkenning diff --git a/modular_zubbers/code/modules/loadout/categories/heads.dm b/modular_zubbers/code/modules/loadout/categories/heads.dm index b836bb5103c..8cd8d77ae71 100644 --- a/modular_zubbers/code/modules/loadout/categories/heads.dm +++ b/modular_zubbers/code/modules/loadout/categories/heads.dm @@ -30,7 +30,6 @@ name = "Police Patrol Cap" item_path = /obj/item/clothing/head/hats/warden/police/patrol restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/helmet/sec/futuristic name = "Futuristic Security Helmet" @@ -69,31 +68,26 @@ name = "Security Garrison Cap" item_path = /obj/item/clothing/head/security_garrison restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/security_cap name = "Security Cap" item_path = /obj/item/clothing/head/security_cap restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/security_cap/soft name = "Security Soft Cap" item_path = /obj/item/clothing/head/soft/sec restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags & ~LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/security_cap/veteran name = "Veteran's Soft Security Cap" item_path = /obj/item/clothing/head/soft/veteran restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags & ~LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/security_cap/colonial name = "Imperial Police Cap" item_path = /obj/item/clothing/head/hats/colonial/nri_police restricted_roles = list(ALL_JOBS_SEC, JOB_CUSTOMS_AGENT) - loadout_flags = parent_type::loadout_flags & ~LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/security_beanie name = "Security Beanie" @@ -119,7 +113,6 @@ name = "Warden's Police Cap" item_path = /obj/item/clothing/head/hats/warden/police/patrol restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/helmet/sec/redsec name = "Security Red Helmet" @@ -135,7 +128,6 @@ name = "Security Kepi" item_path = /obj/item/clothing/head/security_kepi restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/head/beret/sec/peacekeeper/armadyne name = "Armadyne Corporate Beret" diff --git a/modular_zubbers/code/modules/loadout/categories/neck.dm b/modular_zubbers/code/modules/loadout/categories/neck.dm index 139143f1308..7116ba19344 100644 --- a/modular_zubbers/code/modules/loadout/categories/neck.dm +++ b/modular_zubbers/code/modules/loadout/categories/neck.dm @@ -21,13 +21,11 @@ name = "Security Cape" item_path = /obj/item/clothing/neck/security_cape restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/neck/security_cape/armplate name = "Security Gauntlet" item_path = /obj/item/clothing/neck/security_cape/armplate restricted_roles = list(ALL_JOBS_SEC) - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/neck/pauldron name = "Lieutenant Commander's Pauldron" @@ -56,7 +54,6 @@ /datum/loadout_item/neck/scarf/pride name = "Pride Scarf" item_path = /obj/item/clothing/neck/scarf/pride - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN /datum/loadout_item/neck/holobadge/hos name = "Head of Security's Holobadge" diff --git a/modular_zubbers/code/modules/loadout/categories/shoes.dm b/modular_zubbers/code/modules/loadout/categories/shoes.dm index 54dd821a4a5..0a54c40d62d 100644 --- a/modular_zubbers/code/modules/loadout/categories/shoes.dm +++ b/modular_zubbers/code/modules/loadout/categories/shoes.dm @@ -90,7 +90,6 @@ /datum/loadout_item/shoes/boots/elofy name = "Solar Admiral Boots" item_path = /obj/item/clothing/shoes/jackboots/elofy - loadout_flags = parent_type::loadout_flags | LOADOUT_FLAG_ALLOW_RESKIN // ckeywhitelist = list("october23") /* diff --git a/modular_zubbers/code/modules/security/sec_clothing_overrides.dm b/modular_zubbers/code/modules/security/sec_clothing_overrides.dm index 6d7188d4d89..9a6b1ee20b9 100644 --- a/modular_zubbers/code/modules/security/sec_clothing_overrides.dm +++ b/modular_zubbers/code/modules/security/sec_clothing_overrides.dm @@ -27,32 +27,33 @@ righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "backpack_security_black" inhand_icon_state = "backpack_security_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "backpack_security_black", - RESKIN_WORN_ICON_STATE = "backpack_security_black", - RESKIN_INHAND_STATE = "backpack_security_black" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "backpack_security_white", - RESKIN_WORN_ICON_STATE = "backpack_security_white", - RESKIN_INHAND_STATE = "backpack_security_white" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "backpack-security", - RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', - RESKIN_INHAND_L = 'icons/mob/inhands/equipment/backpack_lefthand.dmi', - RESKIN_INHAND_R = 'icons/mob/inhands/equipment/backpack_righthand.dmi', - RESKIN_INHAND_STATE = "securitypack" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi', - RESKIN_ICON_STATE = "backpack-security", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi', - ), - ) + +/obj/item/storage/backpack/security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_backpack) + +/datum/atom_skin/security_backpack + abstract_type = /datum/atom_skin/security_backpack + +/datum/atom_skin/security_backpack/black + preview_name = "Black Variant" + new_icon_state = "backpack_security_black" + +/datum/atom_skin/security_backpack/white + preview_name = "White Variant" + new_icon_state = "backpack_security_white" + +/datum/atom_skin/security_backpack/red + preview_name = "Red Variant" + new_icon = 'icons/obj/storage/backpack.dmi' + new_worn_icon = 'icons/mob/clothing/back/backpack.dmi' + new_icon_state = "backpack-security" + +/datum/atom_skin/security_backpack/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi' + new_icon_state = "backpack-security" /obj/item/storage/backpack/satchel/sec icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' @@ -61,32 +62,33 @@ righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "satchel_security_black" inhand_icon_state = "satchel_security_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "satchel_security_black", - RESKIN_WORN_ICON_STATE = "satchel_security_black", - RESKIN_INHAND_STATE = "satchel_security_black" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "satchel_security_white", - RESKIN_WORN_ICON_STATE = "satchel_security_white", - RESKIN_INHAND_STATE = "satchel_security_white" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "satchel-security", - RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', - RESKIN_INHAND_L = 'icons/mob/inhands/equipment/backpack_lefthand.dmi', - RESKIN_INHAND_R = 'icons/mob/inhands/equipment/backpack_righthand.dmi', - RESKIN_INHAND_STATE = "satchel-sec" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi', - RESKIN_ICON_STATE = "satchel-security", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi', - ), - ) + +/obj/item/storage/backpack/satchel/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_satchel) + +/datum/atom_skin/security_satchel + abstract_type = /datum/atom_skin/security_satchel + +/datum/atom_skin/security_satchel/black + preview_name = "Black Variant" + new_icon_state = "satchel_security_black" + +/datum/atom_skin/security_satchel/white + preview_name = "White Variant" + new_icon_state = "satchel_security_white" + +/datum/atom_skin/security_satchel/red + preview_name = "Red Variant" + new_icon = 'icons/obj/storage/backpack.dmi' + new_worn_icon = 'icons/mob/clothing/back/backpack.dmi' + new_icon_state = "satchel-security" + +/datum/atom_skin/security_satchel/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi' + new_icon_state = "satchel-security" /obj/item/storage/backpack/duffelbag/sec icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' @@ -95,32 +97,33 @@ righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "duffel_security_black" inhand_icon_state = "duffel_security_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "duffel_security_black", - RESKIN_WORN_ICON_STATE = "duffel_security_black", - RESKIN_INHAND_STATE = "duffel_security_black" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "duffel_security_white", - RESKIN_WORN_ICON_STATE = "duffel_security_white", - RESKIN_INHAND_STATE = "duffel_security_white" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/storage/backpack.dmi', - RESKIN_ICON_STATE = "duffel-security", - RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', - RESKIN_INHAND_L = 'icons/mob/inhands/equipment/backpack_lefthand.dmi', - RESKIN_INHAND_R = 'icons/mob/inhands/equipment/backpack_righthand.dmi', - RESKIN_INHAND_STATE = "duffel-sec" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi', - RESKIN_ICON_STATE = "duffel-security", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi', - ), - ) + +/obj/item/storage/backpack/duffelbag/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_duffel) + +/datum/atom_skin/security_duffel + abstract_type = /datum/atom_skin/security_duffel + +/datum/atom_skin/security_duffel/black + preview_name = "Black Variant" + new_icon_state = "duffel_security_black" + +/datum/atom_skin/security_duffel/white + preview_name = "White Variant" + new_icon_state = "duffel_security_white" + +/datum/atom_skin/security_duffel/red + preview_name = "Red Variant" + new_icon = 'icons/obj/storage/backpack.dmi' + new_worn_icon = 'icons/mob/clothing/back/backpack.dmi' + new_icon_state = "duffel-security" + +/datum/atom_skin/security_duffel/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/back/backpack.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/back/backpack.dmi' + new_icon_state = "duffel-security" /* * BELTS @@ -130,68 +133,93 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' icon_state = "belt_white" worn_icon_state = "belt_white" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "belt_black", - RESKIN_WORN_ICON_STATE = "belt_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "belt_blue", - RESKIN_WORN_ICON_STATE = "belt_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "belt_white", - RESKIN_WORN_ICON_STATE = "belt_white" - ), - "Slim Variant" = list( - RESKIN_ICON_STATE = "belt_slim", - RESKIN_WORN_ICON_STATE = "belt_slim" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "security", - RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "security", - ), - "Armadyne Variant" = list( - RESKIN_ICON_STATE = "armadyne_belt", - RESKIN_WORN_ICON_STATE = "armadyne_belt" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/belt.dmi', - RESKIN_ICON_STATE = "security", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "security", - ), - ) -/obj/item/storage/belt/security/webbing - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "securitywebbing", - RESKIN_WORN_ICON_STATE = "securitywebbing" - ), - "Black Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "armadyne_webbing", - RESKIN_WORN_ICON_STATE = "armadyne_webbing", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' - ), - "Blue Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "peacekeeper_webbing", - RESKIN_WORN_ICON_STATE = "peacekeeper_webbing", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' - ), - ) +/obj/item/storage/belt/security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_belt) + +/datum/atom_skin/security_belt + abstract_type = /datum/atom_skin/security_belt + +/datum/atom_skin/security_belt/black + preview_name = "Black Variant" + new_icon_state = "belt_black" + +/datum/atom_skin/security_belt/blue + preview_name = "Blue Variant" + new_icon_state = "belt_blue" + +/datum/atom_skin/security_belt/white + preview_name = "White Variant" + new_icon_state = "belt_white" + +/datum/atom_skin/security_belt/slim + preview_name = "Slim Variant" + new_icon_state = "belt_slim" + +/datum/atom_skin/security_belt/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/belts.dmi' + new_worn_icon = 'icons/mob/clothing/belt.dmi' + new_icon_state = "security" + +/datum/atom_skin/security_belt/armadyne + preview_name = "Armadyne Variant" + new_icon_state = "armadyne_belt" + +/datum/atom_skin/security_belt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/belt.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/belt.dmi' + new_icon_state = "security" + +/datum/atom_skin/security_belt/basic + preview_name = "Basic Security" + new_icon_state = "security" + +/datum/atom_skin/security_belt/peacekeeper + preview_name = "Peacekeeper" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/belt.dmi' + new_icon_state = "peacekeeperbelt" + +/obj/item/storage/belt/security/webbing/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_webbing) + +/datum/atom_skin/security_webbing + abstract_type = /datum/atom_skin/security_webbing +/datum/atom_skin/security_webbing/red + preview_name = "Red Variant" + new_icon_state = "securitywebbing" + +/datum/atom_skin/security_webbing/black + preview_name = "Black Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' + new_icon_state = "armadyne_webbing" + +/datum/atom_skin/security_webbing/blue + preview_name = "Blue Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' + new_icon_state = "peacekeeper_webbing" /obj/item/storage/belt/security/webbing/peacekeeper //did I mention this codebase is fucking awful - current_skin = "peacekeeper_webbing" + +/obj/item/storage/belt/security/webbing/peacekeeper/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/belt/security/webbing/peacekeeper/armadyne //You two only exist because I don't want to purge you, because it'd break some stuff. Thin fucking ice. - current_skin = "armadyne_webbing" + +/obj/item/storage/belt/security/webbing/peacekeeper/armadyne/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) ///Enables you to quickdraw weapons from security holsters /datum/storage/security/open_storage(datum/source, mob/user) @@ -226,155 +254,194 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' icon_state = "security_hud" glass_colour_type = /datum/client_colour/glass_colour/lightblue - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "security_hud", - RESKIN_WORN_ICON_STATE = "security_hud" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "securityhud", - RESKIN_WORN_ICON = 'icons/mob/clothing/eyes.dmi', - ), - ) + +/obj/item/clothing/glasses/hud/security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_glasses) + +/datum/atom_skin/security_hud_glasses + abstract_type = /datum/atom_skin/security_hud_glasses + +/datum/atom_skin/security_hud_glasses/blue + preview_name = "Blue Variant" + new_icon_state = "security_hud" + +/datum/atom_skin/security_hud_glasses/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/glasses.dmi' + new_worn_icon = 'icons/mob/clothing/eyes.dmi' + new_icon_state = "securityhud" /obj/item/clothing/glasses/hud/security/sunglasses icon_state = "security_hud_black" glass_colour_type = /datum/client_colour/glass_colour/blue - uses_advanced_reskins = TRUE - unique_reskin = list( - "Dark-Tint Variant" = list( - RESKIN_ICON_STATE = "security_hud_black", - RESKIN_WORN_ICON_STATE = "security_hud_black" - ), - "Light-Tint Variant" = list( - RESKIN_ICON_STATE = "security_hud_blue", - RESKIN_WORN_ICON_STATE = "security_hud_blue" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "sunhudsec", - RESKIN_WORN_ICON = 'icons/mob/clothing/eyes.dmi', - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "sunhudsec", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/eyes.dmi', - ), - "Blue Goggles Variant" = list( - RESKIN_ICON_STATE = "peacekeeperglasses", - RESKIN_WORN_ICON_STATE = "peacekeeperglasses" - ), - "Red Goggles Variant" = list( - RESKIN_ICON_STATE = "armadyne_glasses", - RESKIN_WORN_ICON_STATE = "armadyne_glasses" - ), - "Pink Goggles Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "secgogpink", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "secgogpink", - ), - ) + +/obj/item/clothing/glasses/hud/security/sunglasses/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_sunglasses) + +/datum/atom_skin/security_hud_sunglasses + abstract_type = /datum/atom_skin/security_hud_sunglasses + +/datum/atom_skin/security_hud_sunglasses/dark_tint + preview_name = "Dark-Tint Variant" + new_icon_state = "security_hud_black" + +/datum/atom_skin/security_hud_sunglasses/light_tint + preview_name = "Light-Tint Variant" + new_icon_state = "security_hud_blue" + +/datum/atom_skin/security_hud_sunglasses/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/glasses.dmi' + new_worn_icon = 'icons/mob/clothing/eyes.dmi' + new_icon_state = "sunhudsec" + +/datum/atom_skin/security_hud_sunglasses/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/eyes.dmi' + new_icon_state = "sunhudsec" + +/datum/atom_skin/security_hud_sunglasses/blue_goggles + preview_name = "Blue Goggles Variant" + new_icon_state = "peacekeeperglasses" + +/datum/atom_skin/security_hud_sunglasses/red_goggles + preview_name = "Red Goggles Variant" + new_icon_state = "armadyne_glasses" + +/datum/atom_skin/security_hud_sunglasses/pink_goggles + preview_name = "Pink Goggles Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/eyes.dmi' + new_icon_state = "secgogpink" /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch icon_state = "security_eyepatch" base_icon_state = "security_eyepatch" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Eyepatch" = list( - RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "hudpatch", - RESKIN_WORN_ICON = 'icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "hudpatch" - ), - "Blue Eyepatch" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "hudpatch", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "hudpatch" - ), - "Pink Eyepatch" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "hudpatch", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "hudpatch", - ), - "Fake Blindfold" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "secfold", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "secfold" - ), - ) + +/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_eyepatch) + +/datum/atom_skin/security_hud_eyepatch + abstract_type = /datum/atom_skin/security_hud_eyepatch + +/datum/atom_skin/security_hud_eyepatch/red + preview_name = "Red Eyepatch" + new_icon = 'icons/obj/clothing/glasses.dmi' + new_worn_icon = 'icons/mob/clothing/eyes.dmi' + new_icon_state = "hudpatch" + +/datum/atom_skin/security_hud_eyepatch/blue + preview_name = "Blue Eyepatch" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' + new_icon_state = "hudpatch" + +/datum/atom_skin/security_hud_eyepatch/pink + preview_name = "Pink Eyepatch" + new_icon = 'modular_zubbers/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/eyes.dmi' + new_icon_state = "hudpatch" + +/datum/atom_skin/security_hud_eyepatch/fake_blindfold + preview_name = "Fake Blindfold" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' + new_icon_state = "secfold" /obj/item/clothing/glasses/hud/eyepatch/sec name = "security eyepatch HUD" desc = "Lost your eye beating an innocent clown? Thankfully your corporate overlords have made something to make up for this. May not do well against flashes." clothing_traits = list(TRAIT_SECURITY_HUD) glass_colour_type = /datum/client_colour/glass_colour/blue - unique_reskin = list( - "Blue Eyepatch" = list( - RESKIN_ICON_STATE = "hudpatch", - RESKIN_WORN_ICON_STATE = "hudpatch" - ), - "Red Eyepatch" = list( - RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "hudpatch", - RESKIN_WORN_ICON = 'icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "hudpatch" - ), - "Fake Blindfold" = list( - RESKIN_ICON_STATE = "secfold", - RESKIN_WORN_ICON_STATE = "secfold" - ) - ) + +/obj/item/clothing/glasses/hud/eyepatch/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_eyepatch_simple) + +/datum/atom_skin/security_hud_eyepatch_simple + abstract_type = /datum/atom_skin/security_hud_eyepatch_simple + +/datum/atom_skin/security_hud_eyepatch_simple/blue + preview_name = "Blue Eyepatch" + new_icon_state = "hudpatch" + +/datum/atom_skin/security_hud_eyepatch_simple/red + preview_name = "Red Eyepatch" + new_icon = 'icons/obj/clothing/glasses.dmi' + new_worn_icon = 'icons/mob/clothing/eyes.dmi' + new_icon_state = "hudpatch" + +/datum/atom_skin/security_hud_eyepatch_simple/fake_blindfold + preview_name = "Fake Blindfold" + new_icon_state = "secfold" /obj/item/clothing/glasses/hud/eyepatch/sec/blindfold name = "sec blindfold HUD" desc = "a fake blindfold with a security HUD inside, helps you look like blind justice. This won't provide the same protection that you'd get from sunglasses." icon_state = "secfold" base_icon_state = "secfold" - unique_reskin = null + +/obj/item/clothing/glasses/hud/eyepatch/sec/blindfold/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/glasses/hud/security/night icon = 'icons/obj/clothing/glasses.dmi' worn_icon = 'icons/mob/clothing/eyes.dmi' - unique_reskin = null -/obj/item/clothing/glasses/hud/security/sunglasses/gars - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Gars" = list( - RESKIN_ICON_STATE = "gar_sec", - RESKIN_WORN_ICON_STATE = "gar_sec" - ), - "Blue Gars" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "gar_sec", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "gar_sec" - ), - ) +/obj/item/clothing/glasses/hud/security/night/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) -/obj/item/clothing/glasses/hud/security/sunglasses/gars/giga - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Gars" = list( - RESKIN_ICON_STATE = "gigagar_sec", - RESKIN_WORN_ICON_STATE = "gigagar_sec" - ), - "Blue Gars" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi', - RESKIN_ICON_STATE = "gigagar_sec", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi', - RESKIN_WORN_ICON_STATE = "gigagar_sec" - ), - ) +/obj/item/clothing/glasses/hud/security/sunglasses/gars/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_gars) + +/datum/atom_skin/security_hud_gars + abstract_type = /datum/atom_skin/security_hud_gars + +/datum/atom_skin/security_hud_gars/red + preview_name = "Red Gars" + new_icon_state = "gar_sec" + +/datum/atom_skin/security_hud_gars/blue + preview_name = "Blue Gars" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' + new_icon_state = "gar_sec" + +/obj/item/clothing/glasses/hud/security/sunglasses/gars/giga/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_hud_gars_giga) + +/datum/atom_skin/security_hud_gars_giga + abstract_type = /datum/atom_skin/security_hud_gars_giga + +/datum/atom_skin/security_hud_gars_giga/red + preview_name = "Red Gars" + new_icon_state = "gigagar_sec" + +/datum/atom_skin/security_hud_gars_giga/blue + preview_name = "Blue Gars" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/glasses.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/eyes.dmi' + new_icon_state = "gigagar_sec" /obj/item/clothing/glasses/hud/security/sunglasses/gars/giga/roselia - unique_reskin = null + +/obj/item/clothing/glasses/hud/security/sunglasses/gars/giga/roselia/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * HEAD @@ -389,19 +456,23 @@ clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT dog_fashion = null supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON - uses_advanced_reskins = TRUE - unique_reskin = list( - "White Variant" = list( - RESKIN_ICON_STATE = "security_helmet", - RESKIN_WORN_ICON_STATE = "security_helmet" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/head/helmet.dmi', - RESKIN_ICON_STATE = "helmet", - RESKIN_WORN_ICON_STATE = "helmet", - RESKIN_WORN_ICON = 'icons/mob/clothing/head/helmet.dmi' - ), - ) + +/obj/item/clothing/head/helmet/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_helmet) + +/datum/atom_skin/security_helmet + abstract_type = /datum/atom_skin/security_helmet + +/datum/atom_skin/security_helmet/white + preview_name = "White Variant" + new_icon_state = "security_helmet" + +/datum/atom_skin/security_helmet/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/head/helmet.dmi' + new_worn_icon = 'icons/mob/clothing/head/helmet.dmi' + new_icon_state = "helmet" /obj/item/clothing/head/helmet/sec/click_alt(mob/user) flipped_visor = !flipped_visor @@ -421,22 +492,25 @@ icon_state = "security_helmet_future" base_icon_state = "security_helmet_future" supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON - uses_advanced_reskins = TRUE - unique_reskin = list( - "White Variant" = list( - RESKIN_ICON_STATE = "security_helmet_future", - RESKIN_WORN_ICON_STATE = "security_helmet_future" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "security_helmet_future_blue", - RESKIN_WORN_ICON_STATE = "security_helmet_future_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "security_helmet_future_red", - RESKIN_WORN_ICON_STATE = "security_helmet_future_red" - ), - ) +/obj/item/clothing/head/helmet/sec/futuristic/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_helmet_future) + +/datum/atom_skin/security_helmet_future + abstract_type = /datum/atom_skin/security_helmet_future + +/datum/atom_skin/security_helmet_future/white + preview_name = "White Variant" + new_icon_state = "security_helmet_future" + +/datum/atom_skin/security_helmet_future/blue + preview_name = "Blue Variant" + new_icon_state = "security_helmet_future_blue" + +/datum/atom_skin/security_helmet_future/red + preview_name = "Red Variant" + new_icon_state = "security_helmet_future_red" /obj/item/clothing/head/helmet/sec/futuristic/click_alt(mob/user) flipped_visor = !flipped_visor @@ -458,20 +532,24 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' icon_state = "garrison_black" - uses_advanced_reskins = TRUE armor_type = /datum/armor/head_helmet strip_delay = 60 supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "garrison_black", - RESKIN_WORN_ICON_STATE = "garrison_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "garrison_blue", - RESKIN_WORN_ICON_STATE = "garrison_blue" - ), - ) + +/obj/item/clothing/head/security_garrison/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_garrison_cap) + +/datum/atom_skin/security_garrison_cap + abstract_type = /datum/atom_skin/security_garrison_cap + +/datum/atom_skin/security_garrison_cap/black + preview_name = "Black Variant" + new_icon_state = "garrison_black" + +/datum/atom_skin/security_garrison_cap/blue + preview_name = "Blue Variant" + new_icon_state = "garrison_blue" /obj/item/clothing/head/security_cap name = "security cap" @@ -479,99 +557,123 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' icon_state = "security_cap_black" - uses_advanced_reskins = TRUE armor_type = /datum/armor/head_helmet strip_delay = 60 dog_fashion = null supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "security_cap_black", - RESKIN_WORN_ICON_STATE = "security_cap_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "security_cap_blue", - RESKIN_WORN_ICON_STATE = "security_cap_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "security_cap_white", - RESKIN_WORN_ICON_STATE = "security_cap_white" - ), - "Sol Variant" = list( - RESKIN_ICON_STATE = "policesoft", - RESKIN_WORN_ICON_STATE = "policesoft" - ), - "Sillitoe Variant" = list( - RESKIN_ICON_STATE = "policetrafficsoft", - RESKIN_WORN_ICON_STATE = "policetrafficsoft" - ), - "Cadet Variant" = list( - RESKIN_ICON_STATE = "policecadetsoft", - RESKIN_WORN_ICON_STATE = "policecadetsoft" - ), - ) + +/obj/item/clothing/head/security_cap/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_cap) + +/datum/atom_skin/security_cap + abstract_type = /datum/atom_skin/security_cap + +/datum/atom_skin/security_cap/black + preview_name = "Black Variant" + new_icon_state = "security_cap_black" + +/datum/atom_skin/security_cap/blue + preview_name = "Blue Variant" + new_icon_state = "security_cap_blue" + +/datum/atom_skin/security_cap/white + preview_name = "White Variant" + new_icon_state = "security_cap_white" + +/datum/atom_skin/security_cap/sol + preview_name = "Sol Variant" + new_icon_state = "policesoft" + +/datum/atom_skin/security_cap/sillitoe + preview_name = "Sillitoe Variant" + new_icon_state = "policetrafficsoft" + +/datum/atom_skin/security_cap/cadet + preview_name = "Cadet Variant" + new_icon_state = "policecadetsoft" /obj/item/clothing/head/hats/warden icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' icon_state = "policehelm" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Cap" = list( - RESKIN_ICON_STATE = "policehelm", - RESKIN_WORN_ICON_STATE = "policehelm" - ), - "Sol Cap" = list( - RESKIN_ICON_STATE = "policewardencap", - RESKIN_WORN_ICON_STATE = "policewardencap" - ), - "Red Cap" = list( - RESKIN_ICON_STATE = "wardenhat", - RESKIN_WORN_ICON_STATE = "wardenhat" - ), - ) + +/obj/item/clothing/head/hats/warden/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/warden_hat) + +/datum/atom_skin/warden_hat + abstract_type = /datum/atom_skin/warden_hat + +/datum/atom_skin/warden_hat/blue + preview_name = "Blue Cap" + new_icon_state = "policehelm" + +/datum/atom_skin/warden_hat/sol + preview_name = "Sol Cap" + new_icon_state = "policewardencap" + +/datum/atom_skin/warden_hat/red + preview_name = "Red Cap" + new_icon_state = "wardenhat" /obj/item/clothing/head/hats/warden/red - unique_reskin = null + +/obj/item/clothing/head/hats/warden/red/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/head/hats/warden/drill - unique_reskin = null +/obj/item/clothing/head/hats/warden/drill/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) -/obj/item/clothing/head/hats/hos/cap - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Cap" = list( - RESKIN_ICON_STATE = "hoscap", - RESKIN_WORN_ICON_STATE = "hoscap" - ), - "Blue Cap" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "hoscap_blue", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "hoscap_blue" - ), - "Sol Cap" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "policechiefcap", - RESKIN_WORN_ICON_STATE = "policechiefcap" - ), - "Sheriff Hat" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "cowboyhat_black", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "cowboyhat_black" - ), - "Wide Sheriff Hat" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi', - RESKIN_ICON_STATE = "cowboy_black", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi', - RESKIN_WORN_ICON_STATE = "cowboy_black" - ), - ) +/obj/item/clothing/head/hats/hos/cap/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_cap) + +/datum/atom_skin/hos_cap + abstract_type = /datum/atom_skin/hos_cap + +/datum/atom_skin/hos_cap/red + preview_name = "Red Cap" + new_icon_state = "hoscap" + +/datum/atom_skin/hos_cap/blue + preview_name = "Blue Cap" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' + new_icon_state = "hoscap_blue" + +/datum/atom_skin/hos_cap/sol + preview_name = "Sol Cap" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' + new_icon_state = "policechiefcap" + +/datum/atom_skin/hos_cap/sheriff + preview_name = "Sheriff Hat" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' + new_icon_state = "cowboyhat_black" + +/datum/atom_skin/hos_cap/wide_sheriff + preview_name = "Wide Sheriff Hat" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' + new_icon_state = "cowboy_black" /obj/item/clothing/head/hats/hos/cap/syndicate - unique_reskin = null + +/obj/item/clothing/head/hats/hos/cap/syndicate/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * NECK @@ -580,17 +682,21 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/neck.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/neck.dmi' icon_state = "hoscloak_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Cape" = list( - RESKIN_ICON_STATE = "hoscloak_blue", - RESKIN_WORN_ICON_STATE = "hoscloak_blue" - ), - "Red Cape" = list( - RESKIN_ICON_STATE = "hoscloak", - RESKIN_WORN_ICON_STATE = "hoscloak" - ), - ) + +/obj/item/clothing/neck/cloak/hos/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_cloak) + +/datum/atom_skin/hos_cloak + abstract_type = /datum/atom_skin/hos_cloak + +/datum/atom_skin/hos_cloak/blue + preview_name = "Blue Cape" + new_icon_state = "hoscloak_blue" + +/datum/atom_skin/hos_cloak/red + preview_name = "Red Cape" + new_icon_state = "hoscloak" //Not technically an override but oh well /obj/item/clothing/neck/security_cape @@ -600,51 +706,59 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/neck.dmi' icon_state = "cape_black" inhand_icon_state = "" //no unique inhands - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "cape_black", - RESKIN_WORN_ICON_STATE = "cape_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "cape_blue", - RESKIN_WORN_ICON_STATE = "cape_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "cape_white", - RESKIN_WORN_ICON_STATE = "cape_white" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "cape_red", - RESKIN_WORN_ICON_STATE = "cape_red" - ), - ) ///Decides the shoulder it lays on, false = RIGHT, TRUE = LEFT var/swapped = FALSE +/obj/item/clothing/neck/security_cape/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_cape) + +/datum/atom_skin/security_cape + abstract_type = /datum/atom_skin/security_cape + +/datum/atom_skin/security_cape/black + preview_name = "Black Variant" + new_icon_state = "cape_black" + +/datum/atom_skin/security_cape/blue + preview_name = "Blue Variant" + new_icon_state = "cape_blue" + +/datum/atom_skin/security_cape/white + preview_name = "White Variant" + new_icon_state = "cape_white" + +/datum/atom_skin/security_cape/red + preview_name = "Red Variant" + new_icon_state = "cape_red" + /obj/item/clothing/neck/security_cape/armplate name = "security gauntlet" desc = "A fashionable full-arm gauntlet worn by security officers. The gauntlet itself is made of plastic, and provides no protection, but it looks cool as hell." icon_state = "armplate_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "armplate_black", - RESKIN_WORN_ICON_STATE = "armplate_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "armplate_blue", - RESKIN_WORN_ICON_STATE = "armplate_blue" - ), - "Capeless Variant" = list( - RESKIN_ICON_STATE = "armplate", - RESKIN_WORN_ICON_STATE = "armplate" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "armplate_red", - RESKIN_WORN_ICON_STATE = "armplate_red" - ), - ) + +/obj/item/clothing/neck/security_cape/armplate/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_armplate) + +/datum/atom_skin/security_armplate + abstract_type = /datum/atom_skin/security_armplate + +/datum/atom_skin/security_armplate/black + preview_name = "Black Variant" + new_icon_state = "armplate_black" + +/datum/atom_skin/security_armplate/blue + preview_name = "Blue Variant" + new_icon_state = "armplate_blue" + +/datum/atom_skin/security_armplate/capeless + preview_name = "Capeless Variant" + new_icon_state = "armplate" + +/datum/atom_skin/security_armplate/red + preview_name = "Red Variant" + new_icon_state = "armplate_red" /obj/item/clothing/neck/security_cape/click_alt(mob/user) swapped = !swapped @@ -670,43 +784,47 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' icon_state = "gloves_white" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "gloves_black", - RESKIN_WORN_ICON_STATE = "gloves_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "gloves_blue", - RESKIN_WORN_ICON_STATE = "gloves_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "gloves_white", - RESKIN_WORN_ICON_STATE = "gloves_white" - ), - "Armadyne Variant" = list( - RESKIN_ICON_STATE = "armadyne_gloves", - RESKIN_WORN_ICON_STATE = "armadyne_gloves" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/gloves.dmi', - RESKIN_ICON_STATE = "sec", - RESKIN_WORN_ICON_STATE = "sec", - RESKIN_WORN_ICON = 'icons/mob/clothing/hands.dmi', - ), - "Peacekeeper Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi', - RESKIN_ICON_STATE = "peacekeeper_gloves", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi', - RESKIN_WORN_ICON_STATE = "peacekeeper", - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/gloves.dmi', - RESKIN_ICON_STATE = "sec_gloves", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/hands.dmi', - RESKIN_WORN_ICON_STATE = "sec_gloves", - ), - ) + +/obj/item/clothing/gloves/color/black/security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_gloves) + +/datum/atom_skin/security_gloves + abstract_type = /datum/atom_skin/security_gloves + +/datum/atom_skin/security_gloves/black + preview_name = "Black Variant" + new_icon_state = "gloves_black" + +/datum/atom_skin/security_gloves/blue + preview_name = "Blue Variant" + new_icon_state = "gloves_blue" + +/datum/atom_skin/security_gloves/white + preview_name = "White Variant" + new_icon_state = "gloves_white" + +/datum/atom_skin/security_gloves/armadyne + preview_name = "Armadyne Variant" + new_icon_state = "armadyne_gloves" + +/datum/atom_skin/security_gloves/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/gloves.dmi' + new_worn_icon = 'icons/mob/clothing/hands.dmi' + new_icon_state = "sec" + +/datum/atom_skin/security_gloves/peacekeeper + preview_name = "Peacekeeper Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' + new_icon_state = "peacekeeper_gloves" + +/datum/atom_skin/security_gloves/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/gloves.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/hands.dmi' + new_icon_state = "sec_gloves" /obj/item/clothing/gloves/color/black/security/blu // Wait why these a subtype of black?!? Who did this icon = 'icons/obj/clothing/gloves.dmi' @@ -716,71 +834,84 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' icon_state = "tackle_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "combat", - RESKIN_WORN_ICON_STATE = "combat" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "tackle_blue", - RESKIN_WORN_ICON_STATE = "tackle_blue" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/gloves.dmi', - RESKIN_WORN_ICON = 'icons/mob/clothing/hands.dmi', - RESKIN_ICON_STATE = "gorilla", - RESKIN_WORN_ICON_STATE = "gorilla" - ), - ) + +/obj/item/clothing/gloves/tackler/security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_tackler_gloves) + +/datum/atom_skin/security_tackler_gloves + abstract_type = /datum/atom_skin/security_tackler_gloves + +/datum/atom_skin/security_tackler_gloves/black + preview_name = "Black Variant" + new_icon_state = "combat" + +/datum/atom_skin/security_tackler_gloves/blue + preview_name = "Blue Variant" + new_icon_state = "tackle_blue" + +/datum/atom_skin/security_tackler_gloves/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/gloves.dmi' + new_worn_icon = 'icons/mob/clothing/hands.dmi' + new_icon_state = "gorilla" /obj/item/clothing/gloves/tackler/combat icon = 'icons/obj/clothing/gloves.dmi' worn_icon = 'icons/mob/clothing/hands.dmi' icon_state = "gorilla" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi', - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi', - RESKIN_ICON_STATE = "combat", - RESKIN_WORN_ICON_STATE = "combat" - ), - "Blue Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi', - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi', - RESKIN_ICON_STATE = "tackle_blue", - RESKIN_WORN_ICON_STATE = "tackle_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "gorilla", - RESKIN_WORN_ICON_STATE = "gorilla" - ), - ) + +/obj/item/clothing/gloves/tackler/combat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/combat_tackler_gloves) + +/datum/atom_skin/combat_tackler_gloves + abstract_type = /datum/atom_skin/combat_tackler_gloves + +/datum/atom_skin/combat_tackler_gloves/black + preview_name = "Black Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' + new_icon_state = "combat" + +/datum/atom_skin/combat_tackler_gloves/blue + preview_name = "Blue Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' + new_icon_state = "tackle_blue" + +/datum/atom_skin/combat_tackler_gloves/red + preview_name = "Red Variant" + new_icon_state = "gorilla" /obj/item/clothing/gloves/kaza_ruk/sec icon = 'modular_skyrat/master_files/icons/obj/clothing/gloves.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/hands.dmi' icon_state = "fightgloves_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "fightgloves_black", - RESKIN_WORN_ICON_STATE = "fightgloves_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "fightgloves_blue", - RESKIN_WORN_ICON_STATE = "fightgloves_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "fightgloves", - RESKIN_WORN_ICON_STATE = "fightgloves" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "fightgloves_white", - RESKIN_WORN_ICON_STATE = "fightgloves_white" - ), - ) + +/obj/item/clothing/gloves/kaza_ruk/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_kaza_ruk_gloves) + +/datum/atom_skin/security_kaza_ruk_gloves + abstract_type = /datum/atom_skin/security_kaza_ruk_gloves + +/datum/atom_skin/security_kaza_ruk_gloves/black + preview_name = "Black Variant" + new_icon_state = "fightgloves_black" + +/datum/atom_skin/security_kaza_ruk_gloves/blue + preview_name = "Blue Variant" + new_icon_state = "fightgloves_blue" + +/datum/atom_skin/security_kaza_ruk_gloves/red + preview_name = "Red Variant" + new_icon_state = "fightgloves" + +/datum/atom_skin/security_kaza_ruk_gloves/white + preview_name = "White Variant" + new_icon_state = "fightgloves_white" + /* * SUITS */ @@ -790,72 +921,85 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' icon_state = "vest_white" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "vest_black", - RESKIN_WORN_ICON_STATE = "vest_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "vest_blue", - RESKIN_WORN_ICON_STATE = "vest_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "vest_white", - RESKIN_WORN_ICON_STATE = "vest_white" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "armor_sec", - RESKIN_WORN_ICON_STATE = "armor_sec", - RESKIN_WORN_ICON = 'icons/mob/clothing/suits/armor.dmi', - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "armor_sec", - RESKIN_WORN_ICON_STATE = "armor_sec", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/suits/armor.dmi', - ), - "Armadyne Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "armadyne_armor", - RESKIN_WORN_ICON_STATE = "armadyne_armor", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - ), - ) + +/obj/item/clothing/suit/armor/vest/alt/sec/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_armor_vest_alt) + +/datum/atom_skin/security_armor_vest_alt + abstract_type = /datum/atom_skin/security_armor_vest_alt + +/datum/atom_skin/security_armor_vest_alt/black + preview_name = "Black Variant" + new_icon_state = "vest_black" + +/datum/atom_skin/security_armor_vest_alt/blue + preview_name = "Blue Variant" + new_icon_state = "vest_blue" + +/datum/atom_skin/security_armor_vest_alt/white + preview_name = "White Variant" + new_icon_state = "vest_white" + +/datum/atom_skin/security_armor_vest_alt/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/suits/armor.dmi' + new_worn_icon = 'icons/mob/clothing/suits/armor.dmi' + new_icon_state = "armor_sec" + +/datum/atom_skin/security_armor_vest_alt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/suits/armor.dmi' + new_worn_icon = 'modular_zubbers/icons/mob/clothing/suits/armor.dmi' + new_icon_state = "armor_sec" + +/datum/atom_skin/security_armor_vest_alt/armadyne + preview_name = "Armadyne Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' + new_icon_state = "armadyne_armor" /obj/item/clothing/suit/armor/hos supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - uses_advanced_reskins = TRUE - unique_reskin = list( - "Greatcoat" = list( - RESKIN_ICON = 'icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "hos", - RESKIN_WORN_ICON = 'icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "hos" - ), - "Trenchcoat" = list( - RESKIN_ICON = 'icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "hostrench", - RESKIN_WORN_ICON = 'icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "hostrench" - ), - "Trenchcloak" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "trenchcloak", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "trenchcloak" - ), - "White" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi', - RESKIN_ICON_STATE = "peacekeeper_trench_hos_white", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi', - RESKIN_WORN_ICON_STATE = "peacekeeper_trench_hos_white" - ), - ) + +/obj/item/clothing/suit/armor/hos/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_armor) + +/datum/atom_skin/hos_armor + abstract_type = /datum/atom_skin/hos_armor + +/datum/atom_skin/hos_armor/greatcoat + preview_name = "Greatcoat" + new_icon = 'icons/obj/clothing/suits/armor.dmi' + new_worn_icon = 'icons/mob/clothing/suits/armor.dmi' + new_icon_state = "hos" + +/datum/atom_skin/hos_armor/trenchcoat + preview_name = "Trenchcoat" + new_icon = 'icons/obj/clothing/suits/armor.dmi' + new_worn_icon = 'icons/mob/clothing/suits/armor.dmi' + new_icon_state = "hostrench" + +/datum/atom_skin/hos_armor/trenchcloak + preview_name = "Trenchcloak" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' + new_icon_state = "trenchcloak" + +/datum/atom_skin/hos_armor/white + preview_name = "White" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi' + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' + new_icon_state = "peacekeeper_trench_hos_white" /obj/item/clothing/suit/armor/hos/trenchcoat/winter - current_skin = "hoswinter" //prevents reskinning + +/obj/item/clothing/suit/armor/hos/trenchcoat/winter/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) //Standard Bulletproof Vest /obj/item/clothing/suit/armor/bulletproof @@ -897,49 +1041,56 @@ heat_protection = CHEST|ARMS //Warden's Vest -/obj/item/clothing/suit/armor/vest/warden - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "warden_jacket", - RESKIN_WORN_ICON_STATE = "warden_jacket" - ), - "Blue Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "vest_warden", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "vest_warden" - ), - "Black Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "peacekeeper_trench_warden", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "peacekeeper_trench_warden" - ), - "Edgy Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "warden_syndie", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "warden_syndie" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "warden_jacket", - RESKIN_WORN_ICON_STATE = "warden_jacket", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/suits/armor.dmi', - ), - "Basic Warden Armor" = list( - RESKIN_ICON = 'icons/obj/clothing/suits/armor.dmi', - RESKIN_ICON_STATE = "warden_alt", - RESKIN_WORN_ICON = 'icons/mob/clothing/suits/armor.dmi', - RESKIN_WORN_ICON_STATE = "warden_alt" - ), - ) +/obj/item/clothing/suit/armor/vest/warden/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/warden_armor) + +/datum/atom_skin/warden_armor + abstract_type = /datum/atom_skin/warden_armor + +/datum/atom_skin/warden_armor/red + preview_name = "Red Variant" + new_icon_state = "warden_jacket" + +/datum/atom_skin/warden_armor/blue + preview_name = "Blue Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' + new_icon_state = "vest_warden" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' + +/datum/atom_skin/warden_armor/black + preview_name = "Black Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' + new_icon_state = "peacekeeper_trench_warden" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' + +/datum/atom_skin/warden_armor/edgy + preview_name = "Edgy Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' + new_icon_state = "warden_syndie" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' + +/datum/atom_skin/warden_armor/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/suits/armor.dmi' + new_icon_state = "warden_jacket" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/suits/armor.dmi' + +/datum/atom_skin/warden_armor/basic + preview_name = "Basic Warden Armor" + new_icon = 'icons/obj/clothing/suits/armor.dmi' + new_icon_state = "warden_alt" + new_worn_icon = 'icons/mob/clothing/suits/armor.dmi' /obj/item/clothing/suit/armor/vest/warden/alt //un-overrides this since its sprite is TG icon = 'icons/obj/clothing/suits/armor.dmi' worn_icon = 'icons/mob/clothing/suits/armor.dmi' - current_skin = "warden_jacket" //prevents reskinning + +/obj/item/clothing/suit/armor/vest/warden/alt/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) //Security Wintercoat (and hood) /obj/item/clothing/head/hooded/winterhood/security @@ -959,9 +1110,14 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' icon_state = "hosformal_blue" - current_skin = "hosformal_blue" //prevents reskinning (but not toggling!) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION +/obj/item/clothing/suit/armor/hos/hos_formal/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /* * UNDER */ @@ -972,93 +1128,106 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' icon_state = "security_black" alt_covers_chest = TRUE - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "security_black", - RESKIN_WORN_ICON_STATE = "security_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "security_blue", - RESKIN_WORN_ICON_STATE = "security_blue" - ), - "White Variant" = list( - RESKIN_ICON_STATE = "security_white", - RESKIN_WORN_ICON_STATE = "security_white" - ), - "Sol Variant" = list( - RESKIN_ICON_STATE = "policealt", - RESKIN_WORN_ICON_STATE = "policealt" - ), - "Cadet Variant" = list( - RESKIN_ICON_STATE = "policecadetalt", - RESKIN_WORN_ICON_STATE = "policecadetalt" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "rsecurity", - RESKIN_WORN_ICON_STATE = "rsecurity" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "rsecurity", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "rsecurity" - ), - "Armadyne Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi', - RESKIN_ICON_STATE = "armadyne_shirt", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi', - RESKIN_WORN_ICON_STATE = "armadyne_shirt" - ), - "Armadyne Tac Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi', - RESKIN_ICON_STATE = "armadyne_tac", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi', - RESKIN_WORN_ICON_STATE = "armadyne_tac" - ), - "Lopland Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi', - RESKIN_ICON_STATE = "lopland_shirt", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi', - RESKIN_WORN_ICON_STATE = "lopland_shirt" - ), - "Lopland Tac Variant" = list( - RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi', - RESKIN_ICON_STATE = "lopland_tac", - RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi', - RESKIN_WORN_ICON_STATE = "lopland_tac" - ), - ) + +/obj/item/clothing/under/rank/security/officer/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_officer_uniform) + +/datum/atom_skin/security_officer_uniform + abstract_type = /datum/atom_skin/security_officer_uniform + +/datum/atom_skin/security_officer_uniform/black + preview_name = "Black Variant" + new_icon_state = "security_black" + +/datum/atom_skin/security_officer_uniform/blue + preview_name = "Blue Variant" + new_icon_state = "security_blue" + +/datum/atom_skin/security_officer_uniform/white + preview_name = "White Variant" + new_icon_state = "security_white" + +/datum/atom_skin/security_officer_uniform/sol + preview_name = "Sol Variant" + new_icon_state = "policealt" + +/datum/atom_skin/security_officer_uniform/cadet + preview_name = "Cadet Variant" + new_icon_state = "policecadetalt" + +/datum/atom_skin/security_officer_uniform/red + preview_name = "Red Variant" + new_icon_state = "rsecurity" + +/datum/atom_skin/security_officer_uniform/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "rsecurity" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' + +/datum/atom_skin/security_officer_uniform/armadyne + preview_name = "Armadyne Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + new_icon_state = "armadyne_shirt" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' + +/datum/atom_skin/security_officer_uniform/armadyne_tac + preview_name = "Armadyne Tac Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + new_icon_state = "armadyne_tac" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' + +/datum/atom_skin/security_officer_uniform/lopland + preview_name = "Lopland Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + new_icon_state = "lopland_shirt" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' + +/datum/atom_skin/security_officer_uniform/lopland_tac + preview_name = "Lopland Tac Variant" + new_icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + new_icon_state = "lopland_tac" + new_worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' /obj/item/clothing/under/rank/security/officer/formal - unique_reskin = null // prevents you from losing the unique sprite + +/obj/item/clothing/under/rank/security/officer/formal/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/officer/skirt alt_covers_chest = FALSE icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' - uses_advanced_reskins = TRUE alt_covers_chest = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "secskirt", - RESKIN_WORN_ICON_STATE = "secskirt" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "jumpskirt_blue", - RESKIN_WORN_ICON_STATE = "jumpskirt_blue" - ), - "Black Variant" = list( - RESKIN_ICON_STATE = "jumpskirt_black", - RESKIN_WORN_ICON_STATE = "jumpskirt_black" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "secskirt", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "secskirt" - ), - ) + +/obj/item/clothing/under/rank/security/officer/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_officer_skirt) + +/datum/atom_skin/security_officer_skirt + abstract_type = /datum/atom_skin/security_officer_skirt + +/datum/atom_skin/security_officer_skirt/red + preview_name = "Red Variant" + new_icon_state = "secskirt" + +/datum/atom_skin/security_officer_skirt/blue + preview_name = "Blue Variant" + new_icon_state = "jumpskirt_blue" + +/datum/atom_skin/security_officer_skirt/black + preview_name = "Black Variant" + new_icon_state = "jumpskirt_black" + +/datum/atom_skin/security_officer_skirt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "secskirt" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' /obj/item/clothing/under/rank/security/officer/skirt/blue name = "security jumpskirt" @@ -1068,25 +1237,28 @@ icon_state = "jumpskirt_blue" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY gets_cropped_on_taurs = FALSE - uses_advanced_reskins = TRUE alt_covers_chest = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "jumpskirt_blue", - RESKIN_WORN_ICON_STATE = "jumpskirt_blue" - ), - "Black Variant" = list( - RESKIN_ICON_STATE = "jumpskirt_black", - RESKIN_WORN_ICON_STATE = "jumpskirt_black" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "secskirt", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "secskirt" - ), - ) +/obj/item/clothing/under/rank/security/officer/skirt/blue/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_officer_jumpskirt) + +/datum/atom_skin/security_officer_jumpskirt + abstract_type = /datum/atom_skin/security_officer_jumpskirt + +/datum/atom_skin/security_officer_jumpskirt/blue + preview_name = "Blue Variant" + new_icon_state = "jumpskirt_blue" + +/datum/atom_skin/security_officer_jumpskirt/black + preview_name = "Black Variant" + new_icon_state = "jumpskirt_black" + +/datum/atom_skin/security_officer_jumpskirt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "secskirt" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' // DETECTIVE /obj/item/clothing/under/rank/security/detective/cowboy @@ -1114,166 +1286,216 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' icon_state = "warden_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "warden_black", - RESKIN_WORN_ICON_STATE = "warden_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "peacekeeper_warden", - RESKIN_WORN_ICON_STATE = "peacekeeper_warden" - ), - "Sol Variant" = list( - RESKIN_ICON_STATE = "policewardenalt", - RESKIN_WORN_ICON_STATE = "policewardenalt" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "rwarden", - RESKIN_WORN_ICON_STATE = "rwarden" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "rwarden", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "rwarden" - ), - ) -/obj/item/clothing/under/rank/security/warden/skirt - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "rwarden_skirt", - RESKIN_WORN_ICON_STATE = "rwarden_skirt" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "rwarden_skirt", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "rwarden_skirt" - ), - ) +/obj/item/clothing/under/rank/security/warden/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/warden_uniform) + +/datum/atom_skin/warden_uniform + abstract_type = /datum/atom_skin/warden_uniform + +/datum/atom_skin/warden_uniform/black + preview_name = "Black Variant" + new_icon_state = "warden_black" + +/datum/atom_skin/warden_uniform/blue + preview_name = "Blue Variant" + new_icon_state = "peacekeeper_warden" + +/datum/atom_skin/warden_uniform/sol + preview_name = "Sol Variant" + new_icon_state = "policewardenalt" + +/datum/atom_skin/warden_uniform/red + preview_name = "Red Variant" + new_icon_state = "rwarden" + +/datum/atom_skin/warden_uniform/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "rwarden" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' + +/obj/item/clothing/under/rank/security/warden/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/warden_skirt) + +/datum/atom_skin/warden_skirt + abstract_type = /datum/atom_skin/warden_skirt + +/datum/atom_skin/warden_skirt/red + preview_name = "Red Variant" + new_icon_state = "rwarden_skirt" + +/datum/atom_skin/warden_skirt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "rwarden_skirt" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' /obj/item/clothing/under/rank/security/warden/formal - unique_reskin = null +/obj/item/clothing/under/rank/security/warden/formal/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) //HoS /obj/item/clothing/under/rank/security/head_of_security icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' icon_state = "hos_black" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Black Variant" = list( - RESKIN_ICON_STATE = "hos_black", - RESKIN_WORN_ICON_STATE = "hos_black" - ), - "Blue Variant" = list( - RESKIN_ICON_STATE = "peacekeeper_hos", - RESKIN_WORN_ICON_STATE = "peacekeeper_hos" - ), - "Sol Variant" = list( - RESKIN_ICON_STATE = "policechiefalt", - RESKIN_WORN_ICON_STATE = "policechiefalt" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "rhos", - RESKIN_WORN_ICON_STATE = "rhos" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "rhos", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "rhos" - ), - ) -/obj/item/clothing/under/rank/security/head_of_security/skirt - uses_advanced_reskins = TRUE - unique_reskin = list( - "Red Variant" = list( - RESKIN_ICON_STATE = "rhos_skirt", - RESKIN_WORN_ICON_STATE = "rhos_skirt" - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/under/security.dmi', - RESKIN_ICON_STATE = "rhos_skirt", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/under/security.dmi', - RESKIN_WORN_ICON_STATE = "rhos_skirt" - ), - ) +/obj/item/clothing/under/rank/security/head_of_security/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_uniform) + +/datum/atom_skin/hos_uniform + abstract_type = /datum/atom_skin/hos_uniform + +/datum/atom_skin/hos_uniform/black + preview_name = "Black Variant" + new_icon_state = "hos_black" + +/datum/atom_skin/hos_uniform/blue + preview_name = "Blue Variant" + new_icon_state = "peacekeeper_hos" + +/datum/atom_skin/hos_uniform/sol + preview_name = "Sol Variant" + new_icon_state = "policechiefalt" + +/datum/atom_skin/hos_uniform/red + preview_name = "Red Variant" + new_icon_state = "rhos" + +/datum/atom_skin/hos_uniform/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "rhos" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' + +/obj/item/clothing/under/rank/security/head_of_security/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_skirt) + +/datum/atom_skin/hos_skirt + abstract_type = /datum/atom_skin/hos_skirt + +/datum/atom_skin/hos_skirt/red + preview_name = "Red Variant" + new_icon_state = "rhos_skirt" + +/datum/atom_skin/hos_skirt/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/under/security.dmi' + new_icon_state = "rhos_skirt" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/under/security.dmi' /obj/item/clothing/under/rank/security/head_of_security/parade icon_state = "hos_parade_male_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "hos_parade_male_blue", - RESKIN_WORN_ICON_STATE = "hos_parade_male_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "hos_parade_male", - RESKIN_WORN_ICON_STATE = "hos_parade_male" - ), - ) + +/obj/item/clothing/under/rank/security/head_of_security/parade/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_parade_male) + +/datum/atom_skin/hos_parade_male + abstract_type = /datum/atom_skin/hos_parade_male + +/datum/atom_skin/hos_parade_male/blue + preview_name = "Blue Variant" + new_icon_state = "hos_parade_male_blue" + +/datum/atom_skin/hos_parade_male/red + preview_name = "Red Variant" + new_icon_state = "hos_parade_male" /obj/item/clothing/under/rank/security/head_of_security/parade/female icon_state = "hos_parade_fem_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "hos_parade_fem_blue", - RESKIN_WORN_ICON_STATE = "hos_parade_fem_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "hos_parade_fem", - RESKIN_WORN_ICON_STATE = "hos_parade_fem" - ), - ) +/obj/item/clothing/under/rank/security/head_of_security/parade/female/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_parade_female) + +/datum/atom_skin/hos_parade_female + abstract_type = /datum/atom_skin/hos_parade_female + +/datum/atom_skin/hos_parade_female/blue + preview_name = "Blue Variant" + new_icon_state = "hos_parade_fem_blue" + +/datum/atom_skin/hos_parade_female/red + preview_name = "Red Variant" + new_icon_state = "hos_parade_fem" /obj/item/clothing/under/rank/security/head_of_security/alt icon_state = "hosalt_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "hosalt_blue", - RESKIN_WORN_ICON_STATE = "hosalt_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "hosalt", - RESKIN_WORN_ICON_STATE = "hosalt" - ), - ) + +/obj/item/clothing/under/rank/security/head_of_security/alt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_alt) + +/datum/atom_skin/hos_alt + abstract_type = /datum/atom_skin/hos_alt + +/datum/atom_skin/hos_alt/blue + preview_name = "Blue Variant" + new_icon_state = "hosalt_blue" + +/datum/atom_skin/hos_alt/red + preview_name = "Red Variant" + new_icon_state = "hosalt" /obj/item/clothing/under/rank/security/head_of_security/alt/skirt icon_state = "hosalt_skirt_blue" - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue Variant" = list( - RESKIN_ICON_STATE = "hosalt_skirt_blue", - RESKIN_WORN_ICON_STATE = "hosalt_skirt_blue" - ), - "Red Variant" = list( - RESKIN_ICON_STATE = "hosalt_skirt", - RESKIN_WORN_ICON_STATE = "hosalt_skirt" - ), - ) + +/obj/item/clothing/under/rank/security/head_of_security/alt/skirt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hos_alt_skirt) + +/datum/atom_skin/hos_alt_skirt + abstract_type = /datum/atom_skin/hos_alt_skirt + +/datum/atom_skin/hos_alt_skirt/blue + preview_name = "Blue Variant" + new_icon_state = "hosalt_skirt_blue" + +/datum/atom_skin/hos_alt_skirt/red + preview_name = "Red Variant" + new_icon_state = "hosalt_skirt" /obj/item/clothing/under/rank/security/head_of_security/peacekeeper - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/peacekeeper/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/bunnysuit - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/bunnysuit/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/alt/roselia - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/alt/roselia/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/grey - unique_reskin = null +/obj/item/clothing/under/rank/security/head_of_security/grey/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) // PRISONER @@ -1373,42 +1595,42 @@ icon = 'modular_skyrat/master_files/icons/obj/clothing/shoes.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/feet.dmi' clothing_traits = list(TRAIT_SILENT_FOOTSTEPS) // We have other footsteps. - uses_advanced_reskins = TRUE - unique_reskin = list( - "Blue-Trimmed Variant" = list( - RESKIN_ICON_STATE = "security_boots", - RESKIN_WORN_ICON_STATE = "security_boots" - ), - "White-Trimmed Variant" = list( - RESKIN_ICON_STATE = "security_boots_white", - RESKIN_WORN_ICON_STATE = "security_boots_white" - ), - "Full White Variant" = list( - RESKIN_ICON_STATE = "security_boots_fullwhite", - RESKIN_WORN_ICON_STATE = "security_boots_fullwhite" - ), - "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/shoes.dmi', - RESKIN_ICON_STATE = "jackboots_sec", - RESKIN_WORN_ICON_STATE = "jackboots_sec", - RESKIN_WORN_ICON = 'icons/mob/clothing/feet.dmi' - ), - "Pink Variant" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/clothing/feet/feet.dmi', - RESKIN_ICON_STATE = "jackboots_sec", - RESKIN_WORN_ICON_STATE = "jackboots_sec", - RESKIN_WORN_ICON = 'modular_zubbers/icons/mob/clothing/feet/feet.dmi' - ), - "Armadyne Variant" = list( - RESKIN_ICON_STATE = "armadyne_boots", - RESKIN_WORN_ICON_STATE = "armadyne_boots" - ), - ) /obj/item/clothing/shoes/jackboots/sec/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('modular_skyrat/master_files/sound/effects/footstep1.ogg'=1,'modular_skyrat/master_files/sound/effects/footstep2.ogg'=1, 'modular_skyrat/master_files/sound/effects/footstep3.ogg'=1), 100) + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/security_jackboots) +/datum/atom_skin/security_jackboots + abstract_type = /datum/atom_skin/security_jackboots + +/datum/atom_skin/security_jackboots/blue_trim + preview_name = "Blue-Trimmed Variant" + new_icon_state = "security_boots" + +/datum/atom_skin/security_jackboots/white_trim + preview_name = "White-Trimmed Variant" + new_icon_state = "security_boots_white" + +/datum/atom_skin/security_jackboots/full_white + preview_name = "Full White Variant" + new_icon_state = "security_boots_fullwhite" + +/datum/atom_skin/security_jackboots/red + preview_name = "Red Variant" + new_icon = 'icons/obj/clothing/shoes.dmi' + new_icon_state = "jackboots_sec" + new_worn_icon = 'icons/mob/clothing/feet.dmi' + +/datum/atom_skin/security_jackboots/pink + preview_name = "Pink Variant" + new_icon = 'modular_zubbers/icons/obj/clothing/feet/feet.dmi' + new_icon_state = "jackboots_sec" + new_worn_icon = 'modular_zubbers/icons/mob/clothing/feet/feet.dmi' + +/datum/atom_skin/security_jackboots/armadyne + preview_name = "Armadyne Variant" + new_icon_state = "armadyne_boots" /* * A bunch of re-overrides so that admins can keep using some redsec stuff; not all of them have this though! @@ -1423,27 +1645,47 @@ worn_icon = 'icons/mob/clothing/eyes.dmi' icon_state = "securityhud" glass_colour_type = /datum/client_colour/glass_colour/red - unique_reskin = null + +/obj/item/clothing/glasses/hud/security/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/glasses/hud/security/sunglasses/redsec icon = 'icons/obj/clothing/glasses.dmi' worn_icon = 'icons/mob/clothing/eyes.dmi' icon_state = "sunhudsec" glass_colour_type = /datum/client_colour/glass_colour/darkred - current_skin = "sunhudsec" //prevents reskinning; a bit hacky to say its already reskinned but its better than a code rewrite + +/obj/item/clothing/glasses/hud/security/sunglasses/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/redsec icon = 'icons/obj/clothing/glasses.dmi' worn_icon = 'icons/mob/clothing/eyes.dmi' icon_state = "hudpatch" base_icon_state = "hudpatch" - unique_reskin = null + +/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/glasses/hud/security/night/redsec icon = 'icons/obj/clothing/glasses.dmi' worn_icon = 'icons/mob/clothing/eyes.dmi' icon_state = "securityhudnight" - unique_reskin = null + +/obj/item/clothing/glasses/hud/security/night/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * NECK @@ -1453,7 +1695,12 @@ icon = 'icons/obj/clothing/cloaks.dmi' worn_icon = 'icons/mob/clothing/neck.dmi' icon_state = "hoscloak" - unique_reskin = null + +/obj/item/clothing/neck/cloak/hos/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * BACK @@ -1463,19 +1710,34 @@ icon = 'icons/obj/storage/backpack.dmi' worn_icon = 'icons/mob/clothing/back/backpack.dmi' icon_state = "backpack-security" - current_skin = "backpack-security" //prevents reskinning + +/obj/item/storage/backpack/security/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/backpack/satchel/sec/redsec icon = 'icons/obj/storage/backpack.dmi' worn_icon = 'icons/mob/clothing/back/backpack.dmi' icon_state = "satchel-security" - unique_reskin = null + +/obj/item/storage/backpack/satchel/sec/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/backpack/duffelbag/sec/redsec icon = 'icons/obj/storage/backpack.dmi' worn_icon = 'icons/mob/clothing/back/backpack.dmi' icon_state = "duffel-security" - current_skin = "duffel-security" //prevents reskinning + +/obj/item/storage/backpack/duffelbag/sec/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * BELT + HOLSTERS @@ -1487,7 +1749,12 @@ icon_state = "security" inhand_icon_state = "security" worn_icon_state = "security" - current_skin = "security" //prevents reskinning + +/obj/item/storage/belt/security/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/storage/belt/holster desc = "A rather plain but still cool looking holster that can hold a handgun, and some ammo." @@ -1593,7 +1860,12 @@ worn_icon = 'icons/mob/clothing/head/hats.dmi' icon_state = "hoscap" base_icon_state = "hoscap" - unique_reskin = null + +/obj/item/clothing/head/hats/hos/cap/red/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * UNIFORM @@ -1601,43 +1873,93 @@ /obj/item/clothing/under/rank/security/officer/redsec icon_state = "rsecurity" - current_skin = "rsecurity" //prevents reskinning + +/obj/item/clothing/under/rank/security/officer/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/officer/skirt/redsec icon_state = "secskirt" - current_skin = "secskirt" + +/obj/item/clothing/under/rank/security/officer/skirt/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/warden/redsec icon_state = "rwarden" - unique_reskin = null + +/obj/item/clothing/under/rank/security/warden/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/warden/skirt/redsec icon_state = "rwarden_skirt" - unique_reskin = null + +/obj/item/clothing/under/rank/security/warden/skirt/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/redsec icon_state = "rhos" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/skirt/redsec icon_state = "rhos_skirt" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/skirt/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/parade/redsec icon_state = "hos_parade_male" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/parade/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/parade/female/redsec icon_state = "hos_parade_fem" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/parade/female/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/alt/redsec icon_state = "hosalt" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/alt/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/under/rank/security/head_of_security/alt/skirt/redsec icon_state = "hosalt_skirt" - unique_reskin = null + +/obj/item/clothing/under/rank/security/head_of_security/alt/skirt/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /* * WINTER COAT @@ -1666,15 +1988,25 @@ icon = 'icons/obj/clothing/suits/armor.dmi' worn_icon = 'icons/mob/clothing/suits/armor.dmi' icon_state = "armor_sec" - current_skin = "armor_sec" //prevents reskinning + +/obj/item/clothing/suit/armor/vest/alt/sec/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) /obj/item/clothing/suit/armor/hos/hos_formal/redsec icon = 'icons/obj/clothing/suits/armor.dmi' worn_icon = 'icons/mob/clothing/suits/armor.dmi' icon_state = "hosformal" - current_skin = "hosformal" //prevents reskinning (but not toggling!) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION +/obj/item/clothing/suit/armor/hos/hos_formal/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) + /* * FEET */ @@ -1684,7 +2016,12 @@ icon_state = "jackboots_sec" icon = 'icons/obj/clothing/shoes.dmi' worn_icon = 'icons/mob/clothing/feet.dmi' - current_skin = "jackboots_sec" //prevents reskinning + +/obj/item/clothing/shoes/jackboots/sec/redsec/Initialize(mapload) + . = ..() + var/list/reskin_components = GetComponents(/datum/component/reskinable_item) + for(var/datum/component/reskinable_item/reskin_component as anything in reskin_components) + qdel(reskin_component) //Finally, a few description changes for items that couldn't get a resprite. /obj/item/clothing/head/bio_hood/security diff --git a/modular_zubbers/code/modules/surgery/tools.dm b/modular_zubbers/code/modules/surgery/tools.dm index 4194d6e2343..33e52d15276 100644 --- a/modular_zubbers/code/modules/surgery/tools.dm +++ b/modular_zubbers/code/modules/surgery/tools.dm @@ -1,168 +1,220 @@ -/obj/item/scalpel - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "scalpel", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "scalpel", - ), - ) +/obj/item/scalpel/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/scalpel) -/obj/item/circular_saw - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "saw", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "saw", - ), - ) +/datum/atom_skin/scalpel + abstract_type = /datum/atom_skin/scalpel -/obj/item/surgical_drapes - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "drapes", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "drapes", - ), - ) +/datum/atom_skin/scalpel/korve + preview_name = "korve" + new_icon_state = "scalpel" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' -/obj/item/retractor - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "retractor", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "retractor", - ), - ) +/datum/atom_skin/scalpel/default + preview_name = "default" + new_icon_state = "scalpel" + new_icon = 'icons/obj/medical/surgery_tools.dmi' -/obj/item/hemostat - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "hemostat", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "hemostat", - ), - ) +/obj/item/circular_saw/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/saw) -/obj/item/cautery - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "cautery", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "cautery", - ), - ) +/datum/atom_skin/saw + abstract_type = /datum/atom_skin/saw -/obj/item/blood_filter - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bloodfilter", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bloodfilter", - ), - ) +/datum/atom_skin/saw/korve + preview_name = "korve" + new_icon_state = "saw" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' -/obj/item/surgicaldrill - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "drill", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "drill", - ), - ) +/datum/atom_skin/scalpel/default + preview_name = "default" + new_icon_state = "saw" + new_icon = 'icons/obj/medical/surgery_tools.dmi' -/obj/item/bonesetter - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bonesetter", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "bonesetter", - ), - ) +/obj/item/surgical_drapes/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/drapes) -/obj/item/retractor/advanced - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "adv_retractor", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "adv_retractor", - ), - ) +/datum/atom_skin/drapes + abstract_type = /datum/atom_skin/drapes -/obj/item/scalpel/advanced - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "e_scalpel", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "e_scalpel", - ), - ) +/datum/atom_skin/drapes/korve + preview_name = "korve" + new_icon_state = "drapes" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' -/obj/item/cautery/advanced - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "e_cautery", - ), - "default" = list( - RESKIN_ICON = 'icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "e_cautery", - ), - ) +/datum/atom_skin/drapes/default + preview_name = "default" + new_icon_state = "surgical_drapes" + new_icon = 'icons/obj/medical/surgery_tools.dmi' -/obj/item/blood_filter/advanced - uses_advanced_reskins = TRUE - unique_reskin = list( - "korve" = list( - RESKIN_ICON = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi', - RESKIN_ICON_STATE = "combitool", - ), - "default" = list( - RESKIN_ICON = 'modular_skyrat/modules/filtersandsetters/icons/surgery_tools.dmi', - RESKIN_ICON_STATE = "combitool", - ), - ) +/obj/item/retractor/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/retractor) + +/datum/atom_skin/retractor + abstract_type = /datum/atom_skin/retractor + +/datum/atom_skin/retractor/korve + preview_name = "korve" + new_icon_state = "retractor" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/retractor/default + preview_name = "default" + new_icon_state = "retractor" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/hemostat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/hemostat) + +/datum/atom_skin/hemostat + abstract_type = /datum/atom_skin/hemostat + +/datum/atom_skin/hemostat/korve + preview_name = "korve" + new_icon_state = "hemostat" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/hemostat/default + preview_name = "default" + new_icon_state = "hemostat" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/cautery/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/cautery) + +/datum/atom_skin/cautery + abstract_type = /datum/atom_skin/cautery + +/datum/atom_skin/cautery/korve + preview_name = "korve" + new_icon_state = "cautery" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/cautery/default + preview_name = "default" + new_icon_state = "cautery" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/blood_filter/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blood_filter) + +/datum/atom_skin/blood_filter + abstract_type = /datum/atom_skin/blood_filter + +/datum/atom_skin/blood_filter/korve + preview_name = "korve" + new_icon_state = "bloodfilter" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/blood_filter/default + preview_name = "default" + new_icon_state = "bloodfilter" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/surgicaldrill/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/surgicaldrill) + +/datum/atom_skin/surgicaldrill + abstract_type = /datum/atom_skin/surgicaldrill + +/datum/atom_skin/surgicaldrill/korve + preview_name = "korve" + new_icon_state = "drill" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/surgicaldrill/default + preview_name = "default" + new_icon_state = "drill" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/bonesetter/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bonesetter) + +/datum/atom_skin/bonesetter + abstract_type = /datum/atom_skin/bonesetter + +/datum/atom_skin/bonesetter/korve + preview_name = "korve" + new_icon_state = "bonesetter" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/bonesetter/default + preview_name = "default" + new_icon_state = "bonesetter" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/retractor/advanced/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/retractor_advanced) + +/datum/atom_skin/retractor_advanced + abstract_type = /datum/atom_skin/retractor_advanced + +/datum/atom_skin/retractor_advanced/korve + preview_name = "korve" + new_icon_state = "adv_retractor" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/retractor_advanced/default + preview_name = "default" + new_icon_state = "adv_retractor" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/scalpel/advanced/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/scalpel_advanced) + +/datum/atom_skin/scalpel_advanced + abstract_type = /datum/atom_skin/scalpel_advanced + +/datum/atom_skin/scalpel_advanced/korve + preview_name = "korve" + new_icon_state = "e_scalpel" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/scalpel_advanced/default + preview_name = "default" + new_icon_state = "e_scalpel" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/cautery/advanced/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/cautery_advanced) + +/datum/atom_skin/cautery_advanced + abstract_type = /datum/atom_skin/cautery_advanced + +/datum/atom_skin/cautery_advanced/korve + preview_name = "korve" + new_icon_state = "e_cautery" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/cautery_advanced/default + preview_name = "default" + new_icon_state = "e_cautery" + new_icon = 'icons/obj/medical/surgery_tools.dmi' + +/obj/item/blood_filter/advanced/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/blood_filter_advanced) + +/datum/atom_skin/blood_filter_advanced + abstract_type = /datum/atom_skin/blood_filter_advanced + +/datum/atom_skin/blood_filter_advanced/korve + preview_name = "korve" + new_icon_state = "combitool" + new_icon = 'modular_zubbers/icons/obj/medical/surgery_tools.dmi' + +/datum/atom_skin/blood_filter_advanced/default + preview_name = "default" + new_icon_state = "combitool" + new_icon = 'modular_skyrat/modules/filtersandsetters/icons/surgery_tools.dmi' diff --git a/tgstation.dme b/tgstation.dme index 4c2806c01fb..5cbce03bead 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -209,6 +209,7 @@ #include "code\__DEFINES\regex.dm" #include "code\__DEFINES\religion.dm" #include "code\__DEFINES\research.dm" +#include "code\__DEFINES\reskin.dm" #include "code\__DEFINES\resonator.dm" #include "code\__DEFINES\revolution.dm" #include "code\__DEFINES\robots.dm" @@ -1414,6 +1415,7 @@ #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" #include "code\datums\components\rename.dm" +#include "code\datums\components\reskinnable_atom.dm" #include "code\datums\components\revenge_ability.dm" #include "code\datums\components\rot.dm" #include "code\datums\components\rotation.dm" @@ -2520,7 +2522,6 @@ #include "code\game\objects\buckling.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\items.dm" -#include "code\game\objects\items_reskin.dm" #include "code\game\objects\obj_defense.dm" #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" @@ -8892,6 +8893,7 @@ #include "modular_zubbers\code\datums\ai_laws\laws_station_sided.dm" #include "modular_zubbers\code\datums\brain_damage\magic.dm" #include "modular_zubbers\code\datums\components\nanites.dm" +#include "modular_zubbers\code\datums\components\reskinnable_atom.dm" #include "modular_zubbers\code\datums\components\sign_language.dm" #include "modular_zubbers\code\datums\components\squeak.dm" #include "modular_zubbers\code\datums\components\surgery_initiator.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/loadout/ModifyPanel.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/loadout/ModifyPanel.tsx index 5dae0de4475..c7f0ac2aae0 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/loadout/ModifyPanel.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/loadout/ModifyPanel.tsx @@ -104,7 +104,7 @@ function LoadoutModifyButtons(props: ButtonsProps) { {!!modifyItemDimmer.reskins && ( - + {modifyItemDimmer.reskins.map((reskin) => (