Bedsheet ghost costumes (#35253)

* hoodie rework

* Bedsheet ghost: forced hoods, backpack hiders

* placeholder hoodies might have been a dumb idea

* Almost forgot the most important part

* spoopy holiday description check

* crafting

* cameras don't like nonexistent icons

* cult hood polish

* more polish

* removing hoods from xenoarch

* tying loose ends (loose hoods)

---------

Co-authored-by: DeityLink <logistics256@gmail.com>
This commit is contained in:
jellyveggie2
2023-10-30 02:54:57 +01:00
committed by GitHub
parent 31c0db4671
commit bf96811f55
38 changed files with 286 additions and 128 deletions

View File

@@ -330,15 +330,15 @@ var/MAX_EXPLOSION_RANGE = 32
// bitflags for clothing parts
#define FULL_TORSO (UPPER_TORSO|LOWER_TORSO)
#define FACE (EYES|MOUTH|BEARD) //38912
#define FULL_TORSO (UPPER_TORSO|LOWER_TORSO) // 6
#define FACE (EYES|MOUTH|BEARD) // 38912
#define BEARD 32768
#define FULL_HEAD (HEAD|EYES|MOUTH|EARS)
#define FULL_HEAD (HEAD|EYES|MOUTH|EARS) // 14337
#define LEGS (LEG_LEFT|LEG_RIGHT) // 24
#define FEET (FOOT_LEFT|FOOT_RIGHT) //96
#define ARMS (ARM_LEFT|ARM_RIGHT) //384
#define HANDS (HAND_LEFT|HAND_RIGHT) //1536
#define FULL_BODY (FULL_HEAD|HANDS|FULL_TORSO|ARMS|FEET|LEGS)
#define FEET (FOOT_LEFT|FOOT_RIGHT) // 96
#define ARMS (ARM_LEFT|ARM_RIGHT) // 384
#define HANDS (HAND_LEFT|HAND_RIGHT) // 1536
#define FULL_BODY (FULL_HEAD|HANDS|FULL_TORSO|ARMS|FEET|LEGS) // 16383
#define IGNORE_INV 16384 // Don't make stuff invisible
@@ -346,7 +346,7 @@ var/MAX_EXPLOSION_RANGE = 32
// Used in body_parts_covered
#define HIDEGLOVES HANDS
#define HIDEJUMPSUIT (ARMS|LEGS|FULL_TORSO)
#define HIDEJUMPSUIT (ARMS|LEGS|FULL_TORSO) // 414
#define HIDESHOES FEET
#define HIDEMASK FACE
#define HIDEEARS EARS
@@ -355,8 +355,9 @@ var/MAX_EXPLOSION_RANGE = 32
#define HIDEHEADHAIR 65536
#define MASKHEADHAIR 131072
#define HIDEBEARDHAIR BEARD
#define HIDEHAIR (HIDEHEADHAIR|HIDEBEARDHAIR)//98304
#define HIDEHAIR (HIDEHEADHAIR|HIDEBEARDHAIR) // 98304
#define HIDESUITSTORAGE LOWER_TORSO
#define HIDEBACK 262144
// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() as well as calculate_affecting_pressure() now

View File

@@ -1322,6 +1322,9 @@ var/list/arcane_tomes = list()
species_fit = list(VOX_SHAPED, INSECT_SHAPED, PLASMAMAN_SHAPED)
clothing_flags = PLASMAGUARD|CONTAINPLASMAMAN|ONESIZEFITSALL
mech_flags = MECH_SCAN_FAIL
hood = new /obj/item/clothing/head/culthood()
auto_hood = TRUE
hood_suit_name = "robes"
//plasmaman stuff
var/next_extinguish=0
@@ -1332,6 +1335,7 @@ var/list/arcane_tomes = list()
desc = "A set of warm armored robes worn by the followers of Nar-Sie."
icon_state = "cultrobes_snow"
heat_conductivity = SPACESUIT_HEAT_CONDUCTIVITY
hood = new /obj/item/clothing/head/culthood/snow()
/obj/item/clothing/suit/cultrobes/get_cult_power()
return 50
@@ -1506,6 +1510,7 @@ var/list/arcane_tomes = list()
icon_state = "cultrobes_old"
item_state = "cultrobes_old"
species_fit = list()
hood = new /obj/item/clothing/head/culthood/old()
/obj/item/clothing/head/magus
name = "magus helm"

View File

@@ -2085,14 +2085,14 @@ var/list/seer_rituals = list()
user_slot.forceMove(BT)
if(snow)
target.equip_to_slot_or_drop(new /obj/item/clothing/head/culthood/snow(target), slot_head)
if (ismonkey(target))
target.equip_to_slot_or_drop(new /obj/item/clothing/head/culthood/snow(target), slot_head) // hood now comes from the robes for humans
target.equip_to_slot_or_drop(new /obj/item/clothing/monkeyclothes/cultrobes/snow(target), slot_w_uniform)
else
target.equip_to_slot_or_drop(new /obj/item/clothing/suit/cultrobes/snow(target), slot_wear_suit)
else
target.equip_to_slot_or_drop(new /obj/item/clothing/head/culthood(target), slot_head)
if (ismonkey(target))
target.equip_to_slot_or_drop(new /obj/item/clothing/head/culthood(target), slot_head) // hood now comes from the robes for humans
target.equip_to_slot_or_drop(new /obj/item/clothing/monkeyclothes/cultrobes(target), slot_w_uniform)
else
target.equip_to_slot_or_drop(new /obj/item/clothing/suit/cultrobes(target), slot_wear_suit)

View File

@@ -68,6 +68,8 @@
allowed = list(/obj/item/weapon/tome_legacy,/obj/item/weapon/melee/legacy_cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
siemens_coefficient = 0
hood = new /obj/item/clothing/head/legacy_culthood()
hood_suit_name = "robes"
/obj/item/clothing/suit/legacy_cultrobes/cultify()
return

View File

@@ -354,7 +354,6 @@
slot_w_uniform_str = /obj/item/clothing/under/rank/clown,
slot_shoes_str = /obj/item/clothing/shoes/clown_shoes,
slot_gloves_str = /obj/item/clothing/gloves/black,
slot_head_str = /obj/item/clothing/head/chaplain_hood,
slot_ears_str = /obj/item/device/radio/headset,
slot_glasses_str = /obj/item/clothing/glasses/thermal/monocle,
slot_wear_suit_str = /obj/item/clothing/suit/chaplain_hoodie,

View File

@@ -1284,7 +1284,6 @@ var/list/all_bible_styles = list(
bookstyle = "Slab"
/datum/religion/clockworkcult/equip_chaplain(var/mob/living/carbon/human/H)
H.equip_or_collect(new /obj/item/clothing/head/clockwork_hood(H), slot_head)
H.equip_or_collect(new /obj/item/clothing/suit/clockwork_robes(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/clothing/shoes/clockwork_boots(H), slot_shoes)

View File

@@ -493,6 +493,7 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
/obj/item/clothing/head/snake,
/obj/item/clothing/head/franken_bolt,
/obj/item/clothing/head/alien_antenna,
/obj/item/clothing/suit/bedsheet_ghost,
//Slasher set
/obj/item/toy/chainsaw,
@@ -504,7 +505,6 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
//Reaper set
/obj/item/clothing/mask/gas/grim_reaper,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/reaper_robes,
/obj/item/toy/scythe,
@@ -605,7 +605,6 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
/obj/item/clothing/head/fez,
/obj/item/clothing/head/flatcap,
/obj/item/clothing/head/greenbandana,
/obj/item/clothing/head/hasturhood,
/obj/item/clothing/head/headband,
/obj/item/clothing/head/libertyhat,
/obj/item/clothing/head/mailman,
@@ -618,7 +617,6 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
/obj/item/clothing/head/ushanka,
/obj/item/clothing/head/wizard/magus/fake,
/obj/item/clothing/head/wizard/clown/fake,
/obj/item/clothing/head/wizard/necro/fake
)
/datum/supply_packs/randomised/cheap_glasses

View File

@@ -353,7 +353,6 @@
new /obj/item/clothing/suit/wizrobe/red(get_turf(src))
new /obj/item/clothing/shoes/sandal(get_turf(src))
if("necromancer")
new /obj/item/clothing/head/wizard/necro(get_turf(src))
new /obj/item/clothing/suit/wizrobe/necro(get_turf(src))
new /obj/item/clothing/shoes/sandal(get_turf(src))
if("clown")
@@ -476,7 +475,6 @@
new /obj/item/clothing/suit/wizrobe/red(get_turf(src))
new /obj/item/clothing/shoes/sandal(get_turf(src))
if("necromancer")
new /obj/item/clothing/head/wizard/necro(get_turf(src))
new /obj/item/clothing/suit/wizrobe/necro(get_turf(src))
new /obj/item/clothing/shoes/sandal(get_turf(src))
if("clown")

View File

@@ -2306,7 +2306,7 @@ var/global/num_vending_terminals = 1
/obj/item/weapon/storage/box/smartbox/clothing_box/marisa_wiz = 5,
/obj/item/weapon/storage/box/smartbox/clothing_box/hallowiz = 5,
/obj/item/weapon/storage/box/smartbox/clothing_box/magician = 5,
/obj/item/weapon/storage/box/smartbox/clothing_box/necromancer = 5,
/obj/item/clothing/suit/wizrobe/necro = 5,
/obj/item/weapon/storage/box/smartbox/clothing_box/pharaoh = 5,
/obj/item/clothing/suit/storage/wintercoat/druid = 5,
/obj/item/clothing/head/wizard/magus = 5,
@@ -2636,7 +2636,7 @@ var/global/num_vending_terminals = 1
/obj/item/weapon/storage/box/smartbox/clothing_box/liberty = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/aviator = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/proto = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/hastur = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/clothing/suit/hastur = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/owl = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/pirateoutfit = AUTO_DROBE_DEFAULT_STOCK,
/obj/item/weapon/storage/box/smartbox/clothing_box/lordadmiral = AUTO_DROBE_DEFAULT_STOCK,
@@ -3191,7 +3191,6 @@ var/global/num_vending_terminals = 1
/obj/item/clothing/suit/nun = 2,
/obj/item/clothing/head/nun_hood = 2,
/obj/item/clothing/suit/chaplain_hoodie = 2,
/obj/item/clothing/head/chaplain_hood = 2,
/obj/item/clothing/suit/holidaypriest = 2,
/obj/item/clothing/head/kippah/kippah_random = 5,
/obj/item/clothing/under/wedding/bride_white = 2,
@@ -3214,7 +3213,6 @@ var/global/num_vending_terminals = 1
/obj/item/weapon/storage/fancy/collection_plate = 1,
)
contraband = list(
/obj/item/clothing/head/clockwork_hood = 2,
/obj/item/clothing/suit/clockwork_robes = 2,
/obj/item/clothing/shoes/clockwork_boots = 2,
/obj/item/clothing/suit/kimono/ronin = 2

View File

@@ -1083,14 +1083,6 @@
new /obj/item/clothing/shoes/protoboots(src)
..()
/obj/item/weapon/storage/box/smartbox/clothing_box/hastur
name = "Hastur outfit box"
/obj/item/weapon/storage/box/smartbox/clothing_box/hastur/New()
new /obj/item/clothing/head/hasturhood(src)
new /obj/item/clothing/suit/hastur(src)
..()
/obj/item/weapon/storage/box/smartbox/clothing_box/owl
name = "Owl outfit box"
@@ -1226,14 +1218,6 @@
new /obj/item/clothing/shoes/sandal/marisa/leather(src)
..()
/obj/item/weapon/storage/box/smartbox/clothing_box/necromancer
name = "Necromancer robe box"
/obj/item/weapon/storage/box/smartbox/clothing_box/necromancer/New()
new /obj/item/clothing/head/wizard/necro(src)
new /obj/item/clothing/suit/wizrobe/necro(src)
..()
/obj/item/weapon/storage/box/smartbox/clothing_box/pharaoh
name = "Pharaoh robe box"

View File

@@ -135,7 +135,6 @@
new /obj/item/weapon/dnainjector/nofail/jumpy(src)
new /obj/item/weapon/spellbook/oneuse/bound_object(src)
new /obj/item/weapon/spellbook/oneuse/lightning/sith(src) //UNLIMITED POWER, requires wizard garb
new /obj/item/clothing/head/sith(src)
new /obj/item/clothing/suit/sith(src)
new /obj/item/clothing/shoes/sandal(src)

View File

@@ -22,7 +22,7 @@ LINEN BINS
toolsounds = list("rustle")
species_fit = list(VOX_SHAPED)
//cutting the bedsheet into rags
//cutting the bedsheet into rags and other things
/obj/item/weapon/bedsheet/attackby(var/obj/item/I, mob/user as mob)
var/cut_time=0
if(I.is_sharp())
@@ -32,12 +32,19 @@ LINEN BINS
if(do_after(user, src, cut_time))
if(!src)
return
to_chat(user, "<span class='notice'>You finish cutting \the [src] into rags.</span>")
var/turf/location = get_turf(src)
for(var/x=0; x<=8; x++)
var/obj/item/weapon/reagent_containers/glass/rag/S = new/obj/item/weapon/reagent_containers/glass/rag/(location)
S.pixel_x = rand(-5, 5) * PIXEL_MULTIPLIER
S.pixel_y = rand(-5, 5) * PIXEL_MULTIPLIER
if(user.zone_sel.selecting == TARGET_EYES)
to_chat(user, "<span class='notice'>You finish cutting eye holes into \the [src].</span>")
user.put_in_hands(new /obj/item/clothing/suit/bedsheet_ghost())
else
to_chat(user, "<span class='notice'>You finish cutting \the [src] into rags.</span>")
var/turf/location = get_turf(src)
for(var/x=0; x<=8; x++)
var/obj/item/weapon/reagent_containers/glass/rag/S = new/obj/item/weapon/reagent_containers/glass/rag/(location)
S.pixel_x = rand(-5, 5) * PIXEL_MULTIPLIER
S.pixel_y = rand(-5, 5) * PIXEL_MULTIPLIER
qdel(src)
//todo: hold one if possible?

View File

@@ -16,10 +16,8 @@
/obj/item/clothing/suit/nun,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/head/hasturhood,
/obj/item/clothing/suit/hastur,
/obj/item/clothing/suit/unathi/robe,
/obj/item/clothing/head/wizard/amp, //This will need to be removed when/if psychic wizards are properly implemented

View File

@@ -66,7 +66,6 @@
/obj/item/clothing/suit/nun,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/weapon/storage/backpack/cultpack,

View File

@@ -413,6 +413,25 @@
var/stack_depth = 0
var/blood_overlay_type = "hat"
var/obj/item/clothing/suit/hood_suit = null // the suit this hood belongs to
/obj/item/clothing/head/Destroy()
if(hood_suit)
hood_suit.hood = null
hood_suit = null
..()
/obj/item/clothing/head/pickup(var/mob/living/carbon/human/user)
if(hood_suit && istype(hood_suit) && user.get_item_by_slot(slot_wear_suit) == hood_suit)
hood_suit.hooddown(user, unequip = 0)
user.drop_from_inventory(src)
forceMove(hood_suit)
if (hood_suit.force_hood)
user.u_equip(hood_suit)
user.put_in_hands(hood_suit)
else
to_chat(user, "You put the hood down.")
var/global/hatStacking = 0
var/global/maxStackDepth = 10
@@ -635,6 +654,111 @@ var/global/maxStackDepth = 10
clothing_flags = CANEXTINGUISH
sterility = 30
// Hood stuff
var/obj/item/clothing/head/hood // Headgear to be used as hood, if any.
// Doesn't actually need a 'icons/mob/head.dmi' sprite if the hood_up_icon_state
// already provides the visuals for that (eg: most wintercoats in wintercoat.dm)
var/is_hood_up = FALSE
var/hood_suit_name = "coat" // What to call these garments when talking hood stuff. eg: coat, robes, hoodie...
var/hood_down_icon_state = null // Defaults to the initial icon_state if not set
var/hood_up_icon_state = null // Defaults to the initial icon_state if not set
var/force_hood = FALSE // Automatically equips the hood when equipping the suit. Removing the hood will remove the suit.
var/auto_hood = FALSE // Automatically equips the hood when equipping the suit.
/obj/item/clothing/suit/New()
if (hood)
hood.hood_suit = src
if (!force_hood)
actions_types |= list(/datum/action/item_action/toggle_hood)
if (wizard_garb)
hood.wizard_garb = TRUE
if (!hood_down_icon_state)
hood_down_icon_state = icon_state
if (!hood_up_icon_state)
hood_up_icon_state = icon_state
icon_state = hood_down_icon_state
..()
/obj/item/clothing/suit/Destroy()
if (hood)
QDEL_NULL(hood)
..()
/obj/item/clothing/suit/proc/togglehood()
set name = "Toggle Hood"
set category = "Object"
set src in usr
if (!hood)
return
if(usr.incapacitated())
return
var/mob/living/carbon/human/user = usr
if(!istype(user))
return
if(user.get_item_by_slot(slot_wear_suit) != src)
to_chat(user, "You have to put the [hood_suit_name] on first.")
return
if(!is_hood_up && !user.get_item_by_slot(slot_head) && hood.mob_can_equip(user,slot_head))
to_chat(user, "You put the hood up.")
hoodup(user)
else if(user.get_item_by_slot(slot_head) == hood)
hooddown(user)
to_chat(user, "You put the hood down.")
else
to_chat(user, "You try to put your hood up, but there is something in the way.")
return
user.update_inv_wear_suit()
/obj/item/clothing/suit/attack_self()
if (hood && !force_hood)
togglehood()
/obj/item/clothing/suit/proc/hoodup(var/mob/living/carbon/human/user)
user.equip_to_slot(hood, slot_head)
icon_state = hood_up_icon_state
is_hood_up = TRUE
user.update_inv_wear_suit()
/obj/item/clothing/suit/proc/hooddown(var/mob/living/carbon/human/user, var/unequip = 1)
icon_state = hood_down_icon_state
if(unequip)
user.u_equip(user.head,0)
is_hood_up = FALSE
user.update_inv_wear_suit()
/obj/item/clothing/suit/equipped(var/mob/user, var/slot, hand_index = 0)
..()
if (hood && (force_hood || auto_hood) && !hand_index)
if (auto_hood && (user.get_item_by_slot(slot_head) && user.get_item_by_slot(slot_head) != hood))
return//we want to still be able to equip the suit even if the hood is blocked
hoodup(user)
/obj/item/clothing/suit/unequipped(var/mob/living/carbon/human/user)
..()
if(hood && istype(user) && user.get_item_by_slot(slot_head) == hood)
hooddown(user)
/obj/item/clothing/suit/mob_can_equip(mob/M, slot, disable_warning = 0, automatic = 0)
. = ..()
if (hood && force_hood && slot == slot_wear_suit)
if (M.get_item_by_slot(slot_head) && M.get_item_by_slot(slot_head) != hood)
to_chat(M, "You try to put the [hood_suit_name] on, but there is something in the way of its hood.")
return FALSE
else if (!hood.mob_can_equip(M, slot_head))
return FALSE
/obj/item/clothing/suit/proc/vine_protected()
return FALSE

View File

@@ -656,6 +656,7 @@
species_fit = list(INSECT_SHAPED)
desc = "A hood worn by the followers of Ratvar."
flags = FPRINT
body_parts_covered = HIDEHAIR
/obj/item/clothing/head/franken_bolt
name = "neck bolts"
@@ -681,6 +682,13 @@
species_fit = list(INSECT_SHAPED)
flags = FPRINT
/obj/item/clothing/head/bedsheet_ghost
name = "Bedsheet Ghost"
desc = "You did cut out eye holes, but you don't remember drawing a face. Spooooky"
icon_state = "bedsheet_ghost"
body_parts_covered = FACE|FULL_HEAD|HIDEHAIR
wear_override = new/icon("icon" = 'icons/misc/empty.dmi', "icon_state" = "empty_icon")
/obj/item/clothing/head/elfhat
name = "elf hat"
desc = "Wear this hat, and become one of Santa's little helpers!"
@@ -802,4 +810,4 @@ var/image/unusual_overlay = image('icons/mob/head.dmi', "unusual_overlay", pixel
name = "Syndie football helmet"
desc = "It survived an explosive implant, it'll survive you."
flags = FPRINT
icon_state = "syndiefootballhelmet"
icon_state = "syndiefootballhelmet"

View File

@@ -63,6 +63,8 @@
item_state = "chaplain_hoodie"
species_fit = list(VOX_SHAPED, INSECT_SHAPED)
body_parts_covered = FULL_TORSO|LEGS|ARMS|IGNORE_INV
hood = new /obj/item/clothing/head/chaplain_hood()
hood_suit_name = "robes"
//Chaplain

View File

@@ -380,6 +380,8 @@ var/list/tag_suits_list = list()
wizard_garb = 1 //Allows lightning to be used
allowed = list(/obj/item/weapon/melee/energy/sword, /obj/item/weapon/melee/energy/sword/dualsaber) //Fits e-swords
species_fit = list(INSECT_SHAPED)
hood = new /obj/item/clothing/head/sith()
hood_suit_name = "robes"
/obj/item/clothing/suit/hastur
name = "Hastur's Robes"
@@ -387,6 +389,18 @@ var/list/tag_suits_list = list()
icon_state = "hastur"
item_state = "hastur"
body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET
hood = new /obj/item/clothing/head/hasturhood()
hood_suit_name = "robes"
/obj/item/clothing/suit/reaper_robes
name = "\improper grim robes"
desc = "Tends to snag on tombstones"
icon_state = "reaper_hoodie" //edited version of chaplain_hoodie. 1px longer, and more open at the front
item_state = "reaper_hoodie"
species_fit = list(VOX_SHAPED, INSECT_SHAPED)
body_parts_covered = FULL_TORSO|LEGS|ARMS|IGNORE_INV
hood = new /obj/item/clothing/head/chaplain_hood()
hood_suit_name = "robes"
/obj/item/clothing/suit/cassock
name = "Cassock"
@@ -746,6 +760,19 @@ var/list/tag_suits_list = list()
blood_overlay_type = "coat"
species_fit = list(VOX_SHAPED, GREY_SHAPED, INSECT_SHAPED)
/obj/item/clothing/suit/bedsheet_ghost
name = "Bedsheet Ghost"
desc = "You did cut out eye holes, but you don't remember drawing a face. Spooooky"
icon_state = "bedsheet_ghost"
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/clothing.dmi', "right_hand" = 'icons/mob/in-hand/right/clothing.dmi')
blood_overlay_type = "coat"
species_fit = list(VOX_SHAPED, GREY_SHAPED, INSECT_SHAPED)
hood = new /obj/item/clothing/head/bedsheet_ghost()
hood_suit_name = "robes"
body_parts_covered = FULL_BODY|HIDEBACK
body_parts_visible_override = FEET
force_hood = TRUE
/obj/item/clothing/suit/maidapron
name = "Apron"
desc = "Simple white apron."
@@ -935,6 +962,7 @@ var/list/tag_suits_list = list()
flags = FPRINT
body_parts_covered = ARMS|LEGS|FULL_TORSO|IGNORE_INV
allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod/spear)
hood = new /obj/item/clothing/head/clockwork_hood()
/obj/item/clothing/suit/inquisitor

View File

@@ -14,24 +14,11 @@
/obj/item/device/flashlight,
/obj/item/weapon/tank/emergency_oxygen,
/obj/item/weapon/tank/emergency_nitrogen)
var/is_hooded = 0
var/nohood = 0
var/obj/item/clothing/head/winterhood/hood
actions_types = list(/datum/action/item_action/toggle_hood)
hood = new /obj/item/clothing/head/winterhood()
/obj/item/clothing/suit/storage/wintercoat/New()
if(!nohood)
hood = new(src)
if(wizard_garb)
hood.wizard_garb = 1
else
actions_types = null
..()
/obj/item/clothing/suit/storage/wintercoat/Destroy()
if(hood)
QDEL_NULL(hood)
if (!hood_up_icon_state)
hood_up_icon_state = "[icon_state]_t"
..()
/obj/item/clothing/head/winterhood
@@ -40,20 +27,7 @@
icon_state = "whood"
body_parts_covered = HIDEHEADHAIR
heat_conductivity = SNOWGEAR_HEAT_CONDUCTIVITY
var/obj/item/clothing/suit/storage/wintercoat/coat
/obj/item/clothing/head/winterhood/New(var/obj/item/clothing/suit/storage/wintercoat/wc)
..()
if(istype(wc))
coat = wc
else if(!coat)
qdel(src)
/obj/item/clothing/head/winterhood/Destroy()
if(coat)
coat.hood = null
coat = null
..()
wear_override = new/icon("icon" = 'icons/misc/empty.dmi', "icon_state" = "empty")
/obj/item/clothing/suit/storage/wintercoat/security/captain
name = "captain's winter coat"
@@ -91,7 +65,7 @@
clothing_flags = 0
species_fit = list(GREY_SHAPED, VOX_SHAPED, INSECT_SHAPED)
armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
nohood = 1
hood = null
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS|IGNORE_INV
/obj/item/clothing/suit/storage/wintercoat/security/warden
@@ -99,7 +73,7 @@
icon_state = "coatwarden"
species_fit = list(GREY_SHAPED, VOX_SHAPED, INSECT_SHAPED)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS|IGNORE_INV
nohood = 1
hood = null
/obj/item/clothing/suit/storage/wintercoat/medical
name = "medical winter coat"
@@ -292,6 +266,7 @@
#define HAS_HOOD 1
#define NO_HOOD 0
/*
/obj/item/clothing/suit/storage/wintercoat/proc/togglehood()
set name = "Toggle Hood"
set category = "Object"
@@ -341,6 +316,7 @@
coat.hooddown(user,unequip = 0)
user.drop_from_inventory(src)
forceMove(coat)
*/
/obj/item/clothing/suit/storage/wintercoat/hoodie
name = "Grey hoodie"
@@ -351,6 +327,7 @@
clothing_flags = 0
species_fit = list(INSECT_SHAPED, VOX_SHAPED)
clothing_flags = COLORS_OVERLAY
hood_suit_name = "hoodie"
/obj/item/clothing/suit/storage/wintercoat/hoodie/black
name = "Black hoodie"
@@ -386,15 +363,14 @@
/obj/item/clothing/suit/storage/wintercoat/fur // think one of those big vintage fur coats you find in your grandmothers closet
name = "A heavy fur coat"
// icon_state = "furcoat"
icon_state = "furcoat"
item_state = "furcoat"
var/base_icon_state = "labcoat"
base_icon_state = "furcoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS //the sprite extends down to the ankles, it can protect the legs
clothing_flags = 0
species_fit = list(INSECT_SHAPED)
desc = "A thick fur coat. Your not sure what animal its fur from."
nohood = 1 //most fur coats dont have a hood
hood = null //most fur coats dont have a hood
var/belted = 1
armor = list(melee = 10, bullet = 5, laser = 10, energy = 10, bomb = 5, bio = 0, rad = 0) //its a big thick frontiersman fur coat, putting it on as partially protective
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS|IGNORE_INV
@@ -415,9 +391,9 @@
/obj/item/clothing/suit/storage/wintercoat/fur/update_icon()
if(!belted)
icon_state="[base_icon_state]_beltless"
icon_state="[is_hood_up ? hood_up_icon_state : hood_down_icon_state]_beltless"
else
icon_state="[base_icon_state]"
icon_state="[is_hood_up ? hood_up_icon_state : hood_down_icon_state]"
/obj/item/clothing/suit/storage/wintercoat/fur/verb/toggle()
set name = "Toggle Coat Belt"
@@ -441,5 +417,8 @@
/obj/item/clothing/suit/storage/wintercoat/fur/New()
. = ..()
actions_types |= list(/datum/action/item_action/toggle_belt)
update_icon()

View File

@@ -58,10 +58,11 @@
icon_state = "necromancer"
item_state = "necrohood"
siemens_coefficient = 0.8
body_parts_covered = HIDEHAIR
/obj/item/clothing/head/wizard/necro/fake
desc = "An elegant hood woven with child labor somewhere in Space China."
wizard_garb = 0
wizard_garb = FALSE
/*
//No longer required due to /obj/item/clothing/head/that/magic
@@ -178,6 +179,15 @@
icon_state = "necromancer"
item_state = "necrorobe"
species_fit = list(INSECT_SHAPED)
hood = new /obj/item/clothing/head/wizard/necro()
hood_suit_name = "robes"
auto_hood = TRUE
/obj/item/clothing/suit/wizrobe/necro/fake
desc = "An elegant robe woven with child labor somewhere in Space China."
wizard_garb = FALSE
hood = new /obj/item/clothing/head/wizard/necro/fake()
auto_hood = FALSE
/obj/item/clothing/head/wizard/marisa/fake
name = "Witch Hat"

View File

@@ -915,14 +915,6 @@
clothing_flags = ONESIZEFITSALL
body_parts_covered = FULL_HEAD|BEARD|HIDEHAIR
/obj/item/clothing/suit/reaper_robes
name = "grim robes"
desc = "Tends to snag on tombstones"
icon_state = "reaper_hoodie" //edited version of chaplain_hoodie. 1px longer, and more open at the front
item_state = "reaper_hoodie"
species_fit = list(VOX_SHAPED, INSECT_SHAPED)
body_parts_covered = FULL_TORSO|LEGS|ARMS|IGNORE_INV
/obj/item/clothing/under/clownpsyche
name = "Psychedelic clown outfit"
desc = "Do you know the definition of insanity?"

View File

@@ -84,7 +84,7 @@
msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n"
//back
if(back && back.is_visible())
if(back && !(slot_back in obscured) && back.is_visible())
if(back.is_blood_stained())
msg += "<span class='warning'>[t_He] [t_has] [bicon(back)] [back.a_stained()] [back.name] on [t_his] back! [format_examine(back, "Examine")][back.description_accessories()]</span>\n"
else

View File

@@ -368,19 +368,27 @@
else
return if_no_id
return
//repurposed proc. Now it combines get_worn_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
/mob/living/carbon/human/proc/get_visible_name()
if( wear_mask && wear_mask.is_hidden_identity()) //Wearing a mask which hides our face, use id-name if possible
return get_worn_id_name("Unknown")
if( head && head.is_hidden_identity())
return get_worn_id_name("Unknown") //Likewise for hats
if(istruevampire(src))
return get_worn_id_name("Unknown")
var/unknown_name = "Unknown"
if ((Holiday == APRIL_FOOLS_DAY || Holiday == HALLOWEEN) && istype(wear_suit, /obj/item/clothing/suit/bedsheet_ghost))
unknown_name = "a g-g-g-g-ghooooost"
if (wear_mask && wear_mask.is_hidden_identity()) //Wearing a mask which hides our face, use id-name if possible
return get_worn_id_name(unknown_name)
if (head && head.is_hidden_identity())
return get_worn_id_name(unknown_name) //Likewise for hats
if (istruevampire(src))
return get_worn_id_name(unknown_name)
var/face_name = get_face_name()
var/id_name = get_worn_id_name("")
if(id_name && (id_name != face_name))
return "[face_name] (as [id_name])"
return face_name
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/datum/organ/external/head/head_organ = get_organ(LIMB_HEAD)
@@ -425,58 +433,79 @@
var/obj/item/I = held_items[i]
dat += "<B>[capitalize(get_index_limb_name(i))]</B> <A href='?src=\ref[src];hands=[i]'>[makeStrippingButton(I)]</A><BR>"
dat += "<BR><B>Back:</B> <A href='?src=\ref[src];item=[slot_back]'>[makeStrippingButton(back)]</A>"
if(slot_back in obscured)
dat += "<BR><font color=grey><B>Back:</B> Obscured by [wear_suit]</font>"
else
dat += "<BR><B>Back:</B> <A href='?src=\ref[src];item=[slot_back]'>[makeStrippingButton(back)]</A>"
dat += "<BR>"
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[slot_head]'>[makeStrippingButton(head)]</A>"
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[slot_head]'>[makeStrippingButton(head)]</A>"
if(slot_wear_mask in obscured)
dat += "<BR><font color=grey><B>Mask:</B> Obscured by [head]</font>"
else
dat += "<BR><B>Mask:</B> <A href='?src=\ref[src];item=[slot_wear_mask]'>[makeStrippingButton(wear_mask)]</A>"
if(has_breathing_mask())
dat += "<BR>[HTMLTAB]&#8627;<B>Internals:</B> [src.internal ? "On" : "Off"] <A href='?src=\ref[src];internals=1'>(Toggle)</A>"
if(slot_glasses in obscured)
dat += "<BR><font color=grey><B>Eyes:</B> Obscured by [head]</font>"
else
dat += "<BR><B>Eyes:</B> <A href='?src=\ref[src];item=[slot_glasses]'>[makeStrippingButton(glasses)]</A>"
if(slot_ears in obscured)
dat += "<BR><font color=grey><B>Ears:</B> Obscured by [head]</font>"
else
dat += "<BR><B>Ears:</B> <A href='?src=\ref[src];item=[slot_ears]'>[makeStrippingButton(ears)]</A>"
dat += "<BR>"
dat += "<BR><B>Exosuit:</B> <A href='?src=\ref[src];item=[slot_wear_suit]'>[makeStrippingButton(wear_suit)]</A>"
if(wear_suit)
dat += "<BR>[HTMLTAB]&#8627;<B>Suit Storage:</B> <A href='?src=\ref[src];item=[slot_s_store]'>[makeStrippingButton(s_store)]</A>"
if(slot_shoes in obscured)
dat += "<BR><font color=grey><B>Shoes:</B> Obscured by [wear_suit]</font>"
else
dat += "<BR><B>Shoes:</B> <A href='?src=\ref[src];item=[slot_shoes]'>[makeStrippingButton(shoes)]</A>"
if(slot_gloves in obscured)
dat += "<BR><font color=grey><B>Gloves:</B> Obscured by [wear_suit]</font>"
else
dat += "<BR><B>Gloves:</B> <A href='?src=\ref[src];item=[slot_gloves]'>[makeStrippingButton(gloves)]</A>"
dat += "<BR><B>Belt:</B> <A href='?src=\ref[src];item=[slot_belt]'>[makeStrippingButton(belt)]</A>"
if(slot_w_uniform in obscured)
dat += "<BR><font color=grey><B>Uniform:</B> Obscured by [wear_suit]</font>"
else
dat += "<BR><B>Uniform:</B> <A href='?src=\ref[src];item=[slot_w_uniform]'>[makeStrippingButton(w_uniform)]</A>"
if(w_uniform)
dat += "<BR>[HTMLTAB]&#8627;<B>Suit Sensors:</B> <A href='?src=\ref[src];sensors=1'>Set</A>"
if(pickpocket)
dat += "<BR>[HTMLTAB]&#8627;<B>Pockets:</B> <A href='?src=\ref[src];pockets=left'>[(l_store && !(src.l_store.abstract)) ? l_store : "<font color=grey>Left (Empty)</font>"]</A>"
dat += " <A href='?src=\ref[src];pockets=right'>[(r_store && !(src.r_store.abstract)) ? r_store : "<font color=grey>Right (Empty)</font>"]</A>"
else
dat += "<BR>[HTMLTAB]&#8627;<B>Pockets:</B> <A href='?src=\ref[src];pockets=left'>[(l_store && !(src.l_store.abstract)) ? "Left (Full)" : "<font color=grey>Left (Empty)</font>"]</A>"
dat += " <A href='?src=\ref[src];pockets=right'>[(r_store && !(src.r_store.abstract)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A>"
dat += "<BR>[HTMLTAB]&#8627;<B>ID:</B> <A href='?src=\ref[src];id=1'>[makeStrippingButton(wear_id)]</A>"
dat += "<BR>"
if(handcuffed || mutual_handcuffs)
dat += "<BR><B>Handcuffed:</B> <A href='?src=\ref[src];item=[slot_handcuffed]'>Remove</A>"
if(legcuffed)
dat += "<BR><B>Legcuffed:</B> <A href='?src=\ref[src];item=[slot_legcuffed]'>Remove</A>"
dat += {"
<BR>
<BR><A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 340, 500)
popup.set_content(dat)
popup.open()

View File

@@ -50,6 +50,8 @@
obscured |= slot_w_uniform
if(is_slot_hidden(wear_suit.body_parts_covered, (HIDESHOES), 0))
obscured |= slot_shoes
if(is_slot_hidden(wear_suit.body_parts_covered, (HIDEBACK), 0))
obscured |= slot_back
if(head)
if(is_slot_hidden(head.body_parts_covered, (HIDEMASK), 0))
obscured |= slot_wear_mask

View File

@@ -1306,20 +1306,21 @@ var/global/list/damage_icon_parts = list()
if(has_icon(standing.icon, "[back.icon_state]_f"))
standing.icon_state = "[back.icon_state]_f"
var/obj/abstract/Overlays/O = obj_overlays[BACK_LAYER]
O.color = null
O.icon = standing
O.icon_state = standing.icon_state
if(I.clothing_flags & COLORS_OVERLAY)
O.color = I.color
O.overlays.len = 0
if(back.dynamic_overlay)
if(back.dynamic_overlay["[BACK_LAYER]"])
var/image/dyn_overlay = back.dynamic_overlay["[BACK_LAYER]"]
O.overlays += dyn_overlay
O.pixel_x = species.inventory_offsets["[slot_back]"]["pixel_x"] * PIXEL_MULTIPLIER
O.pixel_y = species.inventory_offsets["[slot_back]"]["pixel_y"] * PIXEL_MULTIPLIER
obj_to_plane_overlay(O,BACK_LAYER)
if (!check_hidden_body_flags(HIDEBACK))
var/obj/abstract/Overlays/O = obj_overlays[BACK_LAYER]
O.color = null
O.icon = standing
O.icon_state = standing.icon_state
if(I.clothing_flags & COLORS_OVERLAY)
O.color = I.color
O.overlays.len = 0
if(back.dynamic_overlay)
if(back.dynamic_overlay["[BACK_LAYER]"])
var/image/dyn_overlay = back.dynamic_overlay["[BACK_LAYER]"]
O.overlays += dyn_overlay
O.pixel_x = species.inventory_offsets["[slot_back]"]["pixel_x"] * PIXEL_MULTIPLIER
O.pixel_y = species.inventory_offsets["[slot_back]"]["pixel_y"] * PIXEL_MULTIPLIER
obj_to_plane_overlay(O,BACK_LAYER)
//overlays_standing[BACK_LAYER] = standing
//else
@@ -1521,6 +1522,8 @@ var/global/list/damage_icon_parts = list()
update_inv_glasses()
if(is_slot_hidden(W.body_parts_covered, (HIDEEARS), 0, W.body_parts_visible_override))
update_inv_ears()
if(is_slot_hidden(W.body_parts_covered, (HIDEBACK), 0, W.body_parts_visible_override))
update_inv_back()
/proc/is_slot_hidden(var/clothes, var/slot = -1,var/ignore_slot = 0, var/visibility_override = 0)
if(!clothes)

View File

@@ -399,7 +399,7 @@ var/global/list/item_mimic_disguises = list(
//Nuke, nuke disk, all coins, all minerals (except for those with no icons)
"vault" = list(/obj/machinery/nuclearbomb, /obj/item/weapon/disk/nuclear) + typesof(/obj/item/weapon/coin) + typesof(/obj/item/stack/sheet/mineral) - /obj/item/stack/sheet/mineral,
"chapel" = list(/obj/item/weapon/storage/bible, /obj/item/clothing/head/chaplain_hood, /obj/item/clothing/head/helmet/space/plasmaman/chaplain, /obj/item/clothing/suit/chaplain_hoodie, /obj/item/clothing/suit/space/plasmaman/chaplain,\
"chapel" = list(/obj/item/weapon/storage/bible, /obj/item/clothing/head/helmet/space/plasmaman/chaplain, /obj/item/clothing/suit/chaplain_hoodie, /obj/item/clothing/suit/space/plasmaman/chaplain,\
/obj/item/device/pda/chaplain, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/staff), //Chaplain garb, null rod, bible, holy water
)

View File

@@ -492,9 +492,7 @@
//6.6% chance to get legacy cult helmet/armor
var/choice = pick(
75;/obj/item/clothing/head/culthood,
25;/obj/item/clothing/suit/cultrobes,
60;/obj/item/clothing/head/culthood/old,
20;/obj/item/clothing/suit/cultrobes/old,
45;/obj/item/clothing/head/magus,
15;/obj/item/clothing/suit/magusred,

View File

@@ -240,7 +240,6 @@
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/spaceninjafake,
/obj/item/clothing/head/cardborg,
/obj/item/clothing/head/sith,
/obj/item/clothing/head/beaverhat,
/obj/item/clothing/head/fedora,
/obj/item/clothing/head/fez,

View File

@@ -31,7 +31,7 @@
list(/obj/item/clothing/suit/storage/wintercoat/engineering/ce, /obj/item/clothing/suit/storage/wintercoat/medical/cmo, /obj/item/clothing/suit/storage/wintercoat/security/hos, /obj/item/clothing/suit/storage/wintercoat/hop, /obj/item/clothing/suit/storage/wintercoat/security/captain, /obj/item/clothing/suit/storage/wintercoat/clown, /obj/item/clothing/suit/storage/wintercoat/slimecoat),
list(/obj/item/clothing/suit/space/rig/wizard, /obj/item/clothing/gloves/purple/wizard, /obj/item/clothing/shoes/sandal),
list(/obj/item/clothing/suit/space/ancient, /obj/item/clothing/head/helmet/space/ancient),
list(/obj/item/clothing/shoes/clockwork_boots, /obj/item/clothing/head/clockwork_hood, /obj/item/clothing/suit/clockwork_robes),
list(/obj/item/clothing/shoes/clockwork_boots, /obj/item/clothing/suit/clockwork_robes),
/obj/item/clothing/mask/necklace/xeno_claw,
/obj/item/clothing/under/newclothes,
/obj/item/clothing/suit/storage/draculacoat,
@@ -417,4 +417,4 @@
tongue = all_languages[LANGUAGE_DEATHSQUAD]
progress_goal = 20
progress_time = 15 SECONDS
progress_fail_chance = 25
progress_fail_chance = 25

BIN
icons/misc/empty.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 KiB

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

After

Width:  |  Height:  |  Size: 200 KiB

View File

@@ -271,7 +271,6 @@
"Ie" = (
/obj/structure/rack,
/obj/item/clothing/suit/wizrobe/necro,
/obj/item/clothing/head/wizard/necro,
/obj/item/clothing/shoes/sandal,
/turf/unsimulated/floor{
icon_state = "grimy"

View File

@@ -282,7 +282,6 @@
"X" = (
/obj/structure/rack,
/obj/item/clothing/suit/wizrobe/necro,
/obj/item/clothing/head/wizard/necro,
/obj/item/clothing/shoes/sandal,
/turf/unsimulated/floor{
icon_state = "cult";

View File

@@ -242,7 +242,6 @@
"uc" = (
/obj/structure/rack,
/obj/item/clothing/suit/wizrobe/necro,
/obj/item/clothing/head/wizard/necro,
/obj/item/clothing/shoes/sandal,
/turf/unsimulated/floor{
icon_state = "grimy"