diff --git a/code/_globals/lists/clothing.dm b/code/_globals/lists/clothing.dm
index 6cb05adce2e..fdb1697eaf2 100644
--- a/code/_globals/lists/clothing.dm
+++ b/code/_globals/lists/clothing.dm
@@ -28,3 +28,7 @@ GLOBAL_LIST_INIT(clothing_belt, generate_chameleon_choices(/obj/item/storage/bel
// accessories
GLOBAL_LIST_INIT(clothing_accessory, generate_chameleon_choices(/obj/item/clothing/accessory,
list(/obj/item/clothing/accessory/chameleon)))
+
+GLOBAL_LIST_INIT(clothing_ears, generate_chameleon_choices(/obj/item/clothing/ears))
+
+GLOBAL_LIST_INIT(clothing_headsets, generate_chameleon_choices(/obj/item/radio/headset))
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 33c15e5d897..a8e00c7ec73 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -144,11 +144,6 @@
slot_flags = SLOT_HOLSTER
origin_tech = list(TECH_BIO = 3)
-/obj/item/holder/protoblob
- slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER | SLOT_ICLOTHING | SLOT_ID | SLOT_MASK
- w_class = ITEMSIZE_TINY
- allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/melee/baton)
-
/obj/item/holder/fish/afterattack(atom/target, mob/user, clickchain_flags, list/params)
if(!target)
@@ -160,6 +155,12 @@
if(prob(10))
L.afflict_stun(20 * 2)
+/obj/item/holder/protoblob
+ clothing_flags = ALLOWINTERNALS
+ slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER | SLOT_ICLOTHING | SLOT_ID | SLOT_MASK | SLOT_GLOVES | SLOT_BACK | SLOT_BELT | SLOT_FEET | SLOT_EARS | SLOT_EYES
+ w_class = ITEMSIZE_TINY
+ allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/melee/baton)
+
//Roach Types
/obj/item/holder/roach
w_class = ITEMSIZE_TINY
diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm
index ea23643a206..70bd8bae23a 100644
--- a/code/modules/species/protean/protean_blob.dm
+++ b/code/modules/species/protean/protean_blob.dm
@@ -73,6 +73,9 @@
add_verb(src, /mob/living/simple_mob/protean_blob/proc/appearanceswitch)
add_verb(src, /mob/living/simple_mob/protean_blob/proc/rig_transform)
add_verb(src, /mob/living/simple_mob/protean_blob/proc/leap_attack)
+ add_verb(src, /mob/living/simple_mob/protean_blob/proc/chameleon_apperance)
+ add_verb(src, /mob/living/simple_mob/protean_blob/proc/chameleon_color)
+ add_verb(src, /mob/living/simple_mob/protean_blob/proc/chameleon_apperance_rig)
add_verb(src, /mob/living/proc/usehardsuit)
INVOKE_ASYNC(src, TYPE_PROC_REF(/mob, update_health))
else
@@ -524,6 +527,11 @@
icon_living = "puddle0"
update_icon()
+ if(istype(loc, /obj/item/holder))
+ var/obj/item/holder/H = loc
+ H.sync()
+
+
/mob/living/simple_mob/protean_blob/proc/leap_attack()
set name = "Pounce"
set desc = "Allows a protean blob to launch itself at people."
@@ -554,7 +562,7 @@
return
visible_message("[src] coils itself up like a spring, preparing to leap at [target]!")
- if(do_after(src, 7.5 SECONDS, target)) //7.5 seconds.
+ if(do_after(src, 1 SECOND, target)) //1 second
if(buckled || pinned.len)
return
@@ -563,7 +571,10 @@
src.forceMove(H)
switch(src.zone_sel.selecting)
- if(BP_GROIN)
+ if(BP_L_LEG)
+ targeted_area = SLOT_ID_UNIFORM //fetish_code.rtf
+ target_displayname = "body"
+ if(BP_R_LEG)
targeted_area = SLOT_ID_UNIFORM //fetish_code.rtf
target_displayname = "body"
if(BP_TORSO)
@@ -575,6 +586,24 @@
if(O_MOUTH)
targeted_area = SLOT_ID_MASK
target_displayname = "face"
+ if(BP_R_HAND)
+ targeted_area = SLOT_ID_GLOVES
+ target_displayname = "body"
+ if(BP_L_HAND)
+ targeted_area = SLOT_ID_GLOVES
+ target_displayname = "body"
+ if(BP_GROIN)
+ targeted_area = SLOT_ID_BACK
+ target_displayname = "back"
+ if(BP_L_FOOT)
+ targeted_area = SLOT_ID_SHOES
+ target_displayname = "feet"
+ if(BP_R_FOOT)
+ targeted_area = SLOT_ID_SHOES
+ target_displayname = "feet"
+ if(O_EYES)
+ targeted_area = SLOT_ID_GLASSES
+ target_displayname = "eyes"
if(target.equip_to_slot_if_possible(H, targeted_area, INV_OP_IGNORE_DELAY | INV_OP_SILENT))
visible_message("[src] leaps at [target]'s [target_displayname]!")
@@ -583,6 +612,140 @@
H.sync(src)
return
+/mob/living/simple_mob/protean_blob/proc/chameleon_apperance()
+ set name = "Chameleon Change"
+ set desc = "Allows a protean blob to change or reset its apperance when worn."
+ set category = "Abilities"
+
+ if(!istype(loc, /obj/item/holder))
+ to_chat(src, "You can't do that while not being held or worn.")
+ return
+
+ var/obj/item/holder/H = loc
+ var/chosen_list
+ var/icon_file
+ switch(input(src,"What type of clothing would you like to mimic or reset appearance?","Mimic Clothes") as null|anything in list("under", "suit", "hat", "gloves", "shoes", "back", "mask", "glasses", "belt", "ears", "headsets", "reset"))
+ if("reset")
+ H.color = initial(H.color)
+ H.icon_override = null
+ H.sync(src)
+ return
+ if("under")
+ chosen_list = GLOB.clothing_under
+ icon_file = 'icons/mob/clothing/uniform.dmi'
+ if("suit")
+ chosen_list = GLOB.clothing_suit
+ icon_file = 'icons/mob/clothing/suits.dmi'
+ if("hat")
+ chosen_list = GLOB.clothing_head
+ icon_file = 'icons/mob/clothing/head.dmi'
+ if("gloves")
+ chosen_list = GLOB.clothing_gloves
+ icon_file = 'icons/mob/clothing/hands.dmi'
+ if("shoes")
+ chosen_list = GLOB.clothing_shoes
+ icon_file = 'icons/mob/clothing/feet.dmi'
+ if("back")
+ chosen_list = GLOB.clothing_backpack
+ icon_file = 'icons/mob/clothing/back.dmi'
+ if("mask")
+ chosen_list = GLOB.clothing_mask
+ icon_file = 'icons/mob/clothing/mask.dmi'
+ if("glasses")
+ chosen_list = GLOB.clothing_glasses
+ icon_file = 'icons/mob/clothing/eyes.dmi'
+ if("belt")
+ chosen_list = GLOB.clothing_belt
+ icon_file = 'icons/mob/clothing/belt.dmi'
+ if("ears")
+ chosen_list = GLOB.clothing_ears
+ icon_file = 'icons/mob/clothing/ears.dmi'
+ if("headsets")
+ chosen_list = GLOB.clothing_headsets
+ icon_file = 'icons/mob/clothing/ears.dmi'
+
+ var/picked = input(src,"What clothing would you like to mimic?","Mimic Clothes") as null|anything in chosen_list
+
+ if(!ispath(chosen_list[picked]))
+ return
+
+ H.disguise(chosen_list[picked])
+ if(isnull(H.icon_override))
+ H.icon_override = icon_file
+ H.update_worn_icon() //so our overlays update.
+
+ if (ismob(H.loc))
+ var/mob/M = H.loc
+ M.update_inv_belt() //so our overlays
+ M.update_inv_back()
+
+
+/mob/living/simple_mob/protean_blob/proc/chameleon_apperance_rig()
+ set name = "Chameleon Hardsuit Change"
+ set desc = "Allows a protean blob to change or reset its apperance when worn."
+ set category = "Abilities"
+
+ if(!istype(loc, /obj/item/hardsuit/protean))
+ to_chat(src, "You can't do that while not being held or worn as a hardsuit.")
+ return
+
+ var/obj/item/hardsuit/protean/H = loc
+ var/chosen_list
+ var/obj/item/clothing/chosenpart
+
+ switch(input(src,"What type of clothing would you like to mimic or reset appearance?","Mimic Clothes") as null|anything in list("suit", "helmet", "gloves", "boots", "reset"))
+ if("reset")
+ H.boots.disguise(H.boots.type) //disguising it as itself just sets its vars back to initial which is what we want
+ H.chest.disguise(H.chest.type)
+ H.helmet.disguise(H.helmet.type)
+ H.gloves.disguise(H.gloves.type)
+ H.boots.update_worn_icon()
+ H.chest.update_worn_icon()
+ H.helmet.update_worn_icon()
+ H.gloves.update_worn_icon()
+ return
+ if("suit")
+ chosenpart = H.chest
+ chosen_list = GLOB.clothing_suit
+ if("helmet")
+ chosenpart = H.helmet
+ chosen_list = GLOB.clothing_head
+ if("gloves")
+ chosenpart = H.gloves
+ chosen_list = GLOB.clothing_gloves
+ if("boots")
+ chosenpart = H.boots
+ chosen_list = GLOB.clothing_shoes
+
+
+ var/picked = input(src,"What clothing would you like to mimic?","Mimic Clothes") as null|anything in chosen_list
+
+ if(!ispath(chosen_list[picked]))
+ return
+
+ chosenpart.disguise(chosen_list[picked])
+ chosenpart.update_worn_icon()
+
+
+/mob/living/simple_mob/protean_blob/proc/chameleon_color()
+ set name = "Chameleon Color"
+ set desc = "Allows a protean blob to change or reset its color when worn."
+ set category = "Abilities"
+
+ if(!istype(loc, /obj/item/holder))
+ to_chat(src, "You can't do that while not being held or worn.")
+ return
+
+ var/obj/item/holder/H = loc
+ var/color_in = input("Pick a color. Cancelling sets it to default.","Color", H.color) as null|color
+
+ if(color_in)
+ H.color = color_in
+ else
+ H.color = initial(H.color)
+ H.update_worn_icon() //so our overlays update.
+
+
/mob/living/simple_mob/protean_blob/make_perspective()
. = ..()
self_perspective.set_plane_visible(/atom/movable/screen/plane_master/augmented, INNATE_TRAIT)
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 3ab87182172..0f0a35776ad 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi
index 561c1ba994a..1a53707a9c4 100644
Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ
diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi
index 6fc7ba5826b..dbb4068a256 100644
Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index 4d209f3ceed..0bfa247f2ec 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index 1b1bfb3924f..74e6e842570 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ