Files
Casper3667 d002b8bd51 Various changes to black gloves (#21778)
- Leather gloves, black gloves and workboots now have unique names for
taj and unathi variants
- Updated the description of the leather and black gloves

The above was done so they can be recognized on sight, particularly in
the wardrobe machines where they otherwise looked identical.

- Renamed the black gloves to work gloves

This is effectively what they are. They have unique stats compared to
other colored gloves and as such, they should stand out a bit more aside
from just their description.

- Added taj and uanthi variants of the work gloves, leather gloves and
workboots to the wardrobe machines

The drobes had the human versions already, so this permits taj and
unathi to get their versions too.

- Made hangar techs spawn with work gloves and workboots

They already had access to these in the drobes, and it make sense for
their warehouse work that they got proper gear when spawning. The
workboots replace the sneakers they used to spawn.
2026-02-03 10:10:21 +00:00

576 lines
18 KiB
Plaintext

//*****************
//**Cham Jumpsuit**
//*****************
/obj/item/proc/disguise(newtype)
//this is necessary, unfortunately, as initial() does not play well with list vars
var/obj/item/copy = new newtype(null) //so that it is GCed once we exit
var/original_layer = layer
var/original_plane = plane
appearance = copy
layer = original_layer // So it doesn't get fucked up in the inv.
plane = original_plane
item_state = copy.item_state
body_parts_covered = copy.body_parts_covered
flags_inv = copy.flags_inv
body_parts_covered = copy.body_parts_covered
contained_sprite = copy.contained_sprite
icon_override = copy.icon_override
icon_species_tag = copy.icon_species_tag
if(copy.item_state_slots) // copy.item_state_slots.Copy() apears to be undefined
item_state_slots = copy.item_state_slots // however this appears to work perfectly fine
if(copy.item_icons)
item_icons = copy.item_icons.Copy()
if(copy.sprite_sheets)
sprite_sheets = copy.sprite_sheets.Copy()
//copying sprite_sheets_obj should be unnecessary as chameleon items are not refittable.
QDEL_IN(copy, 1) // The call chain should terminate by the time this triggers.
return copy //for inheritance
/proc/generate_chameleon_choices(var/basetype, var/blacklist=list(), var/list/whitelist=list())
. = list()
var/i = 1 //in case there is a collision with both name AND icon_state
for(var/typepath in (whitelist + typesof(basetype) - blacklist))
var/obj/O = typepath
if(initial(O.icon) && initial(O.icon_state))
var/name = initial(O.name)
if(name in .)
name += " ([initial(O.icon_state)])"
if(name in .)
name += " \[[i++]\]"
.[name] = typepath
/obj/item/clothing/under/chameleon
//starts off as black
name = "black jumpsuit"
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
icon_state = "ninja"
item_state = "ninja"
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/clothing/under/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/under/gimmick, /obj/item/clothing/under/rank/centcom_officer/bst)//Prevent infinite loops and bad jumpsuits.
clothing_choices = generate_chameleon_choices(/obj/item/clothing/under, blocked)
/obj/item/clothing/under/chameleon/emp_act(severity)
. = ..()
name = "psychedelic"
desc = "Groovy!"
icon_state = "psyche"
item_state_slots[slot_w_uniform_str] = "psyche"
update_icon()
update_clothing_icon()
/obj/item/clothing/under/chameleon/verb/change()
set name = "Change Jumpsuit Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*****************
//**Chameleon Hat**
//*****************
/obj/item/clothing/head/chameleon
name = "grey cap"
desc = "It looks like a softcap in a tasteless color, but upon closer inspection there's an advanced holographic array installed inside. It seems to have a small dial inside."
icon = 'icons/obj/clothing/hats/soft_caps.dmi'
icon_state = "softcap"
item_state = "softcap"
origin_tech = list(TECH_ILLEGAL = 3)
body_parts_covered = 0
var/global/list/clothing_choices
/obj/item/clothing/head/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/head/justice,)//Prevent infinite loops and bad hats.
clothing_choices = generate_chameleon_choices(/obj/item/clothing/head, blocked)
/obj/item/clothing/head/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = initial(name)
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = initial(icon_state)
update_icon()
update_clothing_icon()
/obj/item/clothing/head/chameleon/verb/change()
set name = "Change Hat/Helmet Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//******************
//**Chameleon Suit**
//******************
/obj/item/clothing/suit/chameleon
name = "armor"
icon_state = "armor"
item_state = "armor"
desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/clothing/suit/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/suit/cyborg_suit, /obj/item/clothing/suit/justice)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/suit, blocked)
/obj/item/clothing/suit/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "armor"
desc = "An armored vest that protects against some damage."
icon_state = "armor"
update_icon()
update_clothing_icon()
/obj/item/clothing/suit/chameleon/verb/change()
set name = "Change Oversuit Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*******************
//**Chameleon Plate Carrier**
//*******************
/obj/item/clothing/suit/armor/chameleon
name = "standard plate carrier"
icon = 'icons/obj/clothing/suits.dmi'
contained_sprite = TRUE
icon_state = "plate_chameleon"
item_state = "plate_chameleon"
w_class = WEIGHT_CLASS_NORMAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(
MELEE = ARMOR_MELEE_KEVLAR,
BULLET = ARMOR_BALLISTIC_MEDIUM,
LASER = ARMOR_LASER_KEVLAR,
ENERGY = ARMOR_ENERGY_SMALL,
BOMB = ARMOR_BOMB_PADDED
)
desc = "A standard plate carrier that upon closer inspection reveal a holographic cloaker that allows it to change its appearance. It seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/clothing/suit/armor/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/suit/cyborg_suit, /obj/item/clothing/suit/justice)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/suit, blocked)
/obj/item/clothing/suit/armor/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "plate carrier"
desc = "A generic plate carrier."
icon_state = "carrier_chameleon"
update_icon()
update_clothing_icon()
/obj/item/clothing/suit/armor/chameleon/verb/change()
set name = "Change Oversuit Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*******************
//**Chameleon Helmet**
//*******************
/obj/item/clothing/head/helmet/chameleon
name = "standard helmet"
desc = "A standard helmet that upon closer inspection reveal a holographic cloaker that allows it to change its appearance. It seems to have a small dial on the inside."
icon = 'icons/obj/item/clothing/head/modular_armor_helmets.dmi'
icon_state = "helm_generic"
item_state = "helm_generic"
contained_sprite = TRUE
origin_tech = list(TECH_ILLEGAL = 3)
armor = list(
MELEE = ARMOR_MELEE_KEVLAR,
BULLET = ARMOR_BALLISTIC_MEDIUM,
LASER = ARMOR_LASER_KEVLAR,
ENERGY = ARMOR_ENERGY_SMALL,
BOMB = ARMOR_BOMB_PADDED
)
var/global/list/clothing_choices
/obj/item/clothing/head/helmet/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/head/justice,)//Prevent infinite loops and bad hats.
clothing_choices = generate_chameleon_choices(/obj/item/clothing/head, blocked)
/obj/item/clothing/head/helmet/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "standard helmet"
desc = "A generic helmet."
icon_state = initial(icon_state)
update_icon()
update_clothing_icon()
/obj/item/clothing/head/helmet/chameleon/verb/change()
set name = "Change Hat/Helmet Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*******************
//**Chameleon Shoes**
//*******************
/obj/item/clothing/shoes/chameleon
name = "black shoes"
icon_state = "black"
item_state = "black"
desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe."
silent = 1
origin_tech = list(TECH_ILLEGAL = 3)
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM)
var/global/list/clothing_choices
/obj/item/clothing/shoes/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/shoes/galoshes/syndie, /obj/item/clothing/shoes/cyborg, /obj/item/clothing/shoes/sneakers/black/bst)//prevent infinite loops and bad shoes.
clothing_choices = generate_chameleon_choices(/obj/item/clothing/shoes, blocked)
/obj/item/clothing/shoes/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "black shoes"
desc = "A pair of black shoes."
icon_state = "black"
item_state = "black"
update_icon()
update_clothing_icon()
/obj/item/clothing/shoes/chameleon/verb/change()
set name = "Change Footwear Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//**********************
//**Chameleon Backpack**
//**********************
/obj/item/storage/backpack/chameleon
name = "backpack"
icon_state = "backpack"
item_state = "backpack"
desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage."
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/storage/backpack/chameleon/fill()
..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/storage/backpack/satchel/leather/withwallet)
clothing_choices = generate_chameleon_choices(/obj/item/storage/backpack, blocked)
/obj/item/storage/backpack/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "backpack"
desc = "You wear this on your back and put items into it."
icon_state = "backpack"
item_state = "backpack"
update_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_back()
/obj/item/storage/backpack/chameleon/verb/change()
set name = "Change Backpack Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
//so our overlays update.
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_back()
//********************
//**Chameleon Gloves**
//********************
/obj/item/clothing/gloves/chameleon
name = "work gloves"
icon_state = "black"
item_state = "black"
desc = "It looks like a pair of gloves, but it seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM)
var/global/list/clothing_choices
/obj/item/clothing/gloves/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/gloves/swat/bst)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/gloves, blocked)
/obj/item/clothing/gloves/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "work gloves"
desc = "It looks like a pair of gloves, but it seems to have a small dial inside."
icon_state = "black"
update_icon()
update_clothing_icon()
/obj/item/clothing/gloves/chameleon/verb/change()
set name = "Change Gloves Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//******************
//**Chameleon Mask**
//******************
/obj/item/clothing/mask/chameleon
name = "gas mask"
icon_state = "gas_alt"
item_state = "gas_alt"
desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
var/global/list/clothing_choices
/obj/item/clothing/mask/chameleon/Initialize()
. = ..()
if(!clothing_choices)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/mask, list(src.type))
/obj/item/clothing/mask/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "gas mask"
desc = "It's a gas mask."
icon_state = "gas_alt"
update_icon()
update_clothing_icon()
/obj/item/clothing/mask/chameleon/verb/change()
set name = "Change Mask Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*********************
//**Chameleon Glasses**
//*********************
/obj/item/clothing/glasses/chameleon
name = "optical meson scanner"
icon_state = "meson"
item_state = "glasses"
desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside."
origin_tech = list(TECH_ILLEGAL = 3)
var/list/global/clothing_choices
/obj/item/clothing/glasses/chameleon/Initialize()
. = ..()
if(!clothing_choices)
var/blocked = list(src.type, /obj/item/clothing/glasses/sunglasses/bst)
clothing_choices = generate_chameleon_choices(/obj/item/clothing/glasses, blocked)
/obj/item/clothing/glasses/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
. = ..()
name = "optical meson scanner"
desc = "It's a set of mesons."
icon_state = "meson"
update_icon()
update_clothing_icon()
/obj/item/clothing/glasses/chameleon/verb/change()
set name = "Change Glasses Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", clothing_choices)
if(!picked)
return
disguise(clothing_choices[picked])
update_clothing_icon() //so our overlays update.
//*****************
//**Chameleon Gun**
//*****************
/obj/item/gun/energy/chameleon
name = "desert eagle"
desc = null
icon = 'icons/obj/guns/deagle.dmi'
icon_state = "deagle"
w_class = WEIGHT_CLASS_NORMAL
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
matter = list()
fire_sound = 'sound/weapons/gunshot/gunshot1.ogg'
projectile_type = /obj/projectile/chameleon
charge_meter = 0
charge_cost = 20 //uses next to no power, since it's just holograms
max_shots = 50
var/obj/projectile/copy_projectile
var/global/list/gun_choices
/obj/item/gun/energy/chameleon/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Exactly as it appears, officer."
/obj/item/gun/energy/chameleon/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "This gun is actually a hologram projector that can alter its appearance to mimick other weapons. "
. += "To change the appearance, use the appropriate verb in the chameleon items tab."
. += "Any beams or projectiles fired from this gun are actually holograms and useless for actual combat."
. += "Projecting these holograms over distance uses a little bit of charge."
/obj/item/gun/energy/chameleon/Initialize()
. = ..()
if(!gun_choices)
gun_choices = list()
for(var/gun_type in typesof(/obj/item/gun/) - src.type)
var/obj/item/gun/G = gun_type
src.gun_choices[initial(G.name)] = gun_type
/obj/item/gun/energy/chameleon/consume_next_projectile()
var/obj/projectile/P = ..()
if(P && ispath(copy_projectile))
P.name = initial(copy_projectile.name)
P.icon = initial(copy_projectile.icon)
P.icon_state = initial(copy_projectile.icon_state)
P.pass_flags = initial(copy_projectile.pass_flags)
P.hitscan = initial(copy_projectile.hitscan)
P.range = initial(copy_projectile.range)
P.muzzle_type = initial(copy_projectile.muzzle_type)
P.tracer_type = initial(copy_projectile.tracer_type)
P.impact_type = initial(copy_projectile.impact_type)
return P
/obj/item/gun/energy/chameleon/emp_act(severity)
. = ..()
name = "desert eagle"
desc = "It's a desert eagle."
icon_state = "deagle"
update_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_r_hand()
M.update_inv_l_hand()
/obj/item/gun/energy/chameleon/disguise(var/newtype)
var/obj/item/gun/copy = ..()
flags_inv = copy.flags_inv
fire_sound = copy.fire_sound
fire_sound_text = copy.fire_sound_text
var/obj/item/gun/energy/E = copy
if(istype(E))
copy_projectile = E.projectile_type
desc = E.desc
else
copy_projectile = null
/obj/item/gun/energy/chameleon/verb/change()
set name = "Change Gun Appearance"
set category = "Chameleon Items"
set src in usr
var/picked = tgui_input_list(usr, "Select disguise.", "Disguise", gun_choices)
if(!picked)
return
disguise(gun_choices[picked])
//so our overlays update.
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_r_hand()
M.update_inv_l_hand()