diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 01a901dd28fb..b37ce7332094 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -195,9 +195,12 @@ #include "hydroponics_harvest.dm" #include "hydroponics_self_mutations.dm" #include "hydroponics_validate_genes.dm" +#include "icon_state.dm" +#include "icon_state_inhand.dm" +#include "icon_state_worn.dm" +#include "icons_missing.dm" #include "id_access.dm" #include "id_card.dm" -#include "inhands.dm" #include "interaction_door.dm" #include "interaction_silicon.dm" #include "interaction_structures.dm" @@ -227,7 +230,6 @@ #include "merge_type.dm" #include "metabolizing.dm" #include "mindbound_actions.dm" -#include "missing_icons.dm" #include "mob_chains.dm" #include "mob_damage.dm" #include "mob_faction.dm" @@ -344,7 +346,6 @@ #include "washing.dm" #include "weird_food.dm" #include "wizard_loadout.dm" -#include "worn_icons.dm" // END_INCLUDE #ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter #include "find_reference_sanity.dm" diff --git a/code/modules/unit_tests/icon_state.dm b/code/modules/unit_tests/icon_state.dm new file mode 100644 index 000000000000..4b6233555126 --- /dev/null +++ b/code/modules/unit_tests/icon_state.dm @@ -0,0 +1,50 @@ +/// Makes sure objects actually have icons that exist! +/datum/unit_test/missing_icons/icon_state + default_location = "icons/obj/" + // DARKPACK EDIT ADD START + additional_icon_locations = list( + "modular_darkpack/master_files/icons/obj/", + "modular_darkpack/master_files/icons/effects/", + "modular_darkpack/modules/", + ) + // DARKPACK EDIT ADD END + +/datum/unit_test/missing_icons/icon_state/compile_icon_state_locations() + . = ..() + generate_possible_icon_states_list("icons/effects/") + +/datum/unit_test/missing_icons/icon_state/Run() + compile_icon_state_locations() + + var/list/bad_list = list() + for(var/obj/obj_path as anything in subtypesof(/obj)) + if(ispath(obj_path, /obj/item)) + var/obj/item/item_path = obj_path + if(initial(item_path.item_flags) & ABSTRACT) + continue + + if(initial(obj_path.greyscale_colors) && initial(obj_path.greyscale_config)) //GAGS has its own unit test. + continue + + var/icon = initial(obj_path.icon) + if(isnull(icon)) + continue + var/icon_state = initial(obj_path.icon_state) + if(isnull(icon_state)) + continue + + if(length(bad_list) && (icon_state in bad_list[icon])) + continue + + if(icon_exists(icon, icon_state)) + continue + + bad_list[icon] += list(icon_state) + + var/match_message + if(icon_state in possible_icon_states) + for(var/file_place in possible_icon_states[icon_state]) + match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'") + + TEST_FAIL("Missing icon_state for [obj_path] in '[icon]'.\n\ticon_state = \"[icon_state]\"[match_message]") + diff --git a/code/modules/unit_tests/inhands.dm b/code/modules/unit_tests/icon_state_inhand.dm similarity index 70% rename from code/modules/unit_tests/inhands.dm rename to code/modules/unit_tests/icon_state_inhand.dm index 863bbca65636..ba4cae3eb1d3 100644 --- a/code/modules/unit_tests/inhands.dm +++ b/code/modules/unit_tests/icon_state_inhand.dm @@ -1,30 +1,17 @@ /// Makes sure items with defined inhand_icon_states... actually have icons that exist! -/datum/unit_test/defined_inhand_icon_states - var/static/list/possible_icon_states = list() +/datum/unit_test/missing_icons/inhand_icon_state + default_location = "icons/mob/inhands/" + // DARKPACK EDIT ADD END + additional_icon_locations = list( + "modular_darkpack/master_files/icons/mob/inhands/", + "modular_darkpack/modules/", + ) + // DARKPACK EDIT ADD END var/fallback_log_message var/unset_inhand_var_message - /// additional_inhands_location is for downstream modularity support. as an example, for skyrat's usage, set additional_inhands_location = "modular_skyrat/master_files/icons/mob/inhands/" - /// Make sure this location is also present in tools/deploy.sh - /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/inhands/") below the if(additional_inhands_location) block in Run(), and make sure to add that path to tools/deploy.sh as well. - var/additional_inhands_location = null -/datum/unit_test/defined_inhand_icon_states/proc/generate_possible_icon_states_list(directory_path) - if(!directory_path) - directory_path = "icons/mob/inhands/" - for(var/file_path in flist(directory_path)) - if(findtext(file_path, ".dmi")) - for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword" - possible_icon_states[sprite_icon] += list("[directory_path][file_path]") - else - possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]") - -/datum/unit_test/defined_inhand_icon_states/Run() - generate_possible_icon_states_list() - if(additional_inhands_location) - generate_possible_icon_states_list(additional_inhands_location) - - //Add EVEN MORE paths if needed here! - //generate_possible_icon_states_list("your/folder/path/inhands/") +/datum/unit_test/missing_icons/inhand_icon_state/Run() + compile_icon_state_locations() for(var/obj/item/item_path as anything in subtypesof(/obj/item)) if(initial(item_path.item_flags) & ABSTRACT) diff --git a/code/modules/unit_tests/worn_icons.dm b/code/modules/unit_tests/icon_state_worn.dm similarity index 75% rename from code/modules/unit_tests/worn_icons.dm rename to code/modules/unit_tests/icon_state_worn.dm index 38acff5efd9d..3b96e1095fb5 100644 --- a/code/modules/unit_tests/worn_icons.dm +++ b/code/modules/unit_tests/icon_state_worn.dm @@ -1,29 +1,19 @@ /// Makes sure suit slot items aren't using CS:S fallbacks. -/datum/unit_test/worn_icons - var/static/list/possible_icon_states = list() - /// additional_icon_location is for downstream modularity support for finding missing sprites in additonal DMI file locations. - /// Make sure this location is also present in tools/deploy.sh - /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/") below the if(additional_icon_location) block in Run(), and make sure to add that path to tools/deploy.sh as well. - var/additional_icon_location = null - -/datum/unit_test/worn_icons/proc/generate_possible_icon_states_list(directory_path) - if(!directory_path) - directory_path = "icons/mob/clothing/" - for(var/file_path in flist(directory_path)) - if(findtext(file_path, ".dmi")) - for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword" - possible_icon_states[sprite_icon] += list("[directory_path][file_path]") - else - possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]") - -/datum/unit_test/worn_icons/Run() - generate_possible_icon_states_list() - if(additional_icon_location) - generate_possible_icon_states_list(additional_icon_location) +/datum/unit_test/missing_icons/worn_icons + default_location = "icons/mob/clothing/" + // DARKPACK EDIT ADD START + additional_icon_locations = list( + "modular_darkpack/master_files/icons/mob/clothing/", + "modular_darkpack/modules/", + ) + // DARKPACK EDIT ADD END + +/datum/unit_test/missing_icons/worn_icons/Run() + compile_icon_state_locations() var/list/already_warned_icons = list() - for(var/obj/item/item_path as anything in (subtypesof(/obj/item) - typesof(/obj/item/mod))) + for(var/obj/item/item_path as anything in (valid_subtypesof(/obj/item) - typesof(/obj/item/mod))) // DARKPACK EDIT CHANGE var/cached_slot_flags = initial(item_path.slot_flags) if(!cached_slot_flags || (cached_slot_flags & ITEM_SLOT_LPOCKET) || (cached_slot_flags & ITEM_SLOT_RPOCKET) || initial(item_path.item_flags) & ABSTRACT) continue diff --git a/code/modules/unit_tests/icons_missing.dm b/code/modules/unit_tests/icons_missing.dm new file mode 100644 index 000000000000..9780e64774c8 --- /dev/null +++ b/code/modules/unit_tests/icons_missing.dm @@ -0,0 +1,22 @@ +/datum/unit_test/missing_icons + abstract_type = /datum/unit_test/missing_icons + var/list/possible_icon_states = list() + var/default_location = "icons/" + /// additional_icon_locations is for downstream modularity support for finding missing sprites in additonal DMI file locations. + /// Make sure these locations are also present in tools/deploy.sh + var/additional_icon_locations + +/datum/unit_test/missing_icons/proc/generate_possible_icon_states_list(directory_path) + if(!directory_path) + directory_path = default_location + for(var/file_path in flist(directory_path)) + if(findtext(file_path, ".dmi")) + for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword" + possible_icon_states[sprite_icon] += list("[directory_path][file_path]") + else + possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]") + +/datum/unit_test/missing_icons/proc/compile_icon_state_locations() + generate_possible_icon_states_list(default_location) + for(var/path in additional_icon_locations) + generate_possible_icon_states_list(path) diff --git a/code/modules/unit_tests/missing_icons.dm b/code/modules/unit_tests/missing_icons.dm deleted file mode 100644 index 11fcfe34bce5..000000000000 --- a/code/modules/unit_tests/missing_icons.dm +++ /dev/null @@ -1,58 +0,0 @@ -/// Makes sure objects actually have icons that exist! -/datum/unit_test/missing_icons - var/static/list/possible_icon_states = list() - /// additional_icon_location is for downstream modularity support. - /// Make sure this location is also present in tools/deploy.sh - /// If you need additional paths ontop of this second one, you can add another generate_possible_icon_states_list("your/folder/path/") below the if(additional_icon_location) block in Run(), and make sure to add that path to tools/deploy.sh as well. - var/additional_icon_location = null - -/datum/unit_test/missing_icons/proc/generate_possible_icon_states_list(directory_path) - if(!directory_path) - directory_path = "icons/obj/" - for(var/file_path in flist(directory_path)) - if(findtext(file_path, ".dmi")) - for(var/sprite_icon in icon_states("[directory_path][file_path]", 1)) //2nd arg = 1 enables 64x64+ icon support, otherwise you'll end up with "sword0_1" instead of "sword" - possible_icon_states[sprite_icon] += list("[directory_path][file_path]") - else - possible_icon_states += generate_possible_icon_states_list("[directory_path][file_path]") - -/datum/unit_test/missing_icons/Run() - generate_possible_icon_states_list() - generate_possible_icon_states_list("icons/effects/") - if(additional_icon_location) - generate_possible_icon_states_list(additional_icon_location) - - //Add EVEN MORE paths if needed here! - //generate_possible_icon_states_list("your/folder/path/") - var/list/bad_list = list() - for(var/obj/obj_path as anything in subtypesof(/obj)) - if(ispath(obj_path, /obj/item)) - var/obj/item/item_path = obj_path - if(initial(item_path.item_flags) & ABSTRACT) - continue - - if(initial(obj_path.greyscale_colors) && initial(obj_path.greyscale_config)) //GAGS has its own unit test. - continue - - var/icon = initial(obj_path.icon) - if(isnull(icon)) - continue - var/icon_state = initial(obj_path.icon_state) - if(isnull(icon_state)) - continue - - if(length(bad_list) && (icon_state in bad_list[icon])) - continue - - if(icon_exists(icon, icon_state)) - continue - - bad_list[icon] += list(icon_state) - - var/match_message - if(icon_state in possible_icon_states) - for(var/file_place in possible_icon_states[icon_state]) - match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'") - - TEST_FAIL("Missing icon_state for [obj_path] in '[icon]'.\n\ticon_state = \"[icon_state]\"[match_message]") - diff --git a/modular_darkpack/modules/clothes/code/suit.dm b/modular_darkpack/modules/clothes/code/suit.dm index d08acce22159..077a0c44f4f1 100644 --- a/modular_darkpack/modules/clothes/code/suit.dm +++ b/modular_darkpack/modules/clothes/code/suit.dm @@ -58,9 +58,9 @@ name = "chemical hood" desc = "A hood attached to a cchemical costume." icon_state = "heisenberg_helm" + ONFLOOR_ICON_HELPER(null) icon = 'modular_darkpack/modules/clothes/icons/clothing.dmi' worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi') body_parts_covered = HEAD cold_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -84,9 +84,9 @@ name = "white hood" desc = "The hood of some angelic-looking robes." icon_state = "robes_hood" + ONFLOOR_ICON_HELPER(null) icon = 'modular_darkpack/modules/clothes/icons/clothing.dmi' worn_icon = 'modular_darkpack/modules/clothes/icons/worn.dmi' - ONFLOOR_ICON_HELPER('modular_darkpack/modules/clothes/icons/clothing_onfloor.dmi') body_parts_covered = HEAD cold_protection = HEAD flags_inv = HIDEHAIR | HIDEEARS diff --git a/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm b/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm index 4c09ac03dad7..316e8935939e 100644 --- a/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm +++ b/modular_darkpack/modules/unit_tests/_darkpack_unit_tests.dm @@ -27,6 +27,7 @@ // BEGIN_INCLUDE #include "apply_all_clans.dm" #include "apply_all_splats.dm" +#include "onfloor_icons.dm" #include "unallocated_transfer_points.dm" // END_INCLUDE diff --git a/modular_darkpack/modules/unit_tests/onfloor_icons.dm b/modular_darkpack/modules/unit_tests/onfloor_icons.dm new file mode 100644 index 000000000000..b5aad69fce09 --- /dev/null +++ b/modular_darkpack/modules/unit_tests/onfloor_icons.dm @@ -0,0 +1,41 @@ +/// Makes sure objects actually have icons that exist! +/datum/unit_test/missing_icons/onfloor + default_location = "icons/obj/" + additional_icon_locations = list( + "modular_darkpack/master_files/icons/obj/", + "modular_darkpack/modules/" + ) + +/datum/unit_test/missing_icons/onfloor/Run() + compile_icon_state_locations() + + var/list/bad_list = list() + for(var/obj/item/item_path as anything in valid_subtypesof(/obj/item)) + if(item_path::item_flags & ABSTRACT) + continue + + if(item_path::greyscale_colors && item_path::greyscale_config) //GAGS has its own unit test. + continue + + var/icon = item_path::onflooricon + if(isnull(icon)) + continue + var/icon_state = item_path::onflooricon_state || item_path::icon_state + if(isnull(icon_state)) + continue + + if(length(bad_list) && (icon_state in bad_list[icon])) + continue + + if(icon_exists(icon, icon_state)) + continue + + bad_list[icon] += list(icon_state) + + var/match_message + if(icon_state in possible_icon_states) + for(var/file_place in possible_icon_states[icon_state]) + match_message += (match_message ? " & '[file_place]'" : " - Matching sprite found in: '[file_place]'") + + TEST_FAIL("Missing onflooricon_state for [item_path] in '[icon]'.\n\ticon_state or onfloorcion_state = \"[icon_state]\"[match_message]") +