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