diff --git a/code/__defines/sprite_sheets.dm b/code/__defines/sprite_sheets.dm new file mode 100644 index 0000000000..c40899e3fe --- /dev/null +++ b/code/__defines/sprite_sheets.dm @@ -0,0 +1,197 @@ +// Default species get default sprites, VR species get VR sprites +#define VR_SPECIES_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/suit/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/suit/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/head/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/head/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/head/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_TAJ = 'icons/inventory/hands/mob_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/hands/mob_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/hands/mob_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/hands/mob_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/hands/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/hands/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/hands/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_TAJ = 'icons/inventory/feet/mob_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/feet/mob_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/feet/mob_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/feet/mob_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/feet/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/feet/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/feet/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') + +#define VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/suit/item_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/suit/item_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/suit/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/suit/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/suit/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/head/item_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/head/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/head/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/head/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/hands/item_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/hands/item_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/hands/item_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/hands/item_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/hands/item_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/hands/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/hands/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/hands/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') +#define VR_SPECIES_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/feet/item_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/feet/item_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/feet/item_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/feet/item_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/feet/item_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/feet/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/feet/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/feet/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/feet/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/feet/item_vr_vulpkanin.dmi') + +// All species get VR sprites +#define ALL_VR_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/suit/mob_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/suit/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/suit/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/head/mob_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/head/mob_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/head/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/head/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/head/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_TAJ = 'icons/inventory/hands/mob_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/hands/mob_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/hands/mob_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/hands/mob_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/hands/mob_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/hands/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/hands/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/hands/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_TAJ = 'icons/inventory/feet/mob_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/feet/mob_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/feet/mob_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/feet/mob_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/feet/mob_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/feet/mob_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/feet/mob_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/feet/mob_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') + +#define ALL_VR_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/suit/item_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/suit/item_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/suit/item_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/suit/item_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/suit/item_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/suit/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/suit/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/suit/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/head/item_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/head/item_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/head/item_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/head/item_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/head/item_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/head/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/head/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/head/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/hands/item_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/hands/item_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/hands/item_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/hands/item_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/hands/item_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/hands/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/hands/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/hands/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') +#define ALL_VR_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_TAJ = 'icons/inventory/feet/item_vr_tajaran.dmi',\ +SPECIES_SKRELL = 'icons/inventory/feet/item_vr_skrell.dmi',\ +SPECIES_UNATHI = 'icons/inventory/feet/item_vr_unathi.dmi',\ +SPECIES_TESHARI = 'icons/inventory/feet/item_vr_teshari.dmi',\ +SPECIES_XENOHYBRID = 'icons/inventory/feet/item_vr_unathi.dmi',\ +SPECIES_AKULA = 'icons/inventory/feet/item_vr_akula.dmi',\ +SPECIES_SERGAL = 'icons/inventory/feet/item_vr_sergal.dmi',\ +SPECIES_NEVREAN = 'icons/inventory/feet/item_vr_sergal.dmi',\ +SPECIES_VULPKANIN = 'icons/inventory/feet/item_vr_vulpkanin.dmi',\ +SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item_vr_vulpkanin.dmi',\ +SPECIES_FENNEC = 'icons/inventory/feet/item_vr_vulpkanin.dmi') \ No newline at end of file diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index f4566e5101..fcb6554a5c 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -213,6 +213,26 @@ GLOBAL_LIST_EMPTY(mannequins) if(S.spawn_flags & SPECIES_IS_WHITELISTED) GLOB.whitelisted_species += S.name + // Suit cyclers + paths = subtypesof(/datum/suit_cycler_choice/department) + for(var/path in paths) + var/datum/suit_cycler_choice/SCC = path + if(!initial(SCC.name)) + continue + GLOB.suit_cycler_departments += new path() + paths = subtypesof(/datum/suit_cycler_choice/species) + for(var/path in paths) + var/datum/suit_cycler_choice/SCC = path + if(!initial(SCC.name)) + continue + GLOB.suit_cycler_species += new path() + paths = subtypesof(/datum/suit_cycler_choice/department/emag) + for(var/path in paths) + var/datum/suit_cycler_choice/SCC = path + if(!initial(SCC.name)) + continue + GLOB.suit_cycler_emagged += new path() + //Ores paths = subtypesof(/ore) for(var/oretype in paths) diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm index a45333cde9..5985626735 100644 --- a/code/datums/supplypacks/misc_vr.dm +++ b/code/datums/supplypacks/misc_vr.dm @@ -73,15 +73,44 @@ access = access_rd /datum/supply_pack/misc/ce_rig - name = "advanced voidsuit (empty)" + name = "advanced hardsuit (empty)" contains = list( /obj/item/weapon/rig/ce = 1 ) cost = 150 containertype = /obj/structure/closet/crate/secure/gear - containername = "advanced voidsuit crate" + containername = "advanced hardsuit crate" access = access_ce +/datum/supply_pack/misc/com_medical_rig + name = "commonwealth medical hardsuit (loaded)" + contains = list( + /obj/item/weapon/rig/baymed = 1 + ) + cost = 250 + containertype = /obj/structure/closet/crate/secure/gear + containername = "Commonwealth medical hardsuit crate" + access = access_medical + +/datum/supply_pack/misc/com_engineering_rig + name = "commonwealth engineering hardsuit (loaded)" + contains = list( + /obj/item/weapon/rig/bayeng = 1 + ) + cost = 250 + containertype = /obj/structure/closet/crate/secure/gear + containername = "Commonwealth medical hardsuit crate" + access = access_medical + +/datum/supply_pack/misc/zero_rig + name = "null hardsuit (jets)" + contains = list( + /obj/item/weapon/rig/zero = 1 + ) + cost = 75 + containertype = /obj/structure/closet/crate/secure/gear + containername = "null hardsuit crate" + /datum/supply_pack/misc/jetpack name = "jetpack (empty)" contains = list( diff --git a/code/datums/supplypacks/voidsuits_vr.dm b/code/datums/supplypacks/voidsuits_vr.dm index b193881004..bbe8fc094a 100644 --- a/code/datums/supplypacks/voidsuits_vr.dm +++ b/code/datums/supplypacks/voidsuits_vr.dm @@ -38,4 +38,105 @@ cost = 20 containertype = /obj/structure/closet/crate/secure containername = "Pilot voidsuit crate" - access = access_pilot \ No newline at end of file + access = access_pilot + + +// Surplus! +/datum/supply_pack/voidsuits/com_mining + name = "Commonwealth mining voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/mining/alt2, + /obj/item/clothing/head/helmet/space/void/mining/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth mining voidsuit crate" + access = access_mining + +/datum/supply_pack/voidsuits/com_anomaly + name = "Commonwealth anomaly suit" + contains = list( + /obj/item/clothing/suit/space/anomaly/alt, + /obj/item/clothing/head/helmet/space/anomaly/alt + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth anomaly suit crate" + access = access_xenoarch + +/datum/supply_pack/voidsuits/com_riot + name = "Commonwealth riot voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/security/riot/alt, + /obj/item/clothing/head/helmet/space/void/security/riot/alt + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth riot voidsuit crate" + access = access_brig + +/datum/supply_pack/voidsuits/com_pilot + name = "Commonwealth pilot voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/pilot/alt2, + /obj/item/clothing/head/helmet/space/void/pilot/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth pilot voidsuit crate" + access = access_pilot + +/datum/supply_pack/voidsuits/com_medical + name = "Commonwealth medical voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/medical/alt2, + /obj/item/clothing/head/helmet/space/void/medical/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth medical voidsuit crate" +/datum/supply_pack/voidsuits/com_explore + + name = "Commonwealth exploration voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/exploration/alt2, + /obj/item/clothing/head/helmet/space/void/exploration/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth exploration voidsuit crate" + access = access_explorer + +/datum/supply_pack/voidsuits/com_engineer + name = "Commonwealth engineering voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/engineering/alt2, + /obj/item/clothing/head/helmet/space/void/engineering/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth engineering voidsuit crate" + access = access_engine + +/datum/supply_pack/voidsuits/com_atmos + name = "Commonwealth atmos voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/atmos/alt2, + /obj/item/clothing/head/helmet/space/void/atmos/alt2 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth atmos voidsuit crate" + access = access_atmospherics + +/datum/supply_pack/voidsuits/com_captain + name = "Commonwealth captain voidsuit" + contains = list( + /obj/item/clothing/suit/space/void/captain/alt, + /obj/item/clothing/head/helmet/space/void/captain/alt + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure + name = "Commonwealth captain voidsuit crate" + access = access_captain + diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 68a93322c6..8657585718 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -232,7 +232,7 @@ user.setClickCooldown(user.get_attack_speed(W)) if (W.force >= src.toughness) user.do_attack_animation(src) - visible_message("[src] has been [W.attack_verb.len? pick(W.attack_verb) : "attacked"] with [W] by [user]!") + visible_message("[src] has been [LAZYLEN(W.attack_verb) ? pick(W.attack_verb) : "attacked"] with [W] by [user]!") if (istype(W, /obj/item)) //is it even possible to get into attackby() with non-items? var/obj/item/I = W if (I.hitsound) diff --git a/code/game/machinery/suit_cycler_datums.dm b/code/game/machinery/suit_cycler_datums.dm new file mode 100644 index 0000000000..205dc99979 --- /dev/null +++ b/code/game/machinery/suit_cycler_datums.dm @@ -0,0 +1,342 @@ +GLOBAL_LIST_EMPTY(suit_cycler_departments) +GLOBAL_LIST_EMPTY(suit_cycler_species) +GLOBAL_LIST_EMPTY(suit_cycler_emagged) + +/datum/suit_cycler_choice + var/name = null + +/datum/suit_cycler_choice/department + /// Name of the choice in the suit cycler menu + name = null + /// Type path of the suit to produce + var/suit_becomes + /// Type path of the helmet to produce + var/helmet_becomes + +/datum/suit_cycler_choice/department/proc/can_refit_helmet(obj/item/clothing/head/helmet/helmet) + return !!helmet_becomes + +/datum/suit_cycler_choice/department/proc/do_refit_helmet(obj/item/clothing/head/helmet/helmet) + var/obj/item/clothing/tmp = new helmet_becomes() + helmet.name = "refitted [tmp.name]" + helmet.desc = tmp.desc + helmet.icon_state = tmp.icon_state + helmet.item_state = tmp.item_state + helmet.item_state_slots = tmp.item_state_slots?.Copy() + helmet.sprite_sheets = tmp.sprite_sheets?.Copy() + helmet.sprite_sheets_obj = tmp.sprite_sheets_obj?.Copy() + helmet.default_worn_icon = tmp.default_worn_icon + +/datum/suit_cycler_choice/department/proc/can_refit_suit(obj/item/clothing/suit/space/suit) + return !!suit_becomes + +/datum/suit_cycler_choice/department/proc/do_refit_suit(obj/item/clothing/suit/space/suit) + var/obj/item/clothing/tmp = new suit_becomes() + suit.name = "refitted [tmp.name]" + suit.desc = tmp.desc + suit.icon_state = tmp.icon_state + suit.item_state = tmp.item_state + suit.item_state_slots = tmp.item_state_slots?.Copy() + suit.sprite_sheets = tmp.sprite_sheets?.Copy() + suit.sprite_sheets_obj = tmp.sprite_sheets_obj?.Copy() + suit.default_worn_icon = tmp.default_worn_icon + +// Ye olde 'noop' choice for refits +/datum/suit_cycler_choice/department/noop + name = "No Change" +/datum/suit_cycler_choice/department/noop/can_refit_helmet(obj/item/clothing/head/helmet/helmet) + return TRUE +/datum/suit_cycler_choice/department/noop/do_refit_helmet(obj/item/clothing/head/helmet/helmet) + return +/datum/suit_cycler_choice/department/noop/can_refit_suit(obj/item/clothing/suit/space/suit) + return TRUE +/datum/suit_cycler_choice/department/noop/do_refit_suit(obj/item/clothing/suit/space/suit) + return + + + +/datum/suit_cycler_choice/department/eng/standard + name = "Engineering" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering + suit_becomes = /obj/item/clothing/suit/space/void/engineering +/datum/suit_cycler_choice/department/eng/reinforced + name = "Reinforced Engineering" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering/alt + suit_becomes = /obj/item/clothing/suit/space/void/engineering/alt +/datum/suit_cycler_choice/department/eng/commonwealth_standard + name = "Commonwealth Engineering" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/engineering/alt2 +/datum/suit_cycler_choice/department/eng/atmospherics + name = "Atmospherics" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/atmos + suit_becomes = /obj/item/clothing/suit/space/void/atmos +/datum/suit_cycler_choice/department/eng/heavyduty + name = "Heavy Duty Atmos" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/atmos/alt + suit_becomes = /obj/item/clothing/suit/space/void/atmos/alt +/datum/suit_cycler_choice/department/eng/commonwealth_atmos + name = "Commonwealth Atmos" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/atmos/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/atmos/alt2 +/datum/suit_cycler_choice/department/eng/hazmat + name = "HAZMAT" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering/hazmat + suit_becomes = /obj/item/clothing/suit/space/void/engineering/hazmat +/datum/suit_cycler_choice/department/eng/construction + name = "Construction" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering/construction + suit_becomes = /obj/item/clothing/suit/space/void/engineering/construction +/datum/suit_cycler_choice/department/eng/salvager + name = "Salvager" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/engineering/salvage + suit_becomes = /obj/item/clothing/suit/space/void/engineering/salvage + +/datum/suit_cycler_choice/department/crg/mining + name = "Mining" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/mining + suit_becomes = /obj/item/clothing/suit/space/void/mining +/datum/suit_cycler_choice/department/crg/frontiermining + name = "Frontier Mining" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/mining/alt + suit_becomes = /obj/item/clothing/suit/space/void/mining/alt +/datum/suit_cycler_choice/department/crg/commonwealth + name = "Commonwealth Mining" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/mining/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/mining/alt2 + + +/datum/suit_cycler_choice/department/med/standard + name = "Medical" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/medical + suit_becomes = /obj/item/clothing/suit/space/void/medical +/datum/suit_cycler_choice/department/med/streamlined + name = "Vey-Medical Streamlined" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/medical/alt + suit_becomes = /obj/item/clothing/suit/space/void/medical/alt +/datum/suit_cycler_choice/department/med/commonwealth + name = "Commonwealth Medical" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/medical/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/medical/alt2 +/datum/suit_cycler_choice/department/med/biohazard + name = "Biohazard" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/medical/bio + suit_becomes = /obj/item/clothing/suit/space/void/medical/bio +/datum/suit_cycler_choice/department/med/emt + name = "Emergency Medical Response" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/medical/emt + suit_becomes = /obj/item/clothing/suit/space/void/medical/emt + + +/datum/suit_cycler_choice/department/sec/standard + name = "Security" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/security + suit_becomes = /obj/item/clothing/suit/space/void/security +/datum/suit_cycler_choice/department/sec/riot + name = "Crowd Control" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/security/riot + suit_becomes = /obj/item/clothing/suit/space/void/security/riot +/datum/suit_cycler_choice/department/sec/commonwealth + name = "Commonwealth Crowd Control" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/security/riot/alt + suit_becomes = /obj/item/clothing/suit/space/void/security/riot/alt +/datum/suit_cycler_choice/department/sec/eva + name = "Security EVA" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/security/alt + suit_becomes = /obj/item/clothing/suit/space/void/security/alt + + +/datum/suit_cycler_choice/department/exp/standard + name = "Exploration" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/exploration + suit_becomes = /obj/item/clothing/suit/space/void/exploration +/datum/suit_cycler_choice/department/exp/medic + name = "Field Medic" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/expedition_medical + suit_becomes = /obj/item/clothing/suit/space/void/expedition_medical +/datum/suit_cycler_choice/department/exp/old + name = "Old Exploration" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/exploration/alt + suit_becomes = /obj/item/clothing/suit/space/void/exploration/alt +/datum/suit_cycler_choice/department/exp/commonwealth + name = "Commonwealth Exploration" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/exploration/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/exploration/alt2 + + +/datum/suit_cycler_choice/department/pil/pilot + name = "Pilot" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/pilot + suit_becomes = /obj/item/clothing/suit/space/void/pilot +/datum/suit_cycler_choice/department/pil/pilot_blue + name = "Pilot Blue" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/pilot/alt + suit_becomes = /obj/item/clothing/suit/space/void/pilot/alt +/datum/suit_cycler_choice/department/pil/commonwealth + name = "Commonwealth Pilot" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/pilot/alt2 + suit_becomes = /obj/item/clothing/suit/space/void/pilot/alt2 + + +/datum/suit_cycler_choice/department/captain + name = "Manager" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/captain + suit_becomes = /obj/item/clothing/suit/space/void/captain +/datum/suit_cycler_choice/department/captain/commonwealth + name = "Commonwealth Captain" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/captain/alt + suit_becomes = /obj/item/clothing/suit/space/void/captain/alt + + +/datum/suit_cycler_choice/department/prototype + name = "Prototype" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/security/prototype + suit_becomes = /obj/item/clothing/suit/space/void/security/prototype + + +/datum/suit_cycler_choice/department/emag/merc + name = "^%###^%$" || "Mercenary" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/merc + suit_becomes = /obj/item/clothing/suit/space/void/merc +/datum/suit_cycler_choice/department/emag/pyro + name = "Charring" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/merc/fire + suit_becomes = /obj/item/clothing/suit/space/void/merc/fire + + +/datum/suit_cycler_choice/department/wizard + name = "Gem-Encrusted" || "Wizard" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/wizard + suit_becomes = /obj/item/clothing/suit/space/void/wizard + + +/datum/suit_cycler_choice/department/vintage/crew + name = "Vintage Crew" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb + suit_becomes = /obj/item/clothing/suit/space/void/refurb +/datum/suit_cycler_choice/department/vintage/eng + name = "Vintage Engineering" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/engineering + suit_becomes = /obj/item/clothing/suit/space/void/refurb/engineering +/datum/suit_cycler_choice/department/vintage/marine + name = "Vintage Marine" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/marine + suit_becomes = /obj/item/clothing/suit/space/void/refurb/marine +/datum/suit_cycler_choice/department/vintage/officer + name = "Vintage Officer" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/officer + suit_becomes = /obj/item/clothing/suit/space/void/refurb/officer +/datum/suit_cycler_choice/department/vintage/research + name = "Vintage Research (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/research/alt + suit_becomes = /obj/item/clothing/suit/space/void/refurb/research +/datum/suit_cycler_choice/department/vintage/research/ch + name = "Vintage Research (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/research + suit_becomes = /obj/item/clothing/suit/space/void/refurb/research +/datum/suit_cycler_choice/department/vintage/med + name = "Vintage Medical (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/medical/alt + suit_becomes = /obj/item/clothing/suit/space/void/refurb/medical +/datum/suit_cycler_choice/department/vintage/med/ch + name = "Vintage Medical (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/medical + suit_becomes = /obj/item/clothing/suit/space/void/refurb/medical +/datum/suit_cycler_choice/department/vintage/merc + name = "Vintage Mercenary" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/mercenary + suit_becomes = /obj/item/clothing/suit/space/void/refurb/mercenary +/datum/suit_cycler_choice/department/vintage/pilot + name = "Vintage Pilot (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/pilot + suit_becomes = /obj/item/clothing/suit/space/void/refurb/pilot +/datum/suit_cycler_choice/department/vintage/pilot/ch + name = "Vintage Pilot (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/pilot/alt + suit_becomes = /obj/item/clothing/suit/space/void/refurb/pilot + + +/datum/suit_cycler_choice/department/talon/crew + name = "Talon Crew" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/talon +/datum/suit_cycler_choice/department/talon/eng + name = "Talon Engineering" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/engineering/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/engineering/talon +/datum/suit_cycler_choice/department/talon/med + name = "Talon Medical (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/medical/alt/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/medical/talon +/datum/suit_cycler_choice/department/talon/med/ch + name = "Talon Medical (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/medical/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/medical/talon +/datum/suit_cycler_choice/department/talon/officer + name = "Talon Officer" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/officer/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/officer/talon +/datum/suit_cycler_choice/department/talon/pilot + name = "Talon Pilot (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/pilot/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/pilot/talon +/datum/suit_cycler_choice/department/talon/pilot/ch + name = "Talon Pilot (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/pilot/alt/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/pilot/talon +/datum/suit_cycler_choice/department/talon/res + name = "Talon Research (Bubble Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/research/alt/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/research/talon +/datum/suit_cycler_choice/department/talon/res/ch + name = "Talon Research (Closed Helm)" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/research/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/research/talon +/datum/suit_cycler_choice/department/talon/marine + name = "Talon Marine" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/marine/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/marine/talon +/datum/suit_cycler_choice/department/talon/marine/alt + name = "Talon Mercenary" + helmet_becomes = /obj/item/clothing/head/helmet/space/void/refurb/mercenary/talon + suit_becomes = /obj/item/clothing/suit/space/void/refurb/mercenary/talon + + + +// Uses same logic as it used to, which is that it bases an assumption of 'we should have custom sprites' on +// the presence of the species in the sprite_sheets_obj list on the helmet and suit +/datum/suit_cycler_choice/species/proc/can_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) + for(var/obj/item/clothing/C in list(helmet, suit)) + if(LAZYACCESS(C.sprite_sheets_obj, name)) + if(!(C.icon_state in cached_icon_states(C.sprite_sheets_obj[name]))) + return FALSE // Species was in sprite_sheets_obj, but had no sprite for this object in particular + + return TRUE + +/datum/suit_cycler_choice/species/proc/do_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) + for(var/obj/item/clothing/C in list(helmet, suit)) + C.refit_for_species(name) + +/datum/suit_cycler_choice/species/noop + name = "No Change" +/datum/suit_cycler_choice/species/noop/can_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) + return TRUE +/datum/suit_cycler_choice/species/noop/do_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) + return + +/datum/suit_cycler_choice/species/human + name = SPECIES_HUMAN +/datum/suit_cycler_choice/species/skrell + name = SPECIES_SKRELL +/datum/suit_cycler_choice/species/unathi + name = SPECIES_UNATHI +/datum/suit_cycler_choice/species/tajaran + name = SPECIES_TAJ +/datum/suit_cycler_choice/species/teshari + name = SPECIES_TESHARI +/datum/suit_cycler_choice/species/akula + name = SPECIES_AKULA +/datum/suit_cycler_choice/species/sergal + name = SPECIES_SERGAL +/datum/suit_cycler_choice/species/vulpkanin + name = SPECIES_VULPKANIN diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 8b1969c3aa..b3bfe4923b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -11,11 +11,11 @@ density = 1 var/mob/living/carbon/human/OCCUPANT = null var/obj/item/clothing/suit/space/SUIT = null - var/SUIT_TYPE = null + var/suit_type = null var/obj/item/clothing/head/helmet/space/HELMET = null - var/HELMET_TYPE = null + var/helmet_type = null var/obj/item/clothing/mask/MASK = null //All the stuff that's gonna be stored insiiiiiiiiiiiiiiiiiiide, nyoro~n - var/MASK_TYPE = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself. + var/mask_type = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself. var/isopen = 0 var/islocked = 0 var/isUV = 0 @@ -29,18 +29,19 @@ //The units themselves///////////////// /obj/machinery/suit_storage_unit/standard_unit - SUIT_TYPE = /obj/item/clothing/suit/space - HELMET_TYPE = /obj/item/clothing/head/helmet/space - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space + helmet_type = /obj/item/clothing/head/helmet/space + mask_type = /obj/item/clothing/mask/breath -/obj/machinery/suit_storage_unit/New() +/obj/machinery/suit_storage_unit/Initialize() + . = ..() + if(suit_type) + SUIT = new suit_type(src) + if(helmet_type) + HELMET = new helmet_type(src) + if(mask_type) + MASK = new mask_type(src) update_icon() - if(SUIT_TYPE) - SUIT = new SUIT_TYPE(src) - if(HELMET_TYPE) - HELMET = new HELMET_TYPE(src) - if(MASK_TYPE) - MASK = new MASK_TYPE(src) /obj/machinery/suit_storage_unit/update_icon() var/hashelmet = 0 @@ -168,21 +169,9 @@ /obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob) -// var/protected = 0 -// var/mob/living/carbon/human/H = user if(!panelopen) return - /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G,/obj/item/clothing/gloves/yellow)) - protected = 1 - - if(!protected) - playsound(src, "sparks", 75, 1, -1) - to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ else //welp, the guy is protected, we can continue if(issuperUV) to_chat(user, "You slide the dial back towards \"185nm\".") @@ -194,21 +183,9 @@ /obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user as mob) -// var/protected = 0 -// var/mob/living/carbon/human/H = user if(!panelopen) //Needed check due to bugs return - /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G,/obj/item/clothing/gloves/yellow)) - protected = 1 - - if(!protected) - playsound(src, "sparks", 75, 1, -1) - to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ else to_chat(user, "You push the button. The coloured LED next to it changes.") safetieson = !safetieson @@ -335,30 +312,6 @@ updateUsrDialog() return -/* spawn(200) //Let's clean dat shit after 20 secs //Eh, this doesn't work - if(HELMET) - HELMET.clean_blood() - if(SUIT) - SUIT.clean_blood() - if(MASK) - MASK.clean_blood() - isUV = 0 //Cycle ends - update_icon() - updateUsrDialog() - - var/i - for(i=0,i<4,i++) //Gradually give the guy inside some damaged based on the intensity - spawn(50) - if(OCCUPANT) - if(issuperUV) - OCCUPANT.take_organ_damage(0,40) - to_chat(user, "Test. You gave him 40 damage") - else - OCCUPANT.take_organ_damage(0,8) - to_chat(user, "Test. You gave him 8 damage") - return*/ - - /obj/machinery/suit_storage_unit/proc/cycletimeleft() if(cycletime_left >= 1) cycletime_left-- @@ -371,8 +324,6 @@ if(!OCCUPANT) return -// for(var/obj/O in src) -// O.loc = src.loc if(OCCUPANT.client) if(user != OCCUPANT) @@ -426,14 +377,10 @@ usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src usr.loc = src -// usr.metabslow = 1 OCCUPANT = usr isopen = 0 //Close the thing after the guy gets inside update_icon() -// for(var/obj/O in src) -// qdel(O) - add_fingerprint(usr) updateUsrDialog() return @@ -475,8 +422,6 @@ OCCUPANT = M isopen = 0 //close ittt - //for(var/obj/O in src) - // O.loc = src.loc add_fingerprint(user) qdel(G) updateUsrDialog() @@ -535,9 +480,10 @@ //////////////////////////////REMINDER: Make it lock once you place some fucker inside. -//God this entire file is fucking awful +//God this entire file is fucking awful //Yes //Suit painter for Bay's special snowflake aliums. +GLOBAL_LIST_EMPTY(suit_cycler_typecache) /obj/machinery/suit_cycler name = "suit cycler" @@ -559,6 +505,7 @@ var/can_repair // If set, the cycler can repair voidsuits. var/electrified = 0 +<<<<<<< HEAD //Departments that the cycler can paint suits to look like. var/list/departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Security EVA") //Species that the suits can be configured to fit. @@ -566,6 +513,41 @@ var/target_department var/target_species +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport + //Departments that the cycler can paint suits to look like. + var/list/departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Security EVA") + //Species that the suits can be configured to fit. + var/list/species = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_TAJ, SPECIES_TESHARI) + + var/target_department + var/target_species +======= + /// Departments that the cycler can paint suits to look like. Null assumes all except specially excluded ones. + /// No idea why these particular suits are the default cycler's options. + var/list/limit_departments = list( + /datum/suit_cycler_choice/department/eng/standard, + /datum/suit_cycler_choice/department/crg/mining, + /datum/suit_cycler_choice/department/med/standard, + /datum/suit_cycler_choice/department/sec/standard, + /datum/suit_cycler_choice/department/eng/atmospherics, + /datum/suit_cycler_choice/department/eng/hazmat, + /datum/suit_cycler_choice/department/eng/construction, + /datum/suit_cycler_choice/department/med/biohazard, + /datum/suit_cycler_choice/department/med/emt, + /datum/suit_cycler_choice/department/sec/riot, + /datum/suit_cycler_choice/department/sec/eva + ) + + /// Species that the cycler can refit suits for. Null assumes all except specially excluded ones. + var/list/limit_species + + var/list/departments + var/list/species + var/list/emagged_departments + + var/datum/suit_cycler_choice/department/target_department + var/datum/suit_cycler_choice/species/target_species +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport var/mob/living/carbon/human/occupant = null var/obj/item/clothing/suit/space/void/suit = null @@ -573,96 +555,187 @@ var/datum/wires/suit_storage_unit/wires = null -/obj/machinery/suit_cycler/New() - ..() +/obj/machinery/suit_cycler/Initialize() + . = ..() + departments = load_departments() + species = load_species() + emagged_departments = load_emagged() + limit_departments = null // just for mem + + target_department = departments["No Change"] + target_species = species["No Change"] + + if(!target_department || !target_species) + stat |= BROKEN + wires = new(src) - target_department = departments[1] - target_species = species[1] - if(!target_department || !target_species) qdel(src) /obj/machinery/suit_cycler/Destroy() qdel(wires) wires = null return ..() +/obj/machinery/suit_cycler/proc/load_departments() + var/list/typecache = GLOB.suit_cycler_typecache[type] + // First of our type + if(!typecache) + typecache = list() + GLOB.suit_cycler_typecache[type] = typecache + var/list/loaded = typecache["departments"] + // No departments loaded + if(!loaded) + loaded = list() + typecache["departments"] = loaded + for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_departments) + if(istype(thing, /datum/suit_cycler_choice/department/noop)) + loaded[thing.name] = thing + continue + if(limit_departments && !is_type_in_list(thing, limit_departments)) + continue + loaded[thing.name] = thing + + return loaded + +/obj/machinery/suit_cycler/proc/load_species() + var/list/typecache = GLOB.suit_cycler_typecache[type] + // First of our type + if(!typecache) + typecache = list() + GLOB.suit_cycler_typecache[type] = typecache + var/list/loaded = typecache["species"] + // No species loaded + if(!loaded) + loaded = list() + typecache["species"] = loaded + for(var/datum/suit_cycler_choice/species/thing as anything in GLOB.suit_cycler_species) + if(istype(thing, /datum/suit_cycler_choice/species/noop)) + loaded[thing.name] = thing + continue + if(limit_species && !is_type_in_list(thing, limit_species)) + continue + loaded[thing.name] = thing + + return loaded + +/obj/machinery/suit_cycler/proc/load_emagged() + var/list/typecache = GLOB.suit_cycler_typecache[type] + // First of our type + if(!typecache) + typecache = list() + GLOB.suit_cycler_typecache[type] = typecache + var/list/loaded = typecache["emagged"] + // No emagged loaded + if(!loaded) + loaded = list() + typecache["emagged"] = loaded + for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_emagged) + loaded[thing.name] = thing + + return loaded + /obj/machinery/suit_cycler/refit_only name = "Suit cycler" desc = "A dedicated industrial machine that can refit voidsuits for different species, but not change the suit's overall appearance or departmental scheme." model_text = "General Access" req_access = null - departments = list("No Change") + limit_departments = list() /obj/machinery/suit_cycler/engineering name = "Engineering suit cycler" model_text = "Engineering" req_access = list(access_construction) - departments = list("Engineering","Atmospherics","HAZMAT","Construction","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/eng + ) /obj/machinery/suit_cycler/mining name = "Mining suit cycler" model_text = "Mining" req_access = list(access_mining) - departments = list("Mining","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/crg + ) /obj/machinery/suit_cycler/security name = "Security suit cycler" model_text = "Security" req_access = list(access_security) - departments = list("Security","Crowd Control","Security EVA","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/sec + ) /obj/machinery/suit_cycler/medical name = "Medical suit cycler" model_text = "Medical" req_access = list(access_medical) - departments = list("Medical","Biohazard","Emergency Medical Response","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/med + ) /obj/machinery/suit_cycler/syndicate name = "Nonstandard suit cycler" model_text = "Nonstandard" req_access = list(access_syndicate) - departments = list("Mercenary", "Charring","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/emag + ) can_repair = 1 /obj/machinery/suit_cycler/exploration name = "Explorer suit cycler" model_text = "Exploration" - departments = list("Exploration","Expedition Medic","Old Exploration","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/exp + ) /obj/machinery/suit_cycler/pilot name = "Pilot suit cycler" model_text = "Pilot" - departments = list("Pilot Blue","Pilot","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/pil + ) /obj/machinery/suit_cycler/vintage name = "Vintage Crew suit cycler" model_text = "Vintage" - departments = list("Vintage Crew","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/vintage/crew + ) req_access = null /obj/machinery/suit_cycler/vintage/pilot name = "Vintage Pilot suit cycler" model_text = "Vintage Pilot" - departments = list("Vintage Pilot (Bubble Helm)","Vintage Pilot (Closed Helm)","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/vintage/pilot + ) /obj/machinery/suit_cycler/vintage/medsci name = "Vintage MedSci suit cycler" model_text = "Vintage MedSci" - departments = list("Vintage Medical (Bubble Helm)","Vintage Medical (Closed Helm)","Vintage Research (Bubble Helm)","Vintage Research (Closed Helm)","No Change") + limit_departments = list( + /datum/suit_cycler_choice/department/vintage/research, + /datum/suit_cycler_choice/department/vintage/med + ) /obj/machinery/suit_cycler/vintage/rugged name = "Vintage Ruggedized suit cycler" model_text = "Vintage Ruggedized" - departments = list("Vintage Engineering","Vintage Marine","Vintage Officer","Vintage Mercenary","No Change") + + limit_departments = list( + /datum/suit_cycler_choice/department/vintage/eng, + /datum/suit_cycler_choice/department/vintage/marine, + /datum/suit_cycler_choice/department/vintage/officer, + /datum/suit_cycler_choice/department/vintage/merc + ) /obj/machinery/suit_cycler/vintage/omni name = "Vintage Master suit cycler" model_text = "Vintage Master" - departments = list("Vintage Crew","Vintage Engineering","Vintage Pilot (Bubble Helm)","Vintage Pilot (Closed Helm)","Vintage Medical (Bubble Helm)","Vintage Medical (Closed Helm)","Vintage Research (Bubble Helm)","Vintage Research (Closed Helm)","Vintage Marine","Vintage Officer","Vintage Mercenary","No Change") - -/obj/machinery/suit_cycler/vintage/Initialize() - species -= SPECIES_TESHARI - return ..() + limit_departments = list( + /datum/suit_cycler_choice/department/vintage + ) /obj/machinery/suit_cycler/attack_ai(mob/user as mob) return attack_hand(user) @@ -807,8 +880,6 @@ //Clear the access reqs, disable the safeties, and open up all paintjobs. to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.") - departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Crowd Control","Security EVA","Emergency Medical Response","^%###^%$", "Charring","No Change") - species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN) //VORESTATION EDIT emagged = 1 safeties = 0 @@ -842,8 +913,6 @@ /obj/machinery/suit_cycler/tgui_data(mob/user) var/list/data = list() - data["departments"] = departments - data["species"] = species data["model_text"] = model_text data["can_repair"] = can_repair data["userHasAccess"] = allowed(user) @@ -872,6 +941,28 @@ return data +/obj/machinery/suit_cycler/tgui_static_data(mob/user) + var/list/data = list() + + // tgui gets angy if you pass values too + var/list/department_keys = list() + for(var/key in departments) + department_keys += key + + // emagged at the bottom + if(emagged) + for(var/key in emagged_departments) + department_keys += key + + var/list/species_keys = list() + for(var/key in species) + species_keys += key + + data["departments"] = department_keys + data["species"] = species_keys + + return data + /obj/machinery/suit_cycler/tgui_act(action, params) if(..()) return TRUE @@ -890,13 +981,15 @@ if("department") var/choice = params["department"] if(choice in departments) - target_department = choice + target_department = departments[choice] + else if(emagged && (choice in emagged_departments)) + target_department = emagged_departments[choice] . = TRUE if("species") var/choice = params["species"] if(choice in species) - target_species = choice + target_species = species[choice] . = TRUE if("radlevel") @@ -1035,227 +1128,22 @@ return -//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z -//hold onto your hat, this sumbitch just got streamlined -KK +// "Streamlined" before? Ok. -Aro /obj/machinery/suit_cycler/proc/apply_paintjob() - var/obj/item/clothing/head/helmet/parent_helmet - var/obj/item/clothing/suit/space/parent_suit - var/turf/T = get_turf(src) if(!target_species || !target_department) return - //Now "Complete" with most departmental and variant suits, and sorted by department. These aren't available in the standard or emagged cycler lists because they're incomplete for most species. - switch(target_department) - if("No Change") - parent_helmet = helmet - parent_suit = suit - //Engineering and Engineering Variants - if("Engineering") - parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering - parent_suit = /obj/item/clothing/suit/space/void/engineering - if("HAZMAT") - parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering/hazmat - parent_suit = /obj/item/clothing/suit/space/void/engineering/hazmat - if("Construction") - parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering/construction - parent_suit = /obj/item/clothing/suit/space/void/engineering/construction - if("Reinforced") - parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering/alt - parent_suit = /obj/item/clothing/suit/space/void/engineering/alt - if("Salvager") - parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering/salvage - parent_suit = /obj/item/clothing/suit/space/void/engineering/salvage - if("Atmospherics") - parent_helmet = /obj/item/clothing/head/helmet/space/void/atmos - parent_suit = /obj/item/clothing/suit/space/void/atmos - if("Heavy Duty Atmospherics") - parent_helmet = /obj/item/clothing/head/helmet/space/void/atmos/alt - parent_suit = /obj/item/clothing/suit/space/void/atmos/alt - //Mining and Mining Variants - if("Mining") - parent_helmet = /obj/item/clothing/head/helmet/space/void/mining - parent_suit = /obj/item/clothing/suit/space/void/mining - if("Frontier Miner") - parent_helmet = /obj/item/clothing/head/helmet/space/void/mining/alt - parent_suit = /obj/item/clothing/suit/space/void/mining/alt - //Medical and Medical Variants - if("Medical") - parent_helmet = /obj/item/clothing/head/helmet/space/void/medical - parent_suit = /obj/item/clothing/suit/space/void/medical - if("Biohazard") - parent_helmet = /obj/item/clothing/head/helmet/space/void/medical/bio - parent_suit = /obj/item/clothing/suit/space/void/medical/bio - if("Emergency Medical Response") - parent_helmet = /obj/item/clothing/head/helmet/space/void/medical/emt - parent_suit = /obj/item/clothing/suit/space/void/medical/emt - if("Vey-Medical Streamlined") - parent_helmet = /obj/item/clothing/head/helmet/space/void/medical/alt - parent_suit = /obj/item/clothing/suit/space/void/medical/alt - //Security and Security Variants - if("Security") - parent_helmet = /obj/item/clothing/head/helmet/space/void/security - parent_suit = /obj/item/clothing/suit/space/void/security - if("Crowd Control") - parent_helmet = /obj/item/clothing/head/helmet/space/void/security/riot - parent_suit = /obj/item/clothing/suit/space/void/security/riot - if("Security EVA") - parent_helmet = /obj/item/clothing/head/helmet/space/void/security/alt - parent_suit = /obj/item/clothing/suit/space/void/security/alt - //Exploration Department - if("Exploration") - parent_helmet = /obj/item/clothing/head/helmet/space/void/exploration - parent_suit = /obj/item/clothing/suit/space/void/exploration - if("Field Medic") - parent_helmet = /obj/item/clothing/head/helmet/space/void/expedition_medical - parent_suit = /obj/item/clothing/suit/space/void/expedition_medical - if("Old Exploration") - parent_helmet = /obj/item/clothing/head/helmet/space/void/exploration/alt - parent_suit = /obj/item/clothing/suit/space/void/exploration/alt - if("Pilot") - parent_helmet = /obj/item/clothing/head/helmet/space/void/pilot - parent_suit = /obj/item/clothing/suit/space/void/pilot - if("Pilot Blue") - parent_helmet = /obj/item/clothing/head/helmet/space/void/pilot/alt - parent_suit = /obj/item/clothing/suit/space/void/pilot/alt - //Antag Suits - if("^%###^%$" || "Mercenary") - parent_helmet = /obj/item/clothing/head/helmet/space/void/merc - parent_suit = /obj/item/clothing/suit/space/void/merc - if("Charring") - parent_helmet = /obj/item/clothing/head/helmet/space/void/merc/fire - parent_suit = /obj/item/clothing/suit/space/void/merc/fire - if("Gem-Encrusted" || "Wizard") - parent_helmet = /obj/item/clothing/head/helmet/space/void/wizard - parent_suit = /obj/item/clothing/suit/space/void/wizard - //Special or Event suits - if("Vintage Crew") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb - parent_suit = /obj/item/clothing/suit/space/void/refurb - if("Vintage Engineering") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/engineering - parent_suit = /obj/item/clothing/suit/space/void/refurb/engineering - if("Vintage Medical (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/medical/alt - parent_suit = /obj/item/clothing/suit/space/void/refurb/medical - if("Vintage Medical (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/medical - parent_suit = /obj/item/clothing/suit/space/void/refurb/medical - if("Vintage Marine") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/marine - parent_suit = /obj/item/clothing/suit/space/void/refurb/marine - if("Vintage Officer") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/officer - parent_suit = /obj/item/clothing/suit/space/void/refurb/officer - if("Vintage Pilot (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot - parent_suit = /obj/item/clothing/suit/space/void/refurb/pilot - if("Vintage Pilot (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot/alt - parent_suit = /obj/item/clothing/suit/space/void/refurb/pilot - if("Vintage Research (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/research/alt - parent_suit = /obj/item/clothing/suit/space/void/refurb/research - if("Vintage Research (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/research - parent_suit = /obj/item/clothing/suit/space/void/refurb/research - if("Vintage Mercenary") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/mercenary - parent_suit = /obj/item/clothing/suit/space/void/refurb/mercenary - //BEGIN: Space for additional downstream variants - //VOREStation Addition Start - if("Manager") - parent_helmet = /obj/item/clothing/head/helmet/space/void/captain - parent_suit = /obj/item/clothing/suit/space/void/captain - if("Prototype") - parent_helmet = /obj/item/clothing/head/helmet/space/void/security/prototype - parent_suit = /obj/item/clothing/suit/space/void/security/prototype - if("Talon Crew") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/talon - if("Talon Engineering") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/engineering/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/engineering/talon - if("Talon Medical (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/medical/alt/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/medical/talon - if("Talon Medical (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/medical/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/medical/talon - if("Talon Marine") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/marine/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/marine/talon - if("Talon Officer") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/officer/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/officer/talon - if("Talon Pilot (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/pilot/talon - if("Talon Pilot (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot/alt/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/pilot/talon - if("Talon Research (Bubble Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/research/alt/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/research/talon - if("Talon Research (Closed Helm)") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/research/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/research/talon - if("Talon Mercenary") - parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/mercenary/talon - parent_suit = /obj/item/clothing/suit/space/void/refurb/mercenary/talon - //VOREStation Addition End - //END: downstream variant space - if(target_species) - //Only run these checks if they have a sprite sheet defined, otherwise they use human's anyways, and there is almost definitely a sprite. - if((helmet!=null&&(target_species in helmet.sprite_sheets_obj))||(suit!=null&&(target_species in suit.sprite_sheets_obj))) - //Making sure all of our items have the sprites to be refitted. - var/helmet_check = ((helmet!=null && (initial(parent_helmet.icon_state) in icon_states(helmet.sprite_sheets_obj[target_species],1))) || helmet==null) - //If the helmet exists, only return true if there's also sprites for it. If the helmet doesn't exist, return true. - var/suit_check = ((suit!=null && (initial(parent_suit.icon_state) in icon_states(suit.sprite_sheets_obj[target_species],1))) || suit==null) - var/suit_helmet_check = ((suit!=null && suit.helmet!=null && (initial(parent_helmet.icon_state) in icon_states(suit.helmet.sprite_sheets_obj[target_species],1))) || suit==null || suit.helmet==null) - if(helmet_check && suit_check && suit_helmet_check) - if(helmet) - helmet.refit_for_species(target_species) - if(suit) - suit.refit_for_species(target_species) - if(suit.helmet) - suit.helmet.refit_for_species(target_species) - else - //If they don't, alert the user and stop here. - T.visible_message("[bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.") - return - else - if(helmet) - helmet.refit_for_species(target_species) - if(suit) - suit.refit_for_species(target_species) - if(suit.helmet) - suit.helmet.refit_for_species(target_species) - //look at this! isn't it beautiful? -KK (well ok not beautiful but it's a lot cleaner) - if(helmet && target_department != "No Change") - var/obj/item/clothing/H = new parent_helmet - helmet.name = "refitted [initial(parent_helmet.name)]" - helmet.desc = initial(parent_helmet.desc) - helmet.icon_state = initial(parent_helmet.icon_state) - helmet.item_state = initial(parent_helmet.item_state) - helmet.light_overlay = initial(parent_helmet.light_overlay) - helmet.item_state_slots = H.item_state_slots - qdel(H) - - if(suit && target_department != "No Change") - var/obj/item/clothing/S = new parent_suit - suit.name = "refitted [initial(parent_suit.name)]" - suit.desc = initial(parent_suit.desc) - suit.icon_state = initial(parent_suit.icon_state) - suit.item_state = initial(parent_suit.item_state) - suit.item_state_slots = S.item_state_slots - qdel(S) - - //can't believe I forgot to fix this- now helmets will properly cycle if they're attached to a suit -KK - if(suit.helmet && target_department != "No Change") - var/obj/item/clothing/AH = new parent_helmet - suit.helmet.name = "refitted [initial(parent_helmet.name)]" - suit.helmet.desc = initial(parent_helmet.desc) - suit.helmet.icon_state = initial(parent_helmet.icon_state) - suit.helmet.item_state = initial(parent_helmet.item_state) - suit.helmet.light_overlay = initial(parent_helmet.light_overlay) - suit.helmet.item_state_slots = AH.item_state_slots - qdel(AH) + if(suit?.helmet) + visible_message("[bicon(src)]Separate the suit and helmet before applying any customizations.") + return + + if(helmet && target_department.can_refit_helmet(helmet)) + target_department.do_refit_helmet(helmet) + if(suit && target_department.can_refit_suit(suit)) + target_department.do_refit_suit(suit) + + if(target_species.can_refit_to(helmet, suit)) + target_species.do_refit_to(helmet, suit) + else + visible_message("[bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.") + return + \ No newline at end of file diff --git a/code/game/machinery/suit_storage_unit_vr.dm b/code/game/machinery/suit_storage_unit_vr.dm index a28f2971e3..a1be21d709 100644 --- a/code/game/machinery/suit_storage_unit_vr.dm +++ b/code/game/machinery/suit_storage_unit_vr.dm @@ -1,12 +1,19 @@ +<<<<<<< HEAD /obj/machinery/suit_cycler departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Manager","Prototype") species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN, /*yawngreyedit*/SPECIES_GREY_YW) +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +/obj/machinery/suit_cycler + departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Manager","Prototype","No Change") + species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN) + +======= +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport // Old Exploration is too WIP to use right now /obj/machinery/suit_cycler/exploration req_access = null req_one_access = list(access_explorer,access_medical_equip) - departments = list("Exploration","Field Medic","No Change") /obj/machinery/suit_cycler/pilot req_access = list(access_pilot) @@ -15,54 +22,52 @@ name = "Manager suit cycler" model_text = "Manager" req_access = list(access_captain) - departments = list("Manager","No Change") - -/obj/machinery/suit_cycler/captain/Initialize() //No Teshari Sprites - species -= SPECIES_TESHARI - return ..() + departments = list(/datum/suit_cycler_choice/department/captain) /obj/machinery/suit_cycler/prototype name = "Prototype suit cycler" model_text = "Prototype" req_access = list(access_hos) - departments = list("Prototype","No Change") - -/obj/machinery/suit_cycler/prototype/Initialize() //No Teshari Sprites - species -= SPECIES_TESHARI - return ..() + departments = list(/datum/suit_cycler_choice/department/prototype) /obj/machinery/suit_cycler/vintage/tcrew name = "Talon crew suit cycler" model_text = "Talon crew" req_access = list(access_talon) - departments = list("Talon Crew","No Change") + departments = list(/datum/suit_cycler_choice/department/talon/crew) /obj/machinery/suit_cycler/vintage/tpilot name = "Talon pilot suit cycler" model_text = "Talon pilot" req_access = list(access_talon) - departments = list("Talon Pilot (Bubble Helm)","Talon Pilot (Closed Helm)","No Change") + departments = list(/datum/suit_cycler_choice/department/talon/pilot) /obj/machinery/suit_cycler/vintage/tengi name = "Talon engineer suit cycler" model_text = "Talon engineer" req_access = list(access_talon) - departments = list("Talon Engineering","No Change") + departments = list(/datum/suit_cycler_choice/department/talon/eng) /obj/machinery/suit_cycler/vintage/tguard name = "Talon guard suit cycler" model_text = "Talon guard" req_access = list(access_talon) - departments = list("Talon Marine","Talon Mercenary","No Change") + departments = list(/datum/suit_cycler_choice/department/talon/marine) /obj/machinery/suit_cycler/vintage/tmedic name = "Talon doctor suit cycler" model_text = "Talon doctor" req_access = list(access_talon) - departments = list("Talon Medical (Bubble Helm)","Talon Medical (Closed Helm)","No Change") + departments = list(/datum/suit_cycler_choice/department/talon/med) /obj/machinery/suit_cycler/vintage/tcaptain name = "Talon captain suit cycler" model_text = "Talon captain" req_access = list(access_talon) +<<<<<<< HEAD departments = list("Talon Officer","No Change") +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport + departments = list("Talon Officer","No Change") +======= + departments = list(/datum/suit_cycler_choice/department/talon/officer) +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index d4e9af673d..89768af864 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -318,7 +318,7 @@ /obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user) user.setClickCooldown(user.get_attack_speed(W)) - if(W.attack_verb.len) + if(LAZYLEN(W.attack_verb)) visible_message("\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") else visible_message("\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") @@ -421,4 +421,260 @@ visible_message("[src.target] begins to crumble under the acid!") spawn(rand(150, 200)) tick() +<<<<<<< HEAD //CHOMPedit old eggs removed +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +/* + * Egg + */ +/var/const //for the status var + BURST = 0 + BURSTING = 1 + GROWING = 2 + GROWN = 3 + + MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger + MAX_GROWTH_TIME = 3000 + +/obj/effect/alien/egg + desc = "It looks like a weird egg" + name = "egg" +// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not. + icon_state = "egg" + density = 0 + anchored = 1 + + var/health = 100 + var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive + +/obj/effect/alien/egg/New() +/* + if(config.aliens_allowed) + ..() + spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) + Grow() + else + qdel(src) +*/ +/obj/effect/alien/egg/attack_hand(user as mob) + + var/mob/living/carbon/M = user + if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) + return attack_hand(user) + + switch(status) + if(BURST) + to_chat(user, "You clear the hatched egg.") + qdel(src) + return +/* if(GROWING) + to_chat(user, "The child is not developed yet.") + return + if(GROWN) + to_chat(user, "You retrieve the child.") + Burst(0) + return + +/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit. + return locate(/obj/item/clothing/mask/facehugger) in contents + +/obj/effect/alien/egg/proc/Grow() + icon_state = "egg" +// status = GROWN + status = BURST +// new /obj/item/clothing/mask/facehugger(src) + return +*/ +/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining + if(status == GROWN || status == GROWING) +// var/obj/item/clothing/mask/facehugger/child = GetFacehugger() + icon_state = "egg_hatched" +/* flick("egg_opening", src) + status = BURSTING + spawn(15) + status = BURST + child.loc = get_turf(src) + + if(kill && istype(child)) + child.Die() + else + for(var/mob/M in range(1,src)) + if(CanHug(M)) + child.Attach(M) + break +*/ +/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/egg/take_damage(var/damage) + health -= damage + healthcheck() + return + + +/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) + if(health <= 0) + return + if(W.attack_verb.len) + src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + else + src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = W.force / 4.0 + + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + + if(WT.remove_fuel(0, user)) + damage = 15 + playsound(src, 'sound/items/Welder.ogg', 100, 1) + + src.health -= damage + src.healthcheck() + + +/obj/effect/alien/egg/proc/healthcheck() + if(health <= 0) + Burst() + +/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 500 + T0C) + health -= 5 + healthcheck() +======= +/* + * Egg + */ +/var/const //for the status var + BURST = 0 + BURSTING = 1 + GROWING = 2 + GROWN = 3 + + MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger + MAX_GROWTH_TIME = 3000 + +/obj/effect/alien/egg + desc = "It looks like a weird egg" + name = "egg" +// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not. + icon_state = "egg" + density = 0 + anchored = 1 + + var/health = 100 + var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive + +/obj/effect/alien/egg/New() +/* + if(config.aliens_allowed) + ..() + spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) + Grow() + else + qdel(src) +*/ +/obj/effect/alien/egg/attack_hand(user as mob) + + var/mob/living/carbon/M = user + if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) + return attack_hand(user) + + switch(status) + if(BURST) + to_chat(user, "You clear the hatched egg.") + qdel(src) + return +/* if(GROWING) + to_chat(user, "The child is not developed yet.") + return + if(GROWN) + to_chat(user, "You retrieve the child.") + Burst(0) + return + +/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit. + return locate(/obj/item/clothing/mask/facehugger) in contents + +/obj/effect/alien/egg/proc/Grow() + icon_state = "egg" +// status = GROWN + status = BURST +// new /obj/item/clothing/mask/facehugger(src) + return +*/ +/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining + if(status == GROWN || status == GROWING) +// var/obj/item/clothing/mask/facehugger/child = GetFacehugger() + icon_state = "egg_hatched" +/* flick("egg_opening", src) + status = BURSTING + spawn(15) + status = BURST + child.loc = get_turf(src) + + if(kill && istype(child)) + child.Die() + else + for(var/mob/M in range(1,src)) + if(CanHug(M)) + child.Attach(M) + break +*/ +/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/egg/take_damage(var/damage) + health -= damage + healthcheck() + return + + +/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) + if(health <= 0) + return + if(LAZYLEN(W.attack_verb)) + src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + else + src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = W.force / 4.0 + + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + + if(WT.remove_fuel(0, user)) + damage = 15 + playsound(src, 'sound/items/Welder.ogg', 100, 1) + + src.health -= damage + src.healthcheck() + + +/obj/effect/alien/egg/proc/healthcheck() + if(health <= 0) + Burst() + +/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 500 + T0C) + health -= 5 + healthcheck() +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index d6b21ef674..6e3f224625 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -23,7 +23,7 @@ /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) user.setClickCooldown(user.get_attack_speed(W)) - if(W.attack_verb.len) + if(LAZYLEN(W.attack_verb)) visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") else visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 47444f69e5..19e261bf1e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -21,7 +21,7 @@ // causeerrorheresoifixthis var/obj/item/master = null var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants. - var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" + var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/force = 0 var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm @@ -50,8 +50,8 @@ var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N - var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - var/list/armorsoak = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + var/list/armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + var/list/armorsoak = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/zoomdevicename = null //name used for message when binoculars/scope is used @@ -63,12 +63,12 @@ //** These specify item/icon overrides for _slots_ - var/list/item_state_slots = list() //overrides the default item_state for particular slots. + var/list/item_state_slots //overrides the default item_state for particular slots. // Used to specify the icon file to be used when the item is worn. If not set the default icon for that slot will be used. // If icon_override or sprite_sheets are set they will take precendence over this, assuming they apply to the slot in question. // Only slot_l_hand/slot_r_hand are implemented at the moment. Others to be implemented as needed. - var/list/item_icons = list() + var/list/item_icons //** These specify item/icon overrides for _species_ @@ -79,11 +79,11 @@ ) If index term exists and icon_override is not set, this sprite sheet will be used. */ - var/list/sprite_sheets = list() + var/list/sprite_sheets // Species-specific sprite sheets for inventory sprites // Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called. - var/list/sprite_sheets_obj = list() + var/list/sprite_sheets_obj var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast. var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed(). diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index ce4e3377a9..59259dc7d4 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -23,7 +23,7 @@ /obj/item/device/radio/headset sprite_sheets = list(SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi', - SPECIES_WEREBEAST = 'icons/inventory/ears/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/ears/mob_vr_werebeast.dmi') /obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. name = "nonhuman radio receiver" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index ad016d0d85..325980756f 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -70,7 +70,6 @@ w_class = ITEMSIZE_LARGE max_w_class = ITEMSIZE_NORMAL max_storage_space = ITEMSIZE_COST_NORMAL * 100 // can store a ton of shit! - item_state_slots = null /obj/item/weapon/storage/backpack/cultpack name = "trophy rack" diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index c98b1dcfc9..c84272a603 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -78,7 +78,7 @@ /obj/item/weapon/storage/backpack sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/back/mob_teshari.dmi', - SPECIES_WEREBEAST = 'icons/inventory/back/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/back/mob_vr_werebeast.dmi') /obj/item/weapon/storage/backpack/ert max_storage_space = INVENTORY_DUFFLEBAG_SPACE diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm index 92da577c31..ba86f3f2f9 100644 --- a/code/game/objects/items/weapons/storage/belt_vr.dm +++ b/code/game/objects/items/weapons/storage/belt_vr.dm @@ -1,7 +1,7 @@ /obj/item/weapon/storage/belt sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/belt/mob_teshari.dmi', - SPECIES_WEREBEAST = 'icons/inventory/belt/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/belt/mob_vr_werebeast.dmi') /obj/item/weapon/storage/belt/explorer name = "explorer's belt" diff --git a/code/game/objects/mob_spawner_vr.dm b/code/game/objects/mob_spawner_vr.dm index a3f01c5371..1b17bda2e2 100644 --- a/code/game/objects/mob_spawner_vr.dm +++ b/code/game/objects/mob_spawner_vr.dm @@ -76,7 +76,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) - visible_message("\The [src] has been [I.attack_verb.len ? "[pick(I.attack_verb)]":"attacked"] with \the [I] by [user].") + visible_message("\The [src] has been [LAZYLEN(I.attack_verb) ? "[pick(I.attack_verb)]":"attacked"] with \the [I] by [user].") take_damage(I.force) /obj/structure/mob_spawner/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 08c594153d..c0cde563a8 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -13,10 +13,9 @@ body_parts_covered = copy.body_parts_covered flags_inv = copy.flags_inv - item_icons = copy.item_icons.Copy() - if(copy.item_state_slots) //Runtime prevention for backpacks - item_state_slots = copy.item_state_slots.Copy() - sprite_sheets = copy.sprite_sheets.Copy() + item_icons = copy.item_icons?.Copy() + item_state_slots = copy.item_state_slots?.Copy() + sprite_sheets = copy.sprite_sheets?.Copy() //copying sprite_sheets_obj should be unnecessary as chameleon items are not refittable. return copy //for inheritance @@ -54,7 +53,7 @@ name = "psychedelic" desc = "Groovy!" icon_state = "psyche" - item_state_slots[slot_w_uniform_str] = "psyche" + LAZYSET(item_state_slots, slot_w_uniform_str, "psyche") update_icon() update_clothing_icon() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 13816406cf..78f12f3e80 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -1057,3 +1058,2122 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + sprite_sheets[target_species] = sprite_sheets_refit[target_species] + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + sprite_sheets[target_species] = sprite_sheets_refit[target_species] + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && sprite_sheets[body_type] ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets,body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !istaurtail(H.tail_style)) || (!taurized && istaurtail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(istaurtail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + if(!item_state_slots) + item_state_slots = list() + item_state_slots[slot_w_uniform_str] = worn_state + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(item_icons && item_icons[slot_w_uniform_str]) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)]) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(item_icons && item_icons[slot_w_uniform_str]) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + item_state_slots[slot_w_uniform_str] = worn_state + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_d" + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + item_state_slots[slot_w_uniform_str] = worn_state + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + item_state_slots[slot_w_uniform_str] = worn_state + else + item_state_slots[slot_w_uniform_str] = "[worn_state]_r" + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + item_state_slots[slot_w_uniform_str] = worn_state + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +======= +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !istaurtail(H.tail_style)) || (!taurized && istaurtail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(istaurtail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/modules/clothing/clothing_icons.dm b/code/modules/clothing/clothing_icons.dm index c28d60a9ff..6560045a1f 100644 --- a/code/modules/clothing/clothing_icons.dm +++ b/code/modules/clothing/clothing_icons.dm @@ -14,7 +14,7 @@ /obj/item/clothing/head/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask = null) var/image/standing = ..() if(light_on && slot_name == slot_head_str) - var/cache_key = "[light_overlay][LAZYACCESS(sprite_sheets,body_type) ? "_[body_type]" : ""]" + var/cache_key = "[light_overlay][LAZYACCESS(sprite_sheets, body_type) ? "_[body_type]" : ""]" if(standing && light_overlay_cache[cache_key]) standing.add_overlay(light_overlay_cache[cache_key]) return standing diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index a33461a7e4..5f662ca628 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -7,7 +7,7 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/feet/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/feet/mob_vr_werebeast.dmi') /obj/item/clothing/shoes/New() inside_emotes = list( @@ -87,12 +87,12 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/hands/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/hands/mob_vr_werebeast.dmi') /obj/item/clothing/ears sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi', - SPECIES_WEREBEAST = 'icons/inventory/ears/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/ears/mob_vr_werebeast.dmi') /obj/item/clothing/relaymove(var/mob/living/user,var/direction) @@ -135,14 +135,14 @@ SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi', - SPECIES_SERGAL = 'icons/inventory/face/mob_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/face/mob_nevrean.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/face/mob_fox.dmi', - SPECIES_ZORREN_FLAT = 'icons/inventory/face/mob_fennec.dmi', - SPECIES_AKULA = 'icons/inventory/face/mob_akula.dmi', - SPECIES_VULPKANIN = 'icons/inventory/face/mob_vulpkanin.dmi', - SPECIES_XENOCHIMERA = 'icons/inventory/face/mob_tajaran.dmi', - SPECIES_WEREBEAST = 'icons/inventory/face/mob_werebeast.dmi' + SPECIES_SERGAL = 'icons/inventory/face/mob_vr_sergal.dmi', + SPECIES_NEVREAN = 'icons/inventory/face/mob_vr_nevrean.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/face/mob_vr_fox.dmi', + SPECIES_ZORREN_FLAT = 'icons/inventory/face/mob_vr_fennec.dmi', + SPECIES_AKULA = 'icons/inventory/face/mob_vr_akula.dmi', + SPECIES_VULPKANIN = 'icons/inventory/face/mob_vr_vulpkanin.dmi', + SPECIES_XENOCHIMERA = 'icons/inventory/face/mob_vr_tajaran.dmi', + SPECIES_WEREBEAST = 'icons/inventory/face/mob_vr_werebeast.dmi' ) //"Spider" = 'icons/inventory/mask/mob_spider.dmi' Add this later when they have custom mask sprites and everything. @@ -151,7 +151,7 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/suit/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/suit/mob_vr_werebeast.dmi') /obj/item/clothing/under sensor_mode = 3 @@ -159,7 +159,7 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/uniform/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/uniform/mob_vr_werebeast.dmi') /obj/item/clothing/under/New(var/mob/living/carbon/human/H) ..() @@ -178,4 +178,4 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/head/mob_werebeast.dmi') + SPECIES_WEREBEAST = 'icons/inventory/head/mob_vr_werebeast.dmi') diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index d096eb5883..1d3759fae9 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -182,7 +182,7 @@ icon_state = "kitty" body_parts_covered = 0 siemens_coefficient = 1.5 - item_icons = list() + item_icons = null /obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user) if(!istype(user)) return diff --git a/code/modules/clothing/masks/breath_vr.dm b/code/modules/clothing/masks/breath_vr.dm index 9f6016d948..47c5fdb64b 100644 --- a/code/modules/clothing/masks/breath_vr.dm +++ b/code/modules/clothing/masks/breath_vr.dm @@ -1,4 +1,4 @@ /obj/item/clothing/mask/breath/transparent name = "transparent breath mask" item_state = "golem" //This is dumb and hacky but was here when I got here. - sprite_sheets = list() + sprite_sheets = null diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 5cfe6a9290..18427873ab 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -283,8 +283,8 @@ booting_R.icon_state = "boot_load" animate(booting_L, alpha=230, time=30, easing=SINE_EASING) animate(booting_R, alpha=200, time=20, easing=SINE_EASING) - M.client.screen += booting_L - M.client.screen += booting_R + M.client?.screen += booting_L + M.client?.screen += booting_R canremove = 0 // No removing the suit while unsealing. sealing = 1 @@ -360,8 +360,8 @@ sealing = null if(failed_to_seal) - M.client.screen -= booting_L - M.client.screen -= booting_R + M.client?.screen -= booting_L + M.client?.screen -= booting_R qdel(booting_L) qdel(booting_R) for(var/obj/item/piece in list(helmet,boots,gloves,chest)) @@ -382,11 +382,11 @@ minihud = new (M.hud_used, src) to_chat(M, "Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"].") playsound(src, 'sound/machines/rig/rigstarted.ogg', 10, FALSE) - M.client.screen -= booting_L + M.client?.screen -= booting_L qdel(booting_L) booting_R.icon_state = "boot_done" spawn(40) - M.client.screen -= booting_R + M.client?.screen -= booting_R qdel(booting_R) if(canremove) @@ -596,8 +596,8 @@ var/species_icon = default_mob_icon // Since setting mob_icon will override the species checks in // update_inv_wear_suit(), handle species checks here. - if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype(wearer)]) - species_icon = sprite_sheets[wearer.species.get_bodytype(wearer)] + if(wearer && LAZYACCESS(sprite_sheets, wearer.species.get_bodytype(wearer))) + species_icon = sprite_sheets[wearer.species.get_bodytype(wearer)] mob_icon = icon(icon = species_icon, icon_state = "[icon_state]") if(installed_modules.len) diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index 8d3a7df868..b6c60d88aa 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -4,12 +4,12 @@ SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi', SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi', SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/head/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/head/mob_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/head/mob_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/head/mob_vulpkanin.dmi', + SPECIES_AKULA = 'icons/inventory/head/mob_vr_akula.dmi', + SPECIES_SERGAL = 'icons/inventory/head/mob_vr_sergal.dmi', + SPECIES_NEVREAN = 'icons/inventory/head/mob_vr_sergal.dmi', + SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi', SPECIES_PROMETHEAN = 'icons/inventory/head/mob_skrell.dmi', SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi', SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi' @@ -21,12 +21,12 @@ SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi', SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi', SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/mob_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/suit/mob_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/mob_vulpkanin.dmi', + SPECIES_AKULA = 'icons/inventory/suit/mob_vr_akula.dmi', + SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi', + SPECIES_NEVREAN = 'icons/inventory/suit/mob_vr_sergal.dmi', + SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', + SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', SPECIES_PROMETHEAN = 'icons/inventory/suit/mob_skrell.dmi', SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi', SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi' diff --git a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm index e0d14f189a..f1ccca2748 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm @@ -53,6 +53,8 @@ /obj/item/weapon/rig/robotics allowed = list(/obj/item/device/flashlight, /obj/item/weapon/storage/box, /obj/item/weapon/storage/belt, /obj/item/device/defib_kit/compact) +<<<<<<< HEAD +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport // 'Technomancer' hardsuit /obj/item/weapon/rig/focalpoint @@ -178,3 +180,487 @@ // No animal people sprites for these yet, sad times species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) sprite_sheets = list() + +// 'Technomancer' hardsuit +/obj/item/weapon/rig/focalpoint + name = "\improper F.P.E. hardsuit control module" + desc = "A high-end hardsuit produced by Focal Point Energistics, focused around repair and construction." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "techno_rig" + suit_type = "\improper F.P.E. hardsuit" + cell_type = /obj/item/weapon/cell/hyper + + // Copied from CE rig + slowdown = 0 + offline_slowdown = 0 + offline_vision_restriction = 0 + rigsuit_max_pressure = 20 * ONE_ATMOSPHERE // Max pressure the rig protects against when sealed + rigsuit_min_pressure = 0 // Min pressure the rig protects against when sealed + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE // so it's like a rig firesuit + armor = list("melee" = 40, "bullet" = 10, "laser" = 30, "energy" = 55, "bomb" = 70, "bio" = 100, "rad" = 100) + + chest_type = /obj/item/clothing/suit/space/rig/focalpoint + helm_type = /obj/item/clothing/head/helmet/space/rig/focalpoint + boot_type = /obj/item/clothing/shoes/magboots/rig/focalpoint + glove_type = /obj/item/clothing/gloves/gauntlets/rig/focalpoint + +/obj/item/weapon/rig/focalpoint/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/teleporter, // Try not to set yourself on fire + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/grenade_launcher/metalfoam + ) + +/obj/item/clothing/head/helmet/space/rig/focalpoint + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/rig/focalpoint + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/shoes/magboots/rig/focalpoint + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/gloves/gauntlets/rig/focalpoint + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "techno_rig" + siemens_coefficient = 0 + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Ironhammer' hardsuit +/obj/item/weapon/rig/hephaestus + name = "\improper Hephaestus hardsuit control module" + desc = "A high-end hardsuit produced by Hephaestus Industries, focused on destroying the competition. Literally." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "ihs_rig" + suit_type = "\improper Hephaestus hardsuit" + cell_type = /obj/item/weapon/cell/super + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 60, "bio" = 100, "rad" = 20) + + chest_type = /obj/item/clothing/suit/space/rig/hephaestus + helm_type = /obj/item/clothing/head/helmet/space/rig/hephaestus + boot_type = /obj/item/clothing/shoes/magboots/rig/hephaestus + glove_type = /obj/item/clothing/gloves/gauntlets/rig/hephaestus + +/obj/item/weapon/rig/hephaestus/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/mounted/egun, + /obj/item/rig_module/mounted/energy_blade + ) + +/obj/item/clothing/head/helmet/space/rig/hephaestus + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/rig/hephaestus + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/shoes/magboots/rig/hephaestus + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/gloves/gauntlets/rig/hephaestus + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() +======= + +// 'Technomancer' hardsuit +/obj/item/weapon/rig/focalpoint + name = "\improper F.P.E. hardsuit control module" + desc = "A high-end hardsuit produced by Focal Point Energistics, focused around repair and construction." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "techno_rig" + suit_type = "\improper F.P.E. hardsuit" + cell_type = /obj/item/weapon/cell/hyper + + // Copied from CE rig + slowdown = 0 + offline_slowdown = 0 + offline_vision_restriction = 0 + rigsuit_max_pressure = 20 * ONE_ATMOSPHERE // Max pressure the rig protects against when sealed + rigsuit_min_pressure = 0 // Min pressure the rig protects against when sealed + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE // so it's like a rig firesuit + armor = list("melee" = 40, "bullet" = 10, "laser" = 30, "energy" = 55, "bomb" = 70, "bio" = 100, "rad" = 100) + + chest_type = /obj/item/clothing/suit/space/rig/focalpoint + helm_type = /obj/item/clothing/head/helmet/space/rig/focalpoint + boot_type = /obj/item/clothing/shoes/magboots/rig/focalpoint + glove_type = /obj/item/clothing/gloves/gauntlets/rig/focalpoint + +/obj/item/weapon/rig/focalpoint/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/teleporter, // Try not to set yourself on fire + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/grenade_launcher/metalfoam + ) + +/obj/item/clothing/head/helmet/space/rig/focalpoint + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/suit/space/rig/focalpoint + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/shoes/magboots/rig/focalpoint + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "techno_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/gloves/gauntlets/rig/focalpoint + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "techno_rig" + siemens_coefficient = 0 + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +// 'Ironhammer' hardsuit +/obj/item/weapon/rig/hephaestus + name = "\improper Hephaestus hardsuit control module" + desc = "A high-end hardsuit produced by Hephaestus Industries, focused on destroying the competition. Literally." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "ihs_rig" + suit_type = "\improper Hephaestus hardsuit" + cell_type = /obj/item/weapon/cell/super + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 60, "bio" = 100, "rad" = 20) + + chest_type = /obj/item/clothing/suit/space/rig/hephaestus + helm_type = /obj/item/clothing/head/helmet/space/rig/hephaestus + boot_type = /obj/item/clothing/shoes/magboots/rig/hephaestus + glove_type = /obj/item/clothing/gloves/gauntlets/rig/hephaestus + +/obj/item/weapon/rig/hephaestus/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher, + /obj/item/rig_module/mounted/egun, + /obj/item/rig_module/mounted/energy_blade + ) + +/obj/item/clothing/head/helmet/space/rig/hephaestus + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/suit/space/rig/hephaestus + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/shoes/magboots/rig/hephaestus + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/gloves/gauntlets/rig/hephaestus + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "ihs_rig" + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +// 'Zero' rig +/obj/item/weapon/rig/zero + name = "null hardsuit control module" + desc = "A very lightweight suit designed to allow use inside mechs and starfighters. It feels like you're wearing nothing at all." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "null_rig" + suit_type = "null hardsuit" + cell_type = /obj/item/weapon/cell/high + + chest_type = /obj/item/clothing/suit/space/rig/zero + helm_type = /obj/item/clothing/head/helmet/space/rig/zero + boot_type = null + glove_type = null + + slowdown = 0 + offline_slowdown = 1 + offline_vision_restriction = 2 + armor = list("melee" = 20, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 35, "bio" = 100, "rad" = 20) + +/obj/item/weapon/rig/zero/equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets + ) + +/obj/item/clothing/head/helmet/space/rig/zero + desc = "A bubble helmet that maximizes the field of view. A state of the art holographic display provides a stream of information." + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "null_rig" + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + slowdown = 0 + +/obj/item/clothing/suit/space/rig/zero + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "null_rig" + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS // like a voidsuit + slowdown = 0 + +// Medical rig from bay +/obj/item/weapon/rig/baymed + name = "\improper Commonwealth medical hardsuit control module" + desc = "A lightweight first responder hardsuit from the Commonwealth. Not suitable for combat use, but advanced myomer fibers can push the user to incredible speeds." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "medical_rig_bay" + item_state = null + suit_type = "medical hardsuit" + cell_type = /obj/item/weapon/cell/high + + chest_type = /obj/item/clothing/suit/space/rig/baymed + helm_type = /obj/item/clothing/head/helmet/space/rig/baymed + boot_type = /obj/item/clothing/shoes/magboots/rig/baymed + glove_type = /obj/item/clothing/gloves/gauntlets/rig/baymed + + // speedy paper + slowdown = -0.5 + armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 25, "bio" = 100, "rad" = 20) + +/obj/item/weapon/rig/baymed/equipped + req_access = list(access_medical) + + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/sprinter, + /obj/item/rig_module/pat_module, + /obj/item/rig_module/rescue_pharm + ) + +/obj/item/clothing/head/helmet/space/rig/baymed + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "medical_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +/obj/item/clothing/suit/space/rig/baymed + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "medical_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + +/obj/item/clothing/shoes/magboots/rig/baymed + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "medical_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null + +/obj/item/clothing/gloves/gauntlets/rig/baymed + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "medical_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null + +// Engineering/'Industrial' rig from bay +/obj/item/weapon/rig/bayeng + name = "\improper Commonwealth engineering hardsuit control module" + desc = "An advanced construction hardsuit from the Commonwealth. Built like a tank. Don't expect to be taking any tight corners while running." + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "engineering_rig_bay" + item_state = null + suit_type = "engineering hardsuit" + cell_type = /obj/item/weapon/cell/super + + chest_type = /obj/item/clothing/suit/space/rig/bayeng + helm_type = /obj/item/clothing/head/helmet/space/rig/bayeng + boot_type = /obj/item/clothing/shoes/magboots/rig/bayeng + glove_type = /obj/item/clothing/gloves/gauntlets/rig/bayeng + + slowdown = 1 + offline_slowdown = 5 // very bulky + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 50) + +/obj/item/weapon/rig/bayeng//equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/device/rcd, + /obj/item/rig_module/grenade_launcher/metalfoam, + /obj/item/rig_module/vision/meson, + /obj/item/rig_module/ai_container + ) + +/obj/item/clothing/head/helmet/space/rig/bayeng + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "engineering_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +/obj/item/clothing/suit/space/rig/bayeng + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "engineering_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + +/obj/item/clothing/shoes/magboots/rig/bayeng + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "engineering_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null + +/obj/item/clothing/gloves/gauntlets/rig/bayeng + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "engineering_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null + siemens_coefficient = 0 // insulated + +// Pathfinder rig from bay - event/reward stuff here +/obj/item/weapon/rig/pathfinder + name = "\improper Commonwealth pathfinder hardsuit control module" + desc = "A Commonwealth pathfinder hardsuit is hard to come by... how'd this end up on the frontier?" + + icon = 'icons/obj/rig_modules_vr.dmi' // the item + default_mob_icon = 'icons/mob/rig_back_vr.dmi' // the onmob + icon_state = "pathfinder_rig_bay" + item_state = null + suit_type = "pathfinder hardsuit" + cell_type = /obj/item/weapon/cell/super + + chest_type = /obj/item/clothing/suit/space/rig/pathfinder + helm_type = /obj/item/clothing/head/helmet/space/rig/pathfinder + boot_type = /obj/item/clothing/shoes/magboots/rig/pathfinder + glove_type = /obj/item/clothing/gloves/gauntlets/rig/pathfinder + + slowdown = 0.5 + offline_slowdown = 4 // bulky + offline_vision_restriction = 2 // doesn't even have a way to see out without power + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 50) + +/obj/item/weapon/rig/pathfinder//equipped + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/teleporter, + /obj/item/rig_module/stealth_field, + /obj/item/rig_module/mounted/energy_blade + ) + +/obj/item/clothing/head/helmet/space/rig/pathfinder + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "pathfinder_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +/obj/item/clothing/suit/space/rig/pathfinder + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "pathfinder_rig_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + +/obj/item/clothing/shoes/magboots/rig/pathfinder + icon = 'icons/inventory/feet/item_vr.dmi' + default_worn_icon = 'icons/inventory/feet/mob_vr.dmi' + icon_state = "pathfinder_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null + +/obj/item/clothing/gloves/gauntlets/rig/pathfinder + icon = 'icons/inventory/hands/item_vr.dmi' + default_worn_icon = 'icons/inventory/hands/mob_vr.dmi' + icon_state = "pathfinder_rig_bay" + item_state = null + sprite_sheets = null + sprite_sheets_obj = null +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 659cf74847..5030bcfe01 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -37,7 +37,7 @@ verbs |= /obj/item/clothing/head/helmet/space/proc/toggle_camera if(type == /obj/item/clothing/head/helmet/space) //VOREStation edit - use the specially refitted sprites by KBraid. Done this way to avoid breaking subtypes. - sprite_sheets[SPECIES_TESHARI] = 'icons/inventory/head/mob_vr_teshari.dmi' + LAZYSET(sprite_sheets, SPECIES_TESHARI, 'icons/inventory/head/mob_vr_teshari.dmi') /obj/item/clothing/head/helmet/space/proc/toggle_camera() set name = "Toggle Helmet Camera" @@ -94,7 +94,7 @@ /obj/item/clothing/suit/space/Initialize() . = ..() if(type == /obj/item/clothing/suit/space) - sprite_sheets[SPECIES_TESHARI] = 'icons/inventory/suit/mob_vr_teshari.dmi' // aAAAaaAAAAA + LAZYSET(sprite_sheets, SPECIES_TESHARI, 'icons/inventory/suit/mob_vr_teshari.dmi') //VOREStation edit end. /obj/item/clothing/suit/space/equipped(mob/M) diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 5ef86ce2e1..6dd1c3b7d4 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -173,8 +173,8 @@ SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi', SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi', SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/mob_sergal.dmi', + SPECIES_AKULA = 'icons/inventory/suit/mob_vr_akula.dmi', + SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi', SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', @@ -215,7 +215,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi', SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi', SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi', - SPECIES_SHADEKIN_CREW = 'icons/inventory/head/mob_vulpkanin.dmi', + SPECIES_SHADEKIN_CREW = 'icons/inventory/head/mob_vr_vulpkanin.dmi', SPECIES_VASILISSAN = 'icons/inventory/head/mob_vr.dmi', SPECIES_NEVREAN = 'icons/inventory/head/mob_vr.dmi', SPECIES_RAPALA = 'icons/inventory/head/mob_vr.dmi', diff --git a/code/modules/clothing/spacesuits/void/event_vr.dm b/code/modules/clothing/spacesuits/void/event_vr.dm index 6d947ce245..f5db3f9ce0 100644 --- a/code/modules/clothing/spacesuits/void/event_vr.dm +++ b/code/modules/clothing/spacesuits/void/event_vr.dm @@ -73,6 +73,7 @@ /obj/item/clothing/suit/space/void/refurb/mercenary/talon name = "talon mercenary's voidsuit" +<<<<<<< HEAD desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate." // HEV Suits @@ -231,3 +232,323 @@ // No animal people sprites for these yet, sad times species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) sprite_sheets = list() + +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate." + +// HEV Suits +/obj/item/clothing/suit/space/void/hev + name = "hazardous environment suit" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/suit/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +/obj/item/clothing/head/helmet/space/void/hev + name = "hazardous environment helmet" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +// Makeshift void suit +/obj/item/clothing/suit/space/void/makeshift + name = "makeshift voidsuit" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/makeshift + name = "makeshift voidsuit helmet" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Custodian' armor +/obj/item/clothing/suit/space/void/custodian + name = "custodian suit" + desc = "Vacuum-capable armor for a Custodian to do their duty." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/custodian + name = "custodian helmet" + desc = "Vacuum-capable helmet for a Custodian to do their duty." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +// 'Moebius' armor +/obj/item/clothing/suit/space/void/aether + name = "\improper Aether voidsuit" + desc = "This suit seems rather high-end for a standard voidsuit. The air in it has a hint of 'new car smell', courtesy of Aether Atmospherics." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "moebiussuit" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/aether + name = "\improper Aether voidsuit helmet" + desc = "Aether Atmospherics thought that giving this helmet selectable colored lighting would improve market penetration. Very comfortable, regardless." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "moebiushelm_White" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/aether/verb/select_color() + set name = "Helmet Color" + set desc = "Change the color of [src]" + set category = "Object" + + var/choice = tgui_input_list(usr, "Select a new color:", "[src] Color", list("White", "Blue", "Purple", "Yellow", "Red", "Green")) + if(!choice) + return + icon_state = "moebiushelm_[choice]" + update_clothing_icon() + to_chat(usr, "[src] color changed to: [choice]") + +// Excelsior suit +/obj/item/clothing/suit/space/void/excelsior + name = "\improper Excelsior voidsuit" + desc = "A space suit from a particular spaceship: Excelsior." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() + +/obj/item/clothing/head/helmet/space/void/excelsior + name = "\improper Excelsior voidsuit helmet" + desc = "A space helmet from a particular spaceship: Excelsior." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = list() +======= + desc = "A refurbished early contact era voidsuit of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. Many old-timer mercs swear by these old things, even if new powered hardsuits have more features and better armor. The red markings indicate this as the mercenary variant. \"ITV TALON\" has been stamped onto each pauldron and the right side of the breastplate." + +// HEV Suits +/obj/item/clothing/suit/space/void/hev + name = "hazardous environment suit" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/suit/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +/obj/item/clothing/head/helmet/space/void/hev + name = "hazardous environment helmet" + desc = "Has a strange smell to it, but you feel like it might be an old friend." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "hev_orange" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/hev/violet + icon_state = "hev_violet" + desc = "Has a strange smell to it, but you feel like it might be an old friend. This one has 'Dr. Coomer' engraved on the collar." + +// Makeshift void suit +/obj/item/clothing/suit/space/void/makeshift + name = "makeshift voidsuit" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/makeshift + name = "makeshift voidsuit helmet" + desc = "This is not something you should use if you have other options, but it's better than nothing!" + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "makeshift_void" + + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +// 'Custodian' armor +/obj/item/clothing/suit/space/void/custodian + name = "custodian suit" + desc = "Vacuum-capable armor for a Custodian to do their duty." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/custodian + name = "custodian helmet" + desc = "Vacuum-capable helmet for a Custodian to do their duty." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "custodian" + + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 50, "bomb" = 40, "bio" = 0, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +// 'Moebius' armor +/obj/item/clothing/suit/space/void/aether + name = "\improper Aether voidsuit" + desc = "This suit seems rather high-end for a standard voidsuit. The air in it has a hint of 'new car smell', courtesy of Aether Atmospherics." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "moebiussuit" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/aether + name = "\improper Aether voidsuit helmet" + desc = "Aether Atmospherics thought that giving this helmet selectable colored lighting would improve market penetration. Very comfortable, regardless." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "moebiushelm_White" + + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 20) + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/aether/verb/select_color() + set name = "Helmet Color" + set desc = "Change the color of [src]" + set category = "Object" + + var/choice = tgui_input_list(usr, "Select a new color:", "[src] Color", list("White", "Blue", "Purple", "Yellow", "Red", "Green")) + if(!choice) + return + icon_state = "moebiushelm_[choice]" + update_clothing_icon() + to_chat(usr, "[src] color changed to: [choice]") + +// Excelsior suit +/obj/item/clothing/suit/space/void/excelsior + name = "\improper Excelsior voidsuit" + desc = "A space suit from a particular spaceship: Excelsior." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null + +/obj/item/clothing/head/helmet/space/void/excelsior + name = "\improper Excelsior voidsuit helmet" + desc = "A space helmet from a particular spaceship: Excelsior." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "excelsior" + + // No animal people sprites for these yet, sad times + species_restricted = list("exclude", SPECIES_TESHARI, SPECIES_VOX, SPECIES_DIONA) + sprite_sheets = null +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/modules/clothing/spacesuits/void/station_vr.dm b/code/modules/clothing/spacesuits/void/station_vr.dm index 0c35f5a62b..dfd4c2babf 100644 --- a/code/modules/clothing/spacesuits/void/station_vr.dm +++ b/code/modules/clothing/spacesuits/void/station_vr.dm @@ -7,9 +7,9 @@ SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi', SPECIES_AKULA = 'icons/inventory/head/mob_unathi.dmi', SPECIES_SERGAL = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_VULPKANIN = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/head/mob_vulpkanin.dmi' + SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi' ) sprite_sheets_obj = list( SPECIES_TAJ = 'icons/inventory/head/item.dmi', @@ -30,11 +30,11 @@ SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi', SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi', SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/mob_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/mob_vulpkanin.dmi' + SPECIES_AKULA = 'icons/inventory/suit/mob_vr_akula.dmi', + SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi', + SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', + SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi' ) sprite_sheets_obj = list( SPECIES_TAJ = 'icons/inventory/suit/item.dmi', @@ -46,4 +46,202 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/item.dmi', SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item.dmi', SPECIES_FENNEC = 'icons/inventory/suit/item.dmi' - ) \ No newline at end of file + ) + +// Alt mining voidsuit +/obj/item/clothing/suit/space/void/mining/alt2 + desc = "A surplus Commonwealth mining voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_mining_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0 + +/obj/item/clothing/head/helmet/space/void/mining/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_mining_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt anomaly/excavation suit +/obj/item/clothing/suit/space/anomaly/alt + desc = "A surplus Commonwealth anomaly suit! Slightly more comfortable and easier to move in than your average anomaly suit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_excavation_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0.5 + +/obj/item/clothing/head/helmet/space/anomaly/alt + desc = "A surplus Commonwealth helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_excavation_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt riot suit +/obj/item/clothing/suit/space/void/security/riot/alt + desc = "A surplus Commonwealth riot control voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_secalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0.5 + +/obj/item/clothing/head/helmet/space/void/security/riot/alt + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_secalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt pilot suit +/obj/item/clothing/suit/space/void/pilot/alt2 + desc = "A surplus Commonwealth pilot voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_pilot_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0 + +/obj/item/clothing/head/helmet/space/void/pilot/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_pilot_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt medical/emt suit +/obj/item/clothing/suit/space/void/medical/alt2 + desc = "A surplus Commonwealth medical voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_medicalalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0 + +/obj/item/clothing/head/helmet/space/void/medical/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_medicalalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt explorer suit +/obj/item/clothing/suit/space/void/exploration/alt2 + desc = "A surplus Commonwealth exploration voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_explorer_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0 + +/obj/item/clothing/head/helmet/space/void/exploration/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_explorer_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt engineering voidsuit +/obj/item/clothing/suit/space/void/engineering/alt2 + desc = "A surplus Commonwealth engineering voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_engineeringalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0.5 + +/obj/item/clothing/head/helmet/space/void/engineering/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_engineeringalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt atmos voidsuit +/obj/item/clothing/suit/space/void/atmos/alt2 + desc = "A surplus Commonwealth atmospherics voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_atmosalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 0.5 + +/obj/item/clothing/head/helmet/space/void/atmos/alt2 + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_atmosalt_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM + +// Alt command voidsuit +/obj/item/clothing/suit/space/void/captain/alt + desc = "A surplus Commonwealth Navy captain voidsuit! Slightly more comfortable and easier to move in than your average voidsuit." + + icon = 'icons/inventory/suit/item_vr.dmi' + default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' + icon_state = "void_command_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM + slowdown = 1.0 + +/obj/item/clothing/head/helmet/space/void/captain/alt + desc = "A surplus Commonwealth voidsuit helmet. Seems more fancy than what's usually found on the frontier." + + icon = 'icons/inventory/head/item_vr.dmi' + default_worn_icon = 'icons/inventory/head/mob_vr.dmi' + icon_state = "void_command_bay" + item_state = null + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 2ec40aa13f..3214239235 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -7,62 +7,14 @@ /obj/item/clothing/head/helmet/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = list( - SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi', - SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/head/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/head/mob_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/head/mob_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/head/mob_vulpkanin.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi', - SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi', - SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/head/item_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/head/item_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/head/item_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/head/item_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/head/item_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/head/item_vulpkanin.dmi' - ) + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM /obj/item/clothing/suit/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = list( - SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi', - SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/mob_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/mob_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/suit/mob_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/mob_vulpkanin.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi', - SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/item_teshari.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/suit/item_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/item_akula.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/item_sergal.dmi', - SPECIES_NEVREAN = 'icons/inventory/suit/item_sergal.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/item_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/item_vulpkanin.dmi' - ) - + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM + // This is a hack to prevent the item_state variable on the suits from taking effect // when the item is equipped in outer clothing slot. // This variable is normally used to set the icon_override when the suit is refitted, @@ -152,33 +104,9 @@ breach_threshold = 6 //this thing is basically tissue paper w_class = ITEMSIZE_NORMAL //if it's snug, high-tech, and made of relatively soft materials, it should be much easier to store! default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' - -/obj/item/clothing/suit/space/void/autolok - sprite_sheets = list( - SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi', - SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi', - SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi', - SPECIES_AKULA = 'icons/inventory/suit/mob_vr_unathi.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_unathi.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/mob_vr_teshari.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/inventory/suit/item_vr.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/item_vr.dmi', - SPECIES_UNATHI = 'icons/inventory/suit/item_vr.dmi', - SPECIES_XENOHYBRID = 'icons/inventory/suit/item_vr.dmi', - SPECIES_AKULA = 'icons/inventory/suit/item_vr.dmi', - SPECIES_SERGAL = 'icons/inventory/suit/item_vr.dmi', - SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr.dmi', - SPECIES_FENNEC = 'icons/inventory/suit/item_vr.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/item_vr.dmi' - ) + sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = null + sprite_sheets_refit = null /obj/item/clothing/suit/space/void/autolok/Initialize() . = ..() @@ -232,6 +160,7 @@ species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX) //this thing can autoadapt too flags_inv = HIDEEARS|BLOCKHAIR //removed HIDEFACE/MASK/EYES flags so sunglasses or facemasks don't disappear. still gotta have BLOCKHAIR or it'll clip out tho. default_worn_icon = 'icons/inventory/head/mob_vr.dmi' +<<<<<<< HEAD /obj/item/clothing/head/helmet/space/void/autolok sprite_sheets = list( @@ -260,3 +189,38 @@ SPECIES_TESHARI = 'icons/inventory/head/item_vr.dmi' ) sprite_sheets_refit = list() //have to nullify this as well just to be thorough +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport + +/obj/item/clothing/head/helmet/space/void/autolok + sprite_sheets = list( + SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi', + SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi', + SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi', + SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi', + SPECIES_XENOHYBRID = 'icons/inventory/head/mob_vr_unathi.dmi', + SPECIES_AKULA = 'icons/inventory/head/mob_vr_unathi.dmi', + SPECIES_SERGAL = 'icons/inventory/head/mob_vr_unathi.dmi', + SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi', + SPECIES_TESHARI = 'icons/inventory/head/mob_vr_teshari.dmi' + ) + sprite_sheets_obj = list( + SPECIES_TAJ = 'icons/inventory/head/item_vr.dmi', + SPECIES_SKRELL = 'icons/inventory/head/item_vr.dmi', + SPECIES_UNATHI = 'icons/inventory/head/item_vr.dmi', + SPECIES_XENOHYBRID = 'icons/inventory/head/item_vr.dmi', + SPECIES_AKULA = 'icons/inventory/head/item_vr.dmi', + SPECIES_SERGAL = 'icons/inventory/head/item_vr.dmi', + SPECIES_VULPKANIN = 'icons/inventory/head/item_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr.dmi', + SPECIES_FENNEC = 'icons/inventory/head/item_vr.dmi', + SPECIES_TESHARI = 'icons/inventory/head/item_vr.dmi' + ) + sprite_sheets_refit = list() //have to nullify this as well just to be thorough +======= + sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = null + sprite_sheets_refit = null + +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/modules/clothing/suits/utility_vr.dm b/code/modules/clothing/suits/utility_vr.dm index f12e54ee63..44c33c81ba 100644 --- a/code/modules/clothing/suits/utility_vr.dm +++ b/code/modules/clothing/suits/utility_vr.dm @@ -20,12 +20,12 @@ sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/head/mob_ch_teshari.dmi', //CHOMPstation edit, using our overwrite icons SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/head/mob_werebeast.dmi' + SPECIES_WEREBEAST = 'icons/inventory/head/mob_vr_werebeast.dmi' ) /obj/item/clothing/suit/radiation sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/suit/mob_ch_teshari.dmi', //CHOMPstation edit, using our overwrite icons SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi', - SPECIES_WEREBEAST = 'icons/inventory/suit/mob_werebeast.dmi' + SPECIES_WEREBEAST = 'icons/inventory/suit/mob_vr_werebeast.dmi' ) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 00e2b47795..ca03efdec5 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -57,7 +57,7 @@ if("[tmp_icon_state]_mob" in cached_icon_states(icon_override)) tmp_icon_state = "[tmp_icon_state]_mob" mob_overlay = image("icon" = icon_override, "icon_state" = "[tmp_icon_state]") - else if(wearer && sprite_sheets[wearer.species.get_bodytype(wearer)]) //Teshari can finally into webbing, too! + else if(wearer && LAZYACCESS(sprite_sheets, wearer.species.get_bodytype(wearer))) //Teshari can finally into webbing, too! mob_overlay = image("icon" = sprite_sheets[wearer.species.get_bodytype(wearer)], "icon_state" = "[tmp_icon_state]") else mob_overlay = image("icon" = INV_ACCESSORIES_DEF_ICON, "icon_state" = "[tmp_icon_state]") diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index ef3c67103a..3281c5f5a8 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -11,7 +11,7 @@ body_parts_covered = 0 equip_sound = null - sprite_sheets = list() + sprite_sheets = null item_state = "golem" //This is dumb and hacky but was here when I got here. worn_state = "golem" //It's basically just a coincidentally black iconstate in the file. diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index aadafb9b66..c1ddca4522 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -96,7 +96,7 @@ //this has to mirror the way update_inv_*_hand() selects the state /datum/custom_item/proc/get_state(var/obj/item/item, var/slot_str, var/hand_str) var/t_state - if(item.item_state_slots && item.item_state_slots[slot_str]) + if(LAZYACCESS(item.item_state_slots, slot_str)) t_state = item.item_state_slots[slot_str] else if(item.item_state) t_state = item.item_state @@ -111,7 +111,7 @@ var/icon/t_icon if(item.icon_override) t_icon = item.icon_override - else if(item.item_icons && (slot_str in item.item_icons)) + else if(LAZYACCESS(item.item_icons, slot_str)) t_icon = item.item_icons[slot_str] else t_icon = hand_icon diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index feab80627a..c68ee21401 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -267,7 +267,7 @@ emp_act if(!affecting) return //should be prevented by attacked_with_item() but for sanity. - visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!") + visible_message("[src] has been [LAZYLEN(I.attack_verb) ? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!") var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 29b8155366..f835202ca3 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -33,6 +33,85 @@ for(var/obj/item/I in loc) equip_to_appropriate_slot(I) +<<<<<<< HEAD +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +/mob/living/carbon/human/dummy/mannequin/autoequip + icon = 'icons/effects/species.dmi' + icon_state = "lizard_f_s_full" + +/mob/living/carbon/human/dummy/mannequin/autoequip/Initialize() + icon = null + icon_state = "" + . = ..() + for(var/obj/item/I in loc) + equip_to_appropriate_slot(I) + +======= +/mob/living/carbon/human/dummy/mannequin/autoequip + icon = 'icons/mob/human_races/r_human.dmi' + icon_state = "preview" + +/mob/living/carbon/human/dummy/mannequin/autoequip/Initialize() + icon = null + icon_state = "" + . = ..() + + dress_up() + turntable() + +/mob/living/carbon/human/dummy/mannequin/autoequip/proc/dress_up() + set waitfor = FALSE + + for(var/obj/item/I in loc) + if(istype(I, /obj/item/clothing)) + var/obj/item/clothing/C = I + C.species_restricted = null + equip_to_appropriate_slot(I) + + if(istype(back, /obj/item/weapon/rig)) + var/obj/item/weapon/rig/rig = back + rig.toggle_seals(src) + +/mob/living/carbon/human/dummy/mannequin/autoequip/proc/turntable() + set waitfor = FALSE + + while(TRUE) + set_dir(SOUTH) + sleep(2 SECONDS) + set_dir(EAST) + sleep(2 SECONDS) + set_dir(NORTH) + sleep(2 SECONDS) + set_dir(WEST) + sleep(2 SECONDS) + +/mob/living/carbon/human/dummy/mannequin/autoequip/tajaran + icon = 'icons/mob/human_races/r_tajaran.dmi' +/mob/living/carbon/human/dummy/mannequin/autoequip/tajaran/Initialize(var/new_loc) + h_style = "Tajaran Ears" + return ..(new_loc, SPECIES_TAJ) + +/mob/living/carbon/human/dummy/mannequin/autoequip/unathi + icon = 'icons/mob/human_races/r_lizard.dmi' +/mob/living/carbon/human/dummy/mannequin/autoequip/unathi/Initialize(var/new_loc) + h_style = "Unathi Horns" + return ..(new_loc, SPECIES_UNATHI) + +/mob/living/carbon/human/dummy/mannequin/autoequip/sergal + icon = 'icons/mob/human_races/r_sergal.dmi' +/mob/living/carbon/human/dummy/mannequin/autoequip/sergal/Initialize(var/new_loc) + h_style = "Sergal Ears" + return ..(new_loc, SPECIES_SERGAL) + +/mob/living/carbon/human/dummy/mannequin/autoequip/vulpkanin + icon = 'icons/mob/human_races/r_vulpkanin.dmi' +/mob/living/carbon/human/dummy/mannequin/autoequip/vulpkanin/Initialize(var/new_loc) + h_style = "vulpkanin, dual-color" + return ..(new_loc, SPECIES_VULPKANIN) + + + +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport /mob/living/carbon/human/skrell/Initialize(var/new_loc) h_style = "Skrell Short Tentacles" return ..(new_loc, SPECIES_SKRELL) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm index 7dd3f52c5d..a315c8218e 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm @@ -15,7 +15,7 @@ user.setClickCooldown(user.get_attack_speed(W)) if(W.force) - visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] has been [LAZYLEN(W.attack_verb) ? pick(W.attack_verb) : "attacked"] with \the [W][(user ? " by [user]." : ".")]") qdel(src) /obj/effect/weaversilk/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 589d9ac6a3..e9a75d2ab5 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -225,7 +225,7 @@ //Called when the mob is hit with an item in combat. Returns the blocked result /mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) - visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!") + visible_message("[src] has been [LAZYLEN(I.attack_verb) ? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!") if(ai_holder) ai_holder.react_to_attack(user) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 32cc4f32d4..d615f41290 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -1,7 +1,7 @@ var/list/mob_hat_cache = list() /proc/get_hat_icon(var/obj/item/hat, var/offset_x = 0, var/offset_y = 0) var/t_state = hat.icon_state - if(hat.item_state_slots && hat.item_state_slots[slot_head_str]) + if(LAZYACCESS(hat.item_state_slots, slot_head_str)) t_state = hat.item_state_slots[slot_head_str] else if(hat.item_state) t_state = hat.item_state @@ -10,7 +10,7 @@ var/list/mob_hat_cache = list() var/t_icon = INV_HEAD_DEF_ICON // are unique across multiple dmis, but whatever. if(hat.icon_override) t_icon = hat.icon_override - else if(hat.item_icons && (slot_head_str in hat.item_icons)) + else if(LAZYACCESS(hat.item_icons, slot_head_str)) t_icon = hat.item_icons[slot_head_str] var/image/I = image(icon = t_icon, icon_state = t_state) I.pixel_x = offset_x diff --git a/code/modules/mob/living/simple_mob/hands.dm b/code/modules/mob/living/simple_mob/hands.dm index 8ec2158d65..9d869df631 100644 --- a/code/modules/mob/living/simple_mob/hands.dm +++ b/code/modules/mob/living/simple_mob/hands.dm @@ -52,7 +52,7 @@ //determine icon state to use var/t_state - if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str]) + if(LAZYACCESS(r_hand.item_state_slots, slot_r_hand_str)) t_state = r_hand.item_state_slots[slot_r_hand_str] else if(r_hand.item_state) t_state = r_hand.item_state @@ -61,7 +61,7 @@ //determine icon to use var/icon/t_icon - if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons)) + if(LAZYACCESS(r_hand.item_icons, slot_r_hand_str)) t_icon = r_hand.item_icons[slot_r_hand_str] else if(r_hand.icon_override) t_state += "_r" @@ -89,7 +89,7 @@ //determine icon state to use var/t_state - if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) + if(LAZYACCESS(l_hand.item_state_slots, slot_l_hand_str)) t_state = l_hand.item_state_slots[slot_l_hand_str] else if(l_hand.item_state) t_state = l_hand.item_state @@ -98,7 +98,7 @@ //determine icon to use var/icon/t_icon - if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) + if(LAZYACCESS(l_hand.item_icons, slot_l_hand_str)) t_icon = l_hand.item_icons[slot_l_hand_str] else if(l_hand.icon_override) t_state += "_l" diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index 90082c146a..b6c0ffe820 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* //////////////////////////// / =--------------------= / @@ -1147,3 +1148,2304 @@ ani_state = "tentacle_w" do_colouration = 1 color_blend_mode = ICON_MULTIPLY +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/vore/tails_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/molenar_kitsune + name = "quintail kitsune tails (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/tail/miria_fluffdragon + name = "fluffdragon tail (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/miria_kitsune + name = "Black kitsune tails (Miria Masters)" + desc = "" + icon_state = "miria-kitsunetail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/molenar_deathclaw + name = "deathclaw bits (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar","silvertalismen","jertheace") + +/datum/sprite_accessory/tail/runac + name = "fennecsune tails (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. + name = "fox tail (+ beewings) (Reika)" + desc = "" + icon_state = "reika" + ckeys_allowed = list("rikaru19xjenkins") + +/datum/sprite_accessory/tail/rosey + name = "tritail kitsune tails (Rosey)" + desc = "" + icon_state = "rosey_three" + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/rosey2 + name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK + desc = "" + icon_state = "rosey_five" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/scree + name = "green taj tail (Scree)" + desc = "" + icon_state = "scree" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/tail/aronai + name = "aronai tail (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/tail/cabletail + name = "cabletail" + desc = "cabletail" + icon_state = "cabletail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/featherfluff_tail + name = "featherfluff_tail" + desc = "" + icon_state = "featherfluff_tail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/holly + name = "tigress tail (Holly)" + desc = "" + icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/tesh_feathered + name = "Teshari tail" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + extra_overlay = "teshtail_feathers_s" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_fluffytail_mark" + +/datum/sprite_accessory/tail/tesh_pattern_male + name = "Teshari male tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_tail" + +/datum/sprite_accessory/tail/tesh_pattern_male_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_alt" + +/datum/sprite_accessory/tail/tesh_pattern_fem + name = "Teshari female tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_tail" + +/datum/sprite_accessory/tail/tesh_pattern_fem_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_alt" + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails_vr.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" + +/datum/sprite_accessory/tail/Easterntail + name = "Eastern Dragon (Animated)" + desc = "" + icon_state = "Easterntail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "EasterntailColorTip" + ani_state = "Easterntail_w" + extra_overlay_w = "EasterntailColorTip_w" + +/datum/sprite_accessory/tail/synthtail_static + name = "Synthetic lizard tail" + desc = "" + icon_state = "synthtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/synthtail_vwag + name = "Synthetic lizard tail (vwag)" + desc = "" + icon_state = "synthtail" + ani_state = "synthtail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/Plugtail + name = "Synthetic plug tail" + desc = "" + icon_state = "Plugtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "PlugtailMarking" + extra_overlay2 = "PlugtailMarking2" + +/datum/sprite_accessory/tail/Segmentedtail + name = "Segmented tail, animated" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedtailmarking" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedtailmarking_w" + +/datum/sprite_accessory/tail/Segmentedlights + name = "Segmented tail, animated synth" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedlights" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedlights_w" + +/datum/sprite_accessory/tail/fox_tail + name = "Fox tail" + desc = "" + icon_state = "fox_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fox_tail_plain + name = "Fox tail" + desc = "" + icon_state = "fox_tail_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fennec_tail + name = "Fennec tail" + desc = "" + icon_state = "fennec_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_smooth + name = "Lizard Tail (Smooth)" + desc = "" + icon_state = "lizard_tail_smooth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_dark_tiger + name = "Lizard Tail (Dark Tiger)" + desc = "" + icon_state = "lizard_tail_dark_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_light_tiger + name = "Lizard Tail (Light Tiger)" + desc = "" + icon_state = "lizard_tail_light_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_spiked + name = "Lizard Tail (Spiked)" + desc = "" + icon_state = "lizard_tail_spiked" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotail_fullcolour + name = "xenomorph tail (fully colourable)" + desc = "" + icon_state = "xenotail_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotailalt_fullcolour + name = "xenomorph tail alt. (fully colourable)" + desc = "" + icon_state = "xenotailalt_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/peacocktail_red //this is ckey locked for now, but prettiebyrd wants these tails to be unlocked at a later date + name = "Peacock tail (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail_red" + ani_state = "peacocktail_red_w" + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/peacocktail //ditto + name = "Peacock tail, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail" + ani_state = "peacocktail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/tentacle + name = "Tentacle, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "tentacle" + ani_state = "tentacle_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY +======= +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/vore/tails_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/molenar_kitsune + name = "quintail kitsune tails (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/tail/miria_fluffdragon + name = "fluffdragon tail (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/miria_kitsune + name = "Black kitsune tails (Miria Masters)" + desc = "" + icon_state = "miria-kitsunetail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/molenar_deathclaw + name = "deathclaw bits (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar","silvertalismen","jertheace") + +/datum/sprite_accessory/tail/runac + name = "fennecsune tails (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. + name = "fox tail (+ beewings) (Reika)" + desc = "" + icon_state = "reika" + ckeys_allowed = list("rikaru19xjenkins") + +/datum/sprite_accessory/tail/rosey + name = "tritail kitsune tails (Rosey)" + desc = "" + icon_state = "rosey_three" + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/rosey2 + name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK + desc = "" + icon_state = "rosey_five" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/scree + name = "green taj tail (Scree)" + desc = "" + icon_state = "scree" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/tail/aronai + name = "aronai tail (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/tail/cabletail + name = "cabletail" + desc = "cabletail" + icon_state = "cabletail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/featherfluff_tail + name = "featherfluff_tail" + desc = "" + icon_state = "featherfluff_tail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/holly + name = "tigress tail (Holly)" + desc = "" + icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/tesh_feathered + name = "Teshari tail" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + extra_overlay = "teshtail_feathers_s" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_fluffytail_mark" + +/datum/sprite_accessory/tail/tesh_pattern_male + name = "Teshari male tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_tail" + +/datum/sprite_accessory/tail/tesh_pattern_male_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_alt" + +/datum/sprite_accessory/tail/tesh_pattern_fem + name = "Teshari female tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_tail" + +/datum/sprite_accessory/tail/tesh_pattern_fem_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_alt" + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails_vr.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" + +/datum/sprite_accessory/tail/Easterntail + name = "Eastern Dragon (Animated)" + desc = "" + icon_state = "Easterntail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "EasterntailColorTip" + ani_state = "Easterntail_w" + extra_overlay_w = "EasterntailColorTip_w" + +/datum/sprite_accessory/tail/synthtail_static + name = "Synthetic lizard tail" + desc = "" + icon_state = "synthtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/synthtail_vwag + name = "Synthetic lizard tail (vwag)" + desc = "" + icon_state = "synthtail" + ani_state = "synthtail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/Plugtail + name = "Synthetic plug tail" + desc = "" + icon_state = "Plugtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "PlugtailMarking" + extra_overlay2 = "PlugtailMarking2" + +/datum/sprite_accessory/tail/Segmentedtail + name = "Segmented tail, animated" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedtailmarking" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedtailmarking_w" + +/datum/sprite_accessory/tail/Segmentedlights + name = "Segmented tail, animated synth" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedlights" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedlights_w" + +/datum/sprite_accessory/tail/fox_tail + name = "Fox tail" + desc = "" + icon_state = "fox_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fox_tail_plain + name = "Fox tail" + desc = "" + icon_state = "fox_tail_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fennec_tail + name = "Fennec tail" + desc = "" + icon_state = "fennec_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_smooth + name = "Lizard Tail (Smooth)" + desc = "" + icon_state = "lizard_tail_smooth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_dark_tiger + name = "Lizard Tail (Dark Tiger)" + desc = "" + icon_state = "lizard_tail_dark_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_light_tiger + name = "Lizard Tail (Light Tiger)" + desc = "" + icon_state = "lizard_tail_light_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_spiked + name = "Lizard Tail (Spiked)" + desc = "" + icon_state = "lizard_tail_spiked" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotail_fullcolour + name = "xenomorph tail (fully colourable)" + desc = "" + icon_state = "xenotail_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotailalt_fullcolour + name = "xenomorph tail alt. (fully colourable)" + desc = "" + icon_state = "xenotailalt_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/peacocktail_red //this is ckey locked for now, but prettiebyrd wants these tails to be unlocked at a later date + name = "Peacock tail (vwag)" + desc = "" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "peacocktail_red" + ani_state = "peacocktail_red_w" + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/peacocktail //ditto + name = "Peacock tail, colorable (vwag)" + desc = "" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "peacocktail" + ani_state = "peacocktail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/tentacle + name = "Tentacle, colorable (vwag)" + desc = "" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "tentacle" + ani_state = "tentacle_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5e551be0d4..712c4686ea 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -157,11 +157,11 @@ var/mob/living/M = loc if(istype(M)) if(M.can_wield_item(src) && src.is_held_twohanded(M)) - item_state_slots[slot_l_hand_str] = wielded_item_state - item_state_slots[slot_r_hand_str] = wielded_item_state + LAZYSET(item_state_slots, slot_l_hand_str, wielded_item_state) + LAZYSET(item_state_slots, slot_r_hand_str, wielded_item_state) else - item_state_slots[slot_l_hand_str] = initial(item_state) - item_state_slots[slot_r_hand_str] = initial(item_state) + LAZYSET(item_state_slots, slot_l_hand_str, initial(item_state)) + LAZYSET(item_state_slots, slot_r_hand_str, initial(item_state)) ..() diff --git a/code/modules/projectiles/guns/energy/gunsword_vr.dm b/code/modules/projectiles/guns/energy/gunsword_vr.dm index 20ffc1ccea..e5ffffc05d 100644 --- a/code/modules/projectiles/guns/energy/gunsword_vr.dm +++ b/code/modules/projectiles/guns/energy/gunsword_vr.dm @@ -89,7 +89,7 @@ edge = initial(edge) w_class = initial(w_class) set_light(0,0) - attack_verb = list() + attack_verb = null /obj/item/weapon/cell/device/weapon/gunsword/attack_self(mob/living/user as mob) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 2116cb6048..df2f8764be 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1020,7 +1020,7 @@ No. With a teleporter? Just *no*. - Hawk, YW icon_state = "gildedcuffs" icon_override = 'icons/vore/custom_onmob_vr.dmi' - item_icons = list() + item_icons = null body_parts_covered = 0 @@ -1849,7 +1849,7 @@ Departamental Swimsuits, for general use rolled_down = 0 rolled_sleeves = 0 starting_accessories = null - item_icons = list() + item_icons = null //Vorrarkul: Melanie Farmer /obj/item/clothing/under/fluff/slime_skeleton @@ -1903,7 +1903,7 @@ Departamental Swimsuits, for general use body_parts_covered = UPPER_TORSO|LOWER_TORSO icon = 'icons/vore/custom_clothes_vr.dmi' icon_state = "latex_clothes" - item_icons = list() + item_icons = null default_worn_icon = 'icons/vore/custom_clothes_vr.dmi' color = COLOR_NAVY sprite_sheets = list() @@ -1996,7 +1996,7 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_onmob_vr.dmi' icon_state = "nikki_outfit" item_state = "nikki_outfit" - item_icons = list() + item_icons = null sensor_mode = 3 // I'm a dumbass and forget these all the time please understand :( /obj/item/clothing/under/skirt/outfit/fluff/nikki/mob_can_equip(var/mob/living/carbon/human/M, slot, disable_warning = 0) diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 1f4f65084d..d4f114fc2a 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -7,8 +7,8 @@ icon_override = 'icons/inventory/head/mob_vr.dmi' slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID w_class = ITEMSIZE_SMALL - item_icons = list() // No in-hand sprites (for now, anyway, we could totally add some) - pixel_y = 0 // Override value from parent. + item_icons = null // No in-hand sprites (for now, anyway, we could totally add some) + pixel_y = 0 // Override value from parent. /obj/item/weapon/holder/micro/examine(mob/user) . = list() diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index 276d8e305e..2cdc3e5d0e 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -4,7 +4,6 @@ icon = 'icons/inventory/suit/item.dmi' icon_state = "engspace_suit" item_state = "engspace_suit" - update_icon_define = "icons/mob/spacesuit.dmi" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) max_pressure_protection = 5 * ONE_ATMOSPHERE // Not very good protection, but if an anomaly starts doing gas stuff you're not screwed min_pressure_protection = 0.4 * ONE_ATMOSPHERE diff --git a/icons/inventory/accessory/mob_werebeast.dmi b/icons/inventory/accessory/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/accessory/mob_werebeast.dmi rename to icons/inventory/accessory/mob_vr_werebeast.dmi diff --git a/icons/inventory/back/mob_werebeast.dmi b/icons/inventory/back/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/back/mob_werebeast.dmi rename to icons/inventory/back/mob_vr_werebeast.dmi diff --git a/icons/inventory/belt/mob_werebeast.dmi b/icons/inventory/belt/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/belt/mob_werebeast.dmi rename to icons/inventory/belt/mob_vr_werebeast.dmi diff --git a/icons/inventory/ears/mob_werebeast.dmi b/icons/inventory/ears/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/ears/mob_werebeast.dmi rename to icons/inventory/ears/mob_vr_werebeast.dmi diff --git a/icons/inventory/face/mob_akula.dmi b/icons/inventory/face/mob_vr_akula.dmi similarity index 100% rename from icons/inventory/face/mob_akula.dmi rename to icons/inventory/face/mob_vr_akula.dmi diff --git a/icons/inventory/face/mob_fennec.dmi b/icons/inventory/face/mob_vr_fennec.dmi similarity index 100% rename from icons/inventory/face/mob_fennec.dmi rename to icons/inventory/face/mob_vr_fennec.dmi diff --git a/icons/inventory/face/mob_fox.dmi b/icons/inventory/face/mob_vr_fox.dmi similarity index 100% rename from icons/inventory/face/mob_fox.dmi rename to icons/inventory/face/mob_vr_fox.dmi diff --git a/icons/inventory/face/mob_nevrean.dmi b/icons/inventory/face/mob_vr_nevrean.dmi similarity index 100% rename from icons/inventory/face/mob_nevrean.dmi rename to icons/inventory/face/mob_vr_nevrean.dmi diff --git a/icons/inventory/face/mob_sergal.dmi b/icons/inventory/face/mob_vr_sergal.dmi similarity index 100% rename from icons/inventory/face/mob_sergal.dmi rename to icons/inventory/face/mob_vr_sergal.dmi diff --git a/icons/inventory/face/mob_vulpkanin.dmi b/icons/inventory/face/mob_vr_vulpkanin.dmi similarity index 100% rename from icons/inventory/face/mob_vulpkanin.dmi rename to icons/inventory/face/mob_vr_vulpkanin.dmi diff --git a/icons/inventory/face/mob_werebeast.dmi b/icons/inventory/face/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/face/mob_werebeast.dmi rename to icons/inventory/face/mob_vr_werebeast.dmi diff --git a/icons/inventory/feet/mob_werebeast.dmi b/icons/inventory/feet/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/feet/mob_werebeast.dmi rename to icons/inventory/feet/mob_vr_werebeast.dmi diff --git a/icons/inventory/hands/mob_werebeast.dmi b/icons/inventory/hands/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/hands/mob_werebeast.dmi rename to icons/inventory/hands/mob_vr_werebeast.dmi diff --git a/icons/inventory/head/item_akula.dmi b/icons/inventory/head/item_akula.dmi deleted file mode 100644 index 729050c5f5..0000000000 Binary files a/icons/inventory/head/item_akula.dmi and /dev/null differ diff --git a/icons/inventory/head/item_sergal.dmi b/icons/inventory/head/item_sergal.dmi deleted file mode 100644 index 9a412ee16a..0000000000 Binary files a/icons/inventory/head/item_sergal.dmi and /dev/null differ diff --git a/icons/inventory/head/item_skrell.dmi b/icons/inventory/head/item_skrell.dmi index def79846d3..3977261932 100644 Binary files a/icons/inventory/head/item_skrell.dmi and b/icons/inventory/head/item_skrell.dmi differ diff --git a/icons/inventory/head/item_vr_akula.dmi b/icons/inventory/head/item_vr_akula.dmi new file mode 100644 index 0000000000..c1c62b0eef Binary files /dev/null and b/icons/inventory/head/item_vr_akula.dmi differ diff --git a/icons/inventory/head/item_vr_sergal.dmi b/icons/inventory/head/item_vr_sergal.dmi new file mode 100644 index 0000000000..1798af00f3 Binary files /dev/null and b/icons/inventory/head/item_vr_sergal.dmi differ diff --git a/icons/inventory/head/item_vr_skrell.dmi b/icons/inventory/head/item_vr_skrell.dmi new file mode 100644 index 0000000000..ca89e62c98 Binary files /dev/null and b/icons/inventory/head/item_vr_skrell.dmi differ diff --git a/icons/inventory/head/item_vr_tajaran.dmi b/icons/inventory/head/item_vr_tajaran.dmi new file mode 100644 index 0000000000..42f2e3baaf Binary files /dev/null and b/icons/inventory/head/item_vr_tajaran.dmi differ diff --git a/icons/inventory/head/item_vr_teshari.dmi b/icons/inventory/head/item_vr_teshari.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/inventory/head/item_vr_teshari.dmi differ diff --git a/icons/inventory/head/item_vr_unathi.dmi b/icons/inventory/head/item_vr_unathi.dmi new file mode 100644 index 0000000000..42f2e3baaf Binary files /dev/null and b/icons/inventory/head/item_vr_unathi.dmi differ diff --git a/icons/inventory/head/item_vr_vulpkanin.dmi b/icons/inventory/head/item_vr_vulpkanin.dmi new file mode 100644 index 0000000000..a436370991 Binary files /dev/null and b/icons/inventory/head/item_vr_vulpkanin.dmi differ diff --git a/icons/inventory/head/item_vulpkanin.dmi b/icons/inventory/head/item_vulpkanin.dmi deleted file mode 100644 index f2dc038628..0000000000 Binary files a/icons/inventory/head/item_vulpkanin.dmi and /dev/null differ diff --git a/icons/inventory/head/mob_akula.dmi b/icons/inventory/head/mob_akula.dmi deleted file mode 100644 index 5f74f6930c..0000000000 Binary files a/icons/inventory/head/mob_akula.dmi and /dev/null differ diff --git a/icons/inventory/head/mob_sergal.dmi b/icons/inventory/head/mob_sergal.dmi deleted file mode 100644 index a890d2bb7d..0000000000 Binary files a/icons/inventory/head/mob_sergal.dmi and /dev/null differ diff --git a/icons/inventory/head/mob_vr_akula.dmi b/icons/inventory/head/mob_vr_akula.dmi new file mode 100644 index 0000000000..ca993093cb Binary files /dev/null and b/icons/inventory/head/mob_vr_akula.dmi differ diff --git a/icons/inventory/head/mob_vr_sergal.dmi b/icons/inventory/head/mob_vr_sergal.dmi new file mode 100644 index 0000000000..d1278fdee1 Binary files /dev/null and b/icons/inventory/head/mob_vr_sergal.dmi differ diff --git a/icons/inventory/head/mob_vr_skrell.dmi b/icons/inventory/head/mob_vr_skrell.dmi index be0c1ce344..5a93ec85aa 100644 Binary files a/icons/inventory/head/mob_vr_skrell.dmi and b/icons/inventory/head/mob_vr_skrell.dmi differ diff --git a/icons/inventory/head/mob_vr_tajaran.dmi b/icons/inventory/head/mob_vr_tajaran.dmi index 49cbece23f..62fe3a4208 100644 Binary files a/icons/inventory/head/mob_vr_tajaran.dmi and b/icons/inventory/head/mob_vr_tajaran.dmi differ diff --git a/icons/inventory/head/mob_vr_unathi.dmi b/icons/inventory/head/mob_vr_unathi.dmi index e10d5b31ae..5f94c0689c 100644 Binary files a/icons/inventory/head/mob_vr_unathi.dmi and b/icons/inventory/head/mob_vr_unathi.dmi differ diff --git a/icons/inventory/head/mob_vr_vulpkanin.dmi b/icons/inventory/head/mob_vr_vulpkanin.dmi index 7ccdf2a14c..5e815142fd 100644 Binary files a/icons/inventory/head/mob_vr_vulpkanin.dmi and b/icons/inventory/head/mob_vr_vulpkanin.dmi differ diff --git a/icons/inventory/head/mob_werebeast.dmi b/icons/inventory/head/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/head/mob_werebeast.dmi rename to icons/inventory/head/mob_vr_werebeast.dmi diff --git a/icons/inventory/head/mob_vulpkanin.dmi b/icons/inventory/head/mob_vulpkanin.dmi deleted file mode 100644 index a800f5f951..0000000000 Binary files a/icons/inventory/head/mob_vulpkanin.dmi and /dev/null differ diff --git a/icons/inventory/suit/item_akula.dmi b/icons/inventory/suit/item_akula.dmi deleted file mode 100644 index 60fb367009..0000000000 Binary files a/icons/inventory/suit/item_akula.dmi and /dev/null differ diff --git a/icons/inventory/suit/item_sergal.dmi b/icons/inventory/suit/item_sergal.dmi deleted file mode 100644 index 589c5a4a96..0000000000 Binary files a/icons/inventory/suit/item_sergal.dmi and /dev/null differ diff --git a/icons/inventory/suit/item_vr_akula.dmi b/icons/inventory/suit/item_vr_akula.dmi new file mode 100644 index 0000000000..d92ed2767f Binary files /dev/null and b/icons/inventory/suit/item_vr_akula.dmi differ diff --git a/icons/inventory/suit/item_vr_sergal.dmi b/icons/inventory/suit/item_vr_sergal.dmi new file mode 100644 index 0000000000..317437de1b Binary files /dev/null and b/icons/inventory/suit/item_vr_sergal.dmi differ diff --git a/icons/inventory/suit/item_vr_skrell.dmi b/icons/inventory/suit/item_vr_skrell.dmi new file mode 100644 index 0000000000..47be343651 Binary files /dev/null and b/icons/inventory/suit/item_vr_skrell.dmi differ diff --git a/icons/inventory/suit/item_vr_tajaran.dmi b/icons/inventory/suit/item_vr_tajaran.dmi new file mode 100644 index 0000000000..47be343651 Binary files /dev/null and b/icons/inventory/suit/item_vr_tajaran.dmi differ diff --git a/icons/inventory/suit/item_vr_teshari.dmi b/icons/inventory/suit/item_vr_teshari.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/inventory/suit/item_vr_teshari.dmi differ diff --git a/icons/inventory/suit/item_vr_unathi.dmi b/icons/inventory/suit/item_vr_unathi.dmi new file mode 100644 index 0000000000..47be343651 Binary files /dev/null and b/icons/inventory/suit/item_vr_unathi.dmi differ diff --git a/icons/inventory/suit/item_vr_vulpkanin.dmi b/icons/inventory/suit/item_vr_vulpkanin.dmi new file mode 100644 index 0000000000..a0a7c18394 Binary files /dev/null and b/icons/inventory/suit/item_vr_vulpkanin.dmi differ diff --git a/icons/inventory/suit/item_vulpkanin.dmi b/icons/inventory/suit/item_vulpkanin.dmi deleted file mode 100644 index 3df33763a0..0000000000 Binary files a/icons/inventory/suit/item_vulpkanin.dmi and /dev/null differ diff --git a/icons/inventory/suit/mob_akula.dmi b/icons/inventory/suit/mob_akula.dmi deleted file mode 100644 index 98767384b3..0000000000 Binary files a/icons/inventory/suit/mob_akula.dmi and /dev/null differ diff --git a/icons/inventory/suit/mob_sergal.dmi b/icons/inventory/suit/mob_sergal.dmi deleted file mode 100644 index 8cdc3c2da0..0000000000 Binary files a/icons/inventory/suit/mob_sergal.dmi and /dev/null differ diff --git a/icons/inventory/suit/mob_vr_akula.dmi b/icons/inventory/suit/mob_vr_akula.dmi new file mode 100644 index 0000000000..203c946c2d Binary files /dev/null and b/icons/inventory/suit/mob_vr_akula.dmi differ diff --git a/icons/inventory/suit/mob_vr_sergal.dmi b/icons/inventory/suit/mob_vr_sergal.dmi new file mode 100644 index 0000000000..66ed483095 Binary files /dev/null and b/icons/inventory/suit/mob_vr_sergal.dmi differ diff --git a/icons/inventory/suit/mob_vr_skrell.dmi b/icons/inventory/suit/mob_vr_skrell.dmi index ab071d5069..497728f442 100644 Binary files a/icons/inventory/suit/mob_vr_skrell.dmi and b/icons/inventory/suit/mob_vr_skrell.dmi differ diff --git a/icons/inventory/suit/mob_vr_tajaran.dmi b/icons/inventory/suit/mob_vr_tajaran.dmi index c20178dacb..68c8385bff 100644 Binary files a/icons/inventory/suit/mob_vr_tajaran.dmi and b/icons/inventory/suit/mob_vr_tajaran.dmi differ diff --git a/icons/inventory/suit/mob_vr_unathi.dmi b/icons/inventory/suit/mob_vr_unathi.dmi index f1625306a7..c65a8a0fb8 100644 Binary files a/icons/inventory/suit/mob_vr_unathi.dmi and b/icons/inventory/suit/mob_vr_unathi.dmi differ diff --git a/icons/inventory/suit/mob_vr_vulpkanin.dmi b/icons/inventory/suit/mob_vr_vulpkanin.dmi index e0c20b6092..08428d3bf5 100644 Binary files a/icons/inventory/suit/mob_vr_vulpkanin.dmi and b/icons/inventory/suit/mob_vr_vulpkanin.dmi differ diff --git a/icons/inventory/suit/mob_werebeast.dmi b/icons/inventory/suit/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/suit/mob_werebeast.dmi rename to icons/inventory/suit/mob_vr_werebeast.dmi diff --git a/icons/inventory/suit/mob_vulpkanin.dmi b/icons/inventory/suit/mob_vulpkanin.dmi deleted file mode 100644 index 10604dc0b3..0000000000 Binary files a/icons/inventory/suit/mob_vulpkanin.dmi and /dev/null differ diff --git a/icons/inventory/suit_store/mob_werebeast.dmi b/icons/inventory/suit_store/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/suit_store/mob_werebeast.dmi rename to icons/inventory/suit_store/mob_vr_werebeast.dmi diff --git a/icons/inventory/uniform/mob_werebeast.dmi b/icons/inventory/uniform/mob_vr_werebeast.dmi similarity index 100% rename from icons/inventory/uniform/mob_werebeast.dmi rename to icons/inventory/uniform/mob_vr_werebeast.dmi diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi index bb9f4f2acf..7e87a48de2 100644 Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ diff --git a/icons/mob/light_overlays.dmi b/icons/mob/light_overlays.dmi index 4260d9f16c..2a0f5b153c 100644 Binary files a/icons/mob/light_overlays.dmi and b/icons/mob/light_overlays.dmi differ diff --git a/icons/mob/rig_back_vr.dmi b/icons/mob/rig_back_vr.dmi index aa676c0e94..9d36cd9694 100644 Binary files a/icons/mob/rig_back_vr.dmi and b/icons/mob/rig_back_vr.dmi differ diff --git a/icons/obj/light_overlays.dmi b/icons/obj/light_overlays.dmi index cfcbba67a2..470631d104 100644 Binary files a/icons/obj/light_overlays.dmi and b/icons/obj/light_overlays.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 3eea4aae74..df67a7a649 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -90,7 +90,12 @@ #include "code\__defines\spaceman_dmm.dm" #include "code\__defines\species_languages.dm" #include "code\__defines\species_languages_vr.dm" +<<<<<<< HEAD #include "code\__defines\species_languages_YW.dm" +||||||| parent of 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport +======= +#include "code\__defines\sprite_sheets.dm" +>>>>>>> 43822f5c50... Merge pull request #11080 from VOREStation/Arokha/bayport #include "code\__defines\sqlite_defines.dm" #include "code\__defines\stat_tracking.dm" #include "code\__defines\subsystems.dm" @@ -897,6 +902,7 @@ #include "code\game\machinery\spaceheater.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" +#include "code\game\machinery\suit_cycler_datums.dm" #include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\suit_storage_unit_vr.dm" #include "code\game\machinery\suit_storage_unit_yw.dm"