diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 8b44fb86273..71a19a2de24 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -1,3 +1,5 @@ +var/list/holder_mob_icon_cache = list() + //Helper object for picking dionaea (and other creatures) up. /obj/item/weapon/holder name = "holder" @@ -86,3 +88,42 @@ grabber.status_flags |= PASSEMOTES H.sync(src) return H + +/obj/item/weapon/holder/human + icon = 'icons/mob/holder_complex.dmi' + var/list/generate_for_slots = list(slot_l_hand_str, slot_r_hand_str, slot_back_str) + slot_flags = SLOT_BACK + +/obj/item/weapon/holder/human/sync(var/mob/living/M) + + // Generate appropriate on-mob icons. + var/mob/living/carbon/human/owner = M + if(istype(owner) && owner.species) + + var/skin_colour = rgb(owner.r_skin, owner.g_skin, owner.b_skin) + var/hair_colour = rgb(owner.r_hair, owner.g_hair, owner.b_hair) + var/eye_colour = rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes) + var/species_name = lowertext(owner.species.get_bodytype()) + + for(var/cache_entry in generate_for_slots) + var/cache_key = "[owner.species]-[cache_entry]-[skin_colour]-[hair_colour]" + if(!holder_mob_icon_cache[cache_key]) + + // Generate individual icons. + var/icon/mob_icon = icon(icon, "[species_name]_holder_[cache_entry]_base") + mob_icon.Blend(skin_colour, ICON_ADD) + var/icon/hair_icon = icon(icon, "[species_name]_holder_[cache_entry]_hair") + hair_icon.Blend(hair_colour, ICON_ADD) + var/icon/eyes_icon = icon(icon, "[species_name]_holder_[cache_entry]_eyes") + eyes_icon.Blend(eye_colour, ICON_ADD) + + // Blend them together. + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + mob_icon.Blend(hair_icon, ICON_OVERLAY) + + // Add to the cache. + holder_mob_icon_cache[cache_key] = mob_icon + item_icons[cache_entry] = holder_mob_icon_cache[cache_key] + + // Handle the rest of sync(). + ..(M) diff --git a/icons/mob/holder_complex.dmi b/icons/mob/holder_complex.dmi new file mode 100644 index 00000000000..0c0235da028 Binary files /dev/null and b/icons/mob/holder_complex.dmi differ