diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 67fc80168a8..1e0fe3a78a9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -110,7 +110,7 @@ // Also recharge their internal battery. if(H.isSynthetic() && H.nutrition < 500) //VOREStation Edit - H.nutrition = min(H.nutrition+(10*(1-H.species.synthetic_food_coeff)), 500) //VOREStation Edit + H.nutrition = min(H.nutrition+(10*(1-max(H.species.synthetic_food_coeff, 0.9))), 500) //VOREStation Edit cell.use(7000/450*10) // And clear up radiation diff --git a/code/game/mecha/components/_component.dm b/code/game/mecha/components/_component.dm index 3d770e0dce0..4058500dd2a 100644 --- a/code/game/mecha/components/_component.dm +++ b/code/game/mecha/components/_component.dm @@ -138,12 +138,26 @@ var/obj/item/stack/nanopaste/NP = W if(integrity < max_integrity) + to_chat(user, "You start to repair damage to \the [src].") while(integrity < max_integrity && NP) - if(do_after(user, 1 SECOND, src) && NP.use(1)) - adjust_integrity(10) + if(do_after(user, 1 SECOND, src)) + NP.use(1) + adjust_integrity(NP.mech_repair) + + if(integrity >= max_integrity) + to_chat(user, "You finish repairing \the [src].") + break + + else if(NP.amount == 0) + to_chat(user, "Insufficient nanopaste to complete repairs!") + break + return + else + to_chat(user, "\The [src] doesn't require repairs.") + return ..() // Various procs to handle different calls by Exosuits. IE, movement actions, damage actions, etc. diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f5821b18d19..1dd50dc0bfe 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1567,15 +1567,27 @@ for(var/slot in internal_components) var/obj/item/mecha_parts/component/C = internal_components[slot] - if(C) + if(!C) + to_chat(user, "There are no components installed!") + return - if(C.integrity < C.max_integrity) - while(C.integrity < C.max_integrity && NP && do_after(user, 1 SECOND, src)) - if(NP.use(1)) - C.adjust_integrity(10) + if(C.integrity >= C.max_integrity) + to_chat(user, "\The [C] does not require repairs.") - to_chat(user, "You repair damage to \the [C].") + else if(C.integrity < C.max_integrity) + to_chat(user, "You start to repair damage to \the [C].") + while(C.integrity < C.max_integrity && NP) + if(do_after(user, 1 SECOND, src)) + NP.use(1) + C.adjust_integrity(NP.mech_repair) + if(C.integrity >= C.max_integrity) + to_chat(user, "You finish repairing \the [C].") + break + + else if(NP.amount == 0) + to_chat(user, "Insufficient nanopaste to complete repairs!") + break return else diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm index cd39b61fef4..d0bd4e80034 100644 --- a/code/game/objects/items/stacks/nanopaste_vr.dm +++ b/code/game/objects/items/stacks/nanopaste_vr.dm @@ -2,6 +2,7 @@ var/restoration_external = 5 var/restoration_internal = 20 var/repair_external = FALSE + var/mech_repair = 10 /obj/item/stack/nanopaste/advanced name = "advanced nanopaste" @@ -10,4 +11,5 @@ icon = 'icons/obj/stacks_vr.dmi' icon_state = "adv_nanopaste" restoration_external = 10 - repair_external = TRUE \ No newline at end of file + repair_external = TRUE + mech_repair = 20 \ No newline at end of file diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index cbfac3ae02e..9f25d74a027 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -17,7 +17,7 @@ center_of_mass = null var/list/datum/stack_recipe/recipes var/singular_name - VAR_PROTECTED/amount = 1 + var/amount = 1 var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount var/stacktype //determines whether different stack types can merge var/build_type = null //used when directly applied to a turf diff --git a/code/game/objects/items/toys/balls_vr.dm b/code/game/objects/items/toys/balls_vr.dm index 6c0b1c25a84..30f2c56d15c 100644 --- a/code/game/objects/items/toys/balls_vr.dm +++ b/code/game/objects/items/toys/balls_vr.dm @@ -48,4 +48,23 @@ name = "purple tennis ball" desc = "A purple tennis ball. Now you've seen everything. Purple, seriously?" icon_state = "tennis_purple" - item_state = "tennis_purple" \ No newline at end of file + item_state = "tennis_purple" + +/obj/item/toy/baseball + name = "baseball" + desc = "A classic baseball; a rubber core surrounded by yarn and covered by faux leather. Getting hit with one is akin to getting punched." + icon = 'icons/obj/balls_vr.dmi' + icon_state = "baseball" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/righthand_balls_vr.dmi', + slot_r_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi', + slot_wear_mask_str = 'icons/mob/mouthball_vr.dmi', + ) + item_state = "baseball" + slot_flags = SLOT_MASK + throw_range = 16 + force = 2.0 + throwforce = 5.0 + throw_speed = 5 + throw_range = 5 + w_class = ITEMSIZE_SMALL \ No newline at end of file diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7e5f8fd0798..62e6bfa9788 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -431,3 +431,44 @@ icon_state = "brainzsnaxred" drop_sound = 'sound/items/drop/soda.ogg' pickup_sound = 'sound/items/pickup/soda.ogg' + +//Candy Bars (1-10) +/obj/item/trash/candy/cb01 + name = "\improper Tau Ceti Bar wrapper" + icon_state = "cb01" + +/obj/item/trash/candy/cb02 + name = "\improper Hundred-Thousand Thaler Bar wrapper" + icon_state = "cb02" + +/obj/item/trash/candy/cb03 + name = "\improper Lars' Saltlakris wrapper" + icon_state = "cb03" + +/obj/item/trash/candy/cb04 + name = "\improper Aerostat Bar wrapper" + icon_state = "cb04" + +/obj/item/trash/candy/cb05 + name = "\improper Andromeda Bar wrapper" + icon_state = "cb05" + +/obj/item/trash/candy/cb06 + name = "\improper Mocha Crunch wrapper" + icon_state = "cb06" + +/obj/item/trash/candy/cb07 + name = "\improper TaroMilk Bar wrapper" + icon_state = "cb07" + +/obj/item/trash/candy/cb08 + name = "\improper Cronk Bar wrapper" + icon_state = "cb08" + +/obj/item/trash/candy/cb09 + name = "\improper Kaju Mamma! Bar wrapper" + icon_state = "cb09" + +/obj/item/trash/candy/cb10 + name = "\improper Shantak Bar wrapper" + icon_state = "cb10" \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index 1a872e99ac0..80c760c3f96 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -6,7 +6,7 @@ item_state = "saddlebag" icon_state = "saddlebag" max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags - slowdown = 1 //And are slower, too... + slowdown = 0.5 //And are slower, too... var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this var/no_message = "You aren't the appropriate taur type to wear this!" @@ -35,7 +35,7 @@ icon_state = "saddlebag" var/icon_base = "saddlebag" max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags - slowdown = 1 //And are slower, too... + slowdown = 0.5 //And are slower, too... var/no_message = "You aren't the appropriate taur type to wear this!" /obj/item/weapon/storage/backpack/saddlebag_common/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index ee28f497b69..3fdba7eaa94 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -5,18 +5,26 @@ * re-implemented in other classes. * * Contains: + * Generic non-item * Trash Bag + * Plastic Bag * Mining Satchel * Plant Bag * Sheet Snatcher + * Sheet Snatcher (Cyborg) * Cash Bag * Chemistry Bag - Food Bag - + * Food Bag + * Food Bag (Service Hound) + * Evidence Bag + * * -Sayu */ -// Generic non-item + +// ----------------------------- +// Generic non-item +// ----------------------------- /obj/item/weapon/storage/bag allow_quick_gather = 1 allow_quick_empty = 1 @@ -67,7 +75,6 @@ // ----------------------------- // Plastic Bag // ----------------------------- - /obj/item/weapon/storage/bag/plasticbag name = "plastic bag" desc = "It's a very flimsy, very noisy alternative to a bag." @@ -85,9 +92,9 @@ // Mining Satchel // ----------------------------- /* - * Mechoid - Orebags are the most common quick-gathering thing, and also have tons of lag associated with it. Their checks are going to be hyper-simplified due to this, and their INCREDIBLY singular target contents. + * Mechoid - Orebags are the most common quick-gathering thing, and also have tons of lag associated with it. + * Their checks are going to be hyper-simplified due to this, and their INCREDIBLY singular target contents. */ - /obj/item/weapon/storage/bag/ore name = "mining satchel" desc = "This little bugger can be used to store and transport ores." @@ -239,25 +246,14 @@ /obj/item/weapon/storage/bag/ore/open(mob/user as mob) //No opening it for the weird UI of having shit-tons of ore inside it. user.examinate(src) -/* -/obj/item/weapon/storage/bag/ore/proc/update_ore_count() //Stolen from ore boxes. OLD way of storing ore. - - stored_ore = list() - - for(var/obj/item/weapon/ore/O in contents) - if(stored_ore[O.name]) - stored_ore[O.name]++ - else - stored_ore[O.name] = 1 -*/ // ----------------------------- // Plant bag // ----------------------------- - /obj/item/weapon/storage/bag/plants name = "plant bag" - icon = 'icons/obj/hydroponics_machines.dmi' + icon = 'icons/obj/hydroponics_machines_vr.dmi' icon_state = "plantbag" + desc = "A sturdy bag used to transport fresh produce with ease." max_storage_space = ITEMSIZE_COST_NORMAL * 25 max_w_class = ITEMSIZE_NORMAL w_class = ITEMSIZE_SMALL @@ -265,8 +261,9 @@ /obj/item/weapon/storage/bag/plants/large name = "large plant bag" - w_class = ITEMSIZE_SMALL - max_storage_space = ITEMSIZE_COST_NORMAL * 45 + icon_state = "large_plantbag" + desc = "A large and sturdy bag used to transport fresh produce with ease." + max_storage_space = ITEMSIZE_COST_NORMAL * 50 // ----------------------------- // Sheet Snatcher @@ -400,24 +397,9 @@ /obj/item/weapon/storage/bag/sheetsnatcher/borg name = "sheet snatcher 9000" - desc = "" + desc = null capacity = 500//Borgs get more because >specialization -// ----------------------------- -// Food Bag (Service Hound) -// ----------------------------- -/obj/item/weapon/storage/bag/dogborg - name = "dog bag" - icon = 'icons/obj/storage.dmi' - icon_state = "foodbag" - desc = "A bag for storing things of all kinds." - max_storage_space = ITEMSIZE_COST_NORMAL * 25 - max_w_class = ITEMSIZE_NORMAL - w_class = ITEMSIZE_SMALL - can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment, - /obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/coin,/obj/item/weapon/spacecash, - /obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/pill) - // ----------------------------- // Cash Bag // ----------------------------- @@ -432,12 +414,12 @@ w_class = ITEMSIZE_SMALL can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash,/obj/item/weapon/spacecasinocash) - // ----------------------------- - // Chemistry Bag - // ----------------------------- +// ----------------------------- +// Chemistry Bag +// ----------------------------- /obj/item/weapon/storage/bag/chemistry name = "chemistry bag" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' icon_state = "chembag" desc = "A bag for storing pills, patches, and bottles." max_storage_space = 200 @@ -445,12 +427,38 @@ slowdown = 3 can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle) - // ----------------------------- - // Food Bag - // ----------------------------- +// ----------------------------- +// Xeno Bag +// ----------------------------- +/obj/item/weapon/storage/bag/xeno + name = "xenobiology bag" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "xenobag" + desc = "A bag for storing various slime products." + max_storage_space = ITEMSIZE_COST_SMALL * 12 + max_w_class = ITEMSIZE_NORMAL + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/slime_extract,/obj/item/slimepotion, /obj/item/weapon/reagent_containers/food/snacks/monkeycube) + +// ----------------------------- +// Virology Bag +// ----------------------------- +/obj/item/weapon/storage/bag/virology + name = "virology bag" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "biobag" + desc = "A bag for storing various biological products." + max_storage_space = ITEMSIZE_COST_SMALL * 12 + max_w_class = ITEMSIZE_NORMAL + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial/,/obj/item/weapon/virusdish/) + +// ----------------------------- +// Food Bag +// ----------------------------- /obj/item/weapon/storage/bag/food name = "food bag" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' icon_state = "foodbag" desc = "A bag for storing foods of all kinds." max_storage_space = ITEMSIZE_COST_NORMAL * 25 @@ -458,16 +466,30 @@ w_class = ITEMSIZE_SMALL can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment) - // ----------------------------- - // Evidence Bag - // ----------------------------- +// ----------------------------- +// Food Bag (Service Hound) +// ----------------------------- +/obj/item/weapon/storage/bag/dogborg + name = "dog bag" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "foodbag" + desc = "An intergrated bag for storing things of all kinds." + max_storage_space = ITEMSIZE_COST_NORMAL * 25 + max_w_class = ITEMSIZE_NORMAL + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment, + /obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/coin,/obj/item/weapon/spacecash, + /obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/pill) + +// ----------------------------- +// Evidence Bag +// ----------------------------- /obj/item/weapon/storage/bag/detective name = "secure satchel" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' icon_state = "detbag" desc = "A bag for storing investigation things. You know, securely." max_storage_space = ITEMSIZE_COST_NORMAL * 15 max_w_class = ITEMSIZE_NORMAL w_class = ITEMSIZE_SMALL - can_hold = list(/obj/item/weapon/forensics/swab,/obj/item/weapon/sample/print,/obj/item/weapon/sample/fibers,/obj/item/weapon/evidencebag) - + can_hold = list(/obj/item/weapon/forensics/swab,/obj/item/weapon/sample/print,/obj/item/weapon/sample/fibers,/obj/item/weapon/evidencebag) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags_vr.dm b/code/game/objects/items/weapons/storage/bags_vr.dm index ccafe5fa635..6f9d0a0b151 100644 --- a/code/game/objects/items/weapons/storage/bags_vr.dm +++ b/code/game/objects/items/weapons/storage/bags_vr.dm @@ -1,15 +1,2 @@ /obj/item/weapon/storage/bag/chemistry slot_flags = null - -/obj/item/weapon/storage/bag/xeno - name = "xenobiology bag" - icon = 'icons/obj/storage.dmi' - icon_state = "chembag" - max_storage_space = ITEMSIZE_COST_SMALL * 12 - max_w_class = ITEMSIZE_NORMAL - w_class = ITEMSIZE_SMALL - can_hold = list( - /obj/item/slime_extract, - /obj/item/slimepotion, - /obj/item/weapon/reagent_containers/food/snacks/monkeycube - ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 13a7d7ca3dd..b18180c3524 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -79,6 +79,8 @@ /obj/item/weapon/storage/fancy/egg_box/open(mob/user as mob) if(open) return + if (isobserver(usr)) + return open = TRUE update_icon() ..() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 579e8a7419a..8feb3b2c92b 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -23,6 +23,7 @@ var/hitcost = 240 var/use_external_power = FALSE //only used to determine if it's a cyborg baton var/grip_safety = TRUE + var/taped_safety = FALSE /obj/item/weapon/melee/baton/New() ..() @@ -100,7 +101,7 @@ /obj/item/weapon/melee/baton/dropped() ..() - if(status && grip_safety) + if(status && grip_safety && !taped_safety) status = 0 visible_message("\The [src]'s grip safety engages!") update_icon() @@ -109,6 +110,8 @@ . = ..() if(Adjacent(user)) + if(taped_safety) + . += "Someone has wrapped tape around the grip!" if(bcell) . += "The baton is [round(bcell.percent())]% charged." if(!bcell) @@ -129,6 +132,17 @@ to_chat(user, "[src] already has a cell.") else to_chat(user, "This cell is not fitted for [src].") + if(istype(W, /obj/item/weapon/tape_roll) || istype(W, /obj/item/taperoll)) + if(grip_safety && !taped_safety) //no point letting people wrap tape around the grips of batons without a safety + to_chat(user, "You firmly wrap tape around the baton's grip, disabling the safety system.") + playsound(src, 'sound/effects/tape.ogg',25) + taped_safety = TRUE + else if(grip_safety && taped_safety) + to_chat(user, "The grip safety has already been taped down.") + if(istype(W, /obj/item/weapon/tool/screwdriver)) + if(taped_safety) + to_chat(user, "You painstakingly scrape away the tape over the grip safety.") + taped_safety = FALSE /obj/item/weapon/melee/baton/attack_hand(mob/user as mob) if(user.get_inactive_hand() == src) diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index a6bc8c7d34e..56366d7cdd9 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -111,6 +111,7 @@ something, make sure it's not in one of the other lists.*/ prob(2);/obj/item/toy/tennis/cyan, prob(2);/obj/item/toy/tennis/blue, prob(2);/obj/item/toy/tennis/purple, + prob(1);/obj/item/toy/baseball, prob(1);/obj/item/pizzavoucher /* VOREStation Edit End */ ) diff --git a/code/game/objects/random/mapping_vr.dm b/code/game/objects/random/mapping_vr.dm index 3075c404154..732d6146017 100644 --- a/code/game/objects/random/mapping_vr.dm +++ b/code/game/objects/random/mapping_vr.dm @@ -156,5 +156,6 @@ prob(2);/obj/item/toy/tennis/blue, prob(2);/obj/item/toy/tennis/purple, prob(2);/obj/item/clothing/ears/earmuffs, - prob(2);/obj/item/clothing/ears/earmuffs/headphones + prob(2);/obj/item/clothing/ears/earmuffs/headphones, + prob(2);/obj/item/toy/baseball ) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index d59bb442ead..4fc7725bf64 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -39,6 +39,14 @@ /obj/item/clothing/shoes/brown, /obj/item/device/radio/headset/headset_qm, //VOREStation Edit, /obj/item/device/radio/headset/headset_qm/alt, //VOREStation Edit, + /obj/item/clothing/under/rank/neo_qm, + /obj/item/clothing/under/rank/neo_qm_skirt, + /obj/item/clothing/under/rank/neo_qm_jacket, + /obj/item/clothing/under/rank/neo_qm_white, + /obj/item/clothing/under/rank/neo_qm_white_skirt, + /obj/item/clothing/under/rank/neo_qm_turtle, + /obj/item/clothing/under/rank/neo_qm_turtle_skirt, + /obj/item/clothing/under/rank/neo_qm_gorka, /obj/item/clothing/gloves/black, /obj/item/clothing/gloves/fingerless, /obj/item/weapon/tank/emergency/oxygen, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 7aa869ac15f..36b00526a85 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -11,6 +11,9 @@ ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, /obj/item/clothing/under/rank/chief_engineer, /obj/item/clothing/under/rank/chief_engineer/skirt, + /obj/item/clothing/under/rank/neo_chiefengi, + /obj/item/clothing/under/rank/neo_chiefengi_skirt, + /obj/item/clothing/under/rank/neo_ce_gorka, /obj/item/clothing/head/hardhat/white, ///obj/item/clothing/head/welding, //VOREStation Removal: Locker bloat, grr. They get fancy goggles or can raid the welding supplies locker for one of these. /obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index e83c3764a8c..8a9bb829995 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -137,6 +137,11 @@ /obj/item/weapon/cartridge/cmo, /obj/item/clothing/gloves/sterile/latex, /obj/item/clothing/shoes/brown, + /obj/item/clothing/under/rank/neo_cmo, + /obj/item/clothing/under/rank/neo_cmo_skirt, + /obj/item/clothing/under/rank/neo_cmo_turtle, + /obj/item/clothing/under/rank/neo_cmo_turtle_skirt, + /obj/item/clothing/under/rank/neo_cmo_gorka, /obj/item/device/radio/headset/heads/cmo, /obj/item/device/radio/headset/heads/cmo/alt, /obj/item/device/flash, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 890a55deab5..81f2911baae 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -35,6 +35,11 @@ /obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/toggle/labcoat/modern, /obj/item/clothing/suit/storage/toggle/labcoat/rd, + /obj/item/clothing/under/rank/neo_rd_turtle, + /obj/item/clothing/under/rank/neo_rd_turtle_skirt, + /obj/item/clothing/under/rank/neo_rd_suit, + /obj/item/clothing/under/rank/neo_rd_suit_skirt, + /obj/item/clothing/under/rank/neo_rd_gorka, /obj/item/weapon/cartridge/rd, /obj/item/clothing/shoes/white, /obj/item/clothing/shoes/laceup/brown, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2b64c20d0f9..b337e0db897 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -49,6 +49,15 @@ /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer/red/skirt, /obj/item/clothing/under/lawyer/oldman, + /obj/item/clothing/under/rank/neo_hop, + /obj/item/clothing/under/rank/neo_hop_skirt, + /obj/item/clothing/under/rank/neo_hop_parade_masc, + /obj/item/clothing/under/rank/neo_hop_parade_fem, + /obj/item/clothing/under/rank/neo_hop_turtle, + /obj/item/clothing/under/rank/neo_hop_turtle_skirt, + /obj/item/clothing/under/rank/neo_cmd_gorka, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_hopformal, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep, /obj/item/clothing/shoes/brown, /obj/item/clothing/shoes/black, /obj/item/clothing/shoes/laceup, @@ -133,6 +142,13 @@ /obj/item/clothing/head/helmet/dermal, /obj/item/clothing/head/helmet/warden, /obj/item/clothing/head/helmet/warden/hat, + /obj/item/clothing/under/rank/neo_warden_red, + /obj/item/clothing/under/rank/neo_warden_red_skirt, + /obj/item/clothing/under/rank/neo_warden_blue, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_bluewarden, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_warden_heavy, + /obj/item/clothing/under/rank/neo_sec_gorka, /obj/item/weapon/cartridge/security, /obj/item/device/radio/headset/headset_sec, /obj/item/device/radio/headset/headset_sec/alt, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm index 0bad0521c1b..3ab22cc1f4c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm @@ -13,6 +13,22 @@ /obj/item/clothing/suit/storage/vest/hoscoat/jensen/alt, /obj/item/clothing/suit/storage/vest/hoscoat/jensen, /obj/item/clothing/suit/storage/vest/hoscoat, + /obj/item/clothing/under/rank/neo_hos_red, + /obj/item/clothing/under/rank/neo_hos_red_skirt, + /obj/item/clothing/under/rank/neo_hos_blackred, + /obj/item/clothing/under/rank/neo_hos_blackred_skirt, + /obj/item/clothing/under/rank/neo_hos_parade, + /obj/item/clothing/under/rank/neo_hos_parade_fem, + /obj/item/clothing/under/rank/neo_hos_blue, + /obj/item/clothing/under/rank/neo_hos_blackblue, + /obj/item/clothing/under/rank/neo_hos_blackblue_skirt, + /obj/item/clothing/under/rank/neo_hos_parade_blue, + /obj/item/clothing/under/rank/neo_hos_parade_blue_fem, + /obj/item/clothing/under/rank/neo_hos_gorka, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_hos_parade, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_hosformal_blue, + /obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench, + /obj/item/clothing/head/helmet/HoS/hat/blue, /obj/item/clothing/head/helmet/dermal, /obj/item/device/radio/headset/heads/hos, /obj/item/device/radio/headset/heads/hos/alt, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index d72db42995a..ac03b1c209f 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -463,6 +463,12 @@ /obj/item/clothing/head/caphat/beret, /obj/item/clothing/under/rank/captain, /obj/item/clothing/under/dress/dress_cap/femformal, + /obj/item/clothing/under/rank/neo_captain_parade, + /obj/item/clothing/under/rank/neo_captain_skirt, + /obj/item/clothing/under/rank/neo_captain, + /obj/item/clothing/under/rank/neo_captain_kilt, + /obj/item/clothing/under/rank/neo_captain_blacksuit, + /obj/item/clothing/under/rank/neo_commandutil, /obj/item/clothing/shoes/brown, /obj/item/clothing/gloves/captain, /obj/item/clothing/under/dress/dress_cap, diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index 054da3a31dc..1da8e0a1596 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -242,6 +242,7 @@ prob(2);/obj/item/toy/tennis/cyan, prob(2);/obj/item/toy/tennis/blue, prob(2);/obj/item/toy/tennis/purple, + prob(1);/obj/item/toy/baseball, prob(1);/obj/item/weapon/storage/box/brainzsnax, prob(1);/obj/item/weapon/storage/box/brainzsnax/red, prob(1);/obj/item/clothing/glasses/sunglasses, diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index 7afc90d082e..c700e2ba93b 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -14,6 +14,7 @@ S["tgui_fancy"] >> pref.tgui_fancy S["tgui_lock"] >> pref.tgui_lock S["tgui_input_mode"] >> pref.tgui_input_mode + S["tgui_input_lock"] >> pref.tgui_input_lock S["tgui_large_buttons"] >> pref.tgui_large_buttons S["tgui_swapped_buttons"] >> pref.tgui_swapped_buttons @@ -29,6 +30,7 @@ S["tgui_fancy"] << pref.tgui_fancy S["tgui_lock"] << pref.tgui_lock S["tgui_input_mode"] << pref.tgui_input_mode + S["tgui_input_lock"] << pref.tgui_input_lock S["tgui_large_buttons"] << pref.tgui_large_buttons S["tgui_swapped_buttons"] << pref.tgui_swapped_buttons @@ -44,6 +46,7 @@ pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy)) pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock)) pref.tgui_input_mode = sanitize_integer(pref.tgui_input_mode, 0, 1, initial(pref.tgui_input_mode)) + pref.tgui_input_lock = sanitize_integer(pref.tgui_input_lock, 0, 1, initial(pref.tgui_input_lock)) pref.tgui_large_buttons = sanitize_integer(pref.tgui_large_buttons, 0, 1, initial(pref.tgui_large_buttons)) pref.tgui_swapped_buttons = sanitize_integer(pref.tgui_swapped_buttons, 0, 1, initial(pref.tgui_swapped_buttons)) @@ -56,9 +59,10 @@ . += "Client FPS: [pref.client_fps]
" . += "Random Ambience Frequency: [pref.ambience_freq]
" . += "Ambience Chance: [pref.ambience_chance]
" - . += "tgui Window Mode: [(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
" - . += "tgui Window Placement: [(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"]
" + . += "TGUI Window Mode: [(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
" + . += "TGUI Window Placement: [(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"]
" . += "TGUI Input Framework: [(pref.tgui_input_mode) ? "Enabled" : "Disabled (default)"]
" + . += "TGUI Input Lock: [(pref.tgui_input_lock) ? "Enabled" : "Disabled (default)"]
" . += "TGUI Large Buttons: [(pref.tgui_large_buttons) ? "Enabled (default)" : "Disabled"]
" . += "TGUI Swapped Buttons: [(pref.tgui_swapped_buttons) ? "Enabled" : "Disabled (default)"]
" if(can_select_ooc_color(user)) @@ -107,14 +111,14 @@ if(pref.client) pref.client.fps = fps_new return TOPIC_REFRESH - + else if(href_list["select_ambience_freq"]) var/ambience_new = tgui_input_number(user, "Input how often you wish to hear ambience repeated! (1-60 MINUTES, 0 for disabled)", "Global Preference", pref.ambience_freq, 60, 0) if(isnull(ambience_new) || !CanUseTopic(user)) return TOPIC_NOACTION if(ambience_new < 0 || ambience_new > 60) return TOPIC_NOACTION pref.ambience_freq = ambience_new return TOPIC_REFRESH - + else if(href_list["select_ambience_chance"]) var/ambience_chance_new = tgui_input_number(user, "Input the chance you'd like to hear ambience played to you (On area change, or by random ambience). 35 means a 35% chance to play ambience. This is a range from 0-100. 0 disables ambience playing entirely. This is also affected by Ambience Frequency.", "Global Preference", pref.ambience_freq, 100, 0) if(isnull(ambience_chance_new) || !CanUseTopic(user)) return TOPIC_NOACTION @@ -125,7 +129,7 @@ else if(href_list["tgui_fancy"]) pref.tgui_fancy = !pref.tgui_fancy return TOPIC_REFRESH - + else if(href_list["tgui_lock"]) pref.tgui_lock = !pref.tgui_lock return TOPIC_REFRESH @@ -134,6 +138,10 @@ pref.tgui_input_mode = !pref.tgui_input_mode return TOPIC_REFRESH + else if(href_list["tgui_input_lock"]) + pref.tgui_input_lock = !pref.tgui_input_lock + return TOPIC_REFRESH + else if(href_list["tgui_large_buttons"]) pref.tgui_large_buttons = !pref.tgui_large_buttons return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 3e5d539a860..4479f4fd2c1 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -501,6 +501,12 @@ ckeywhitelist = list("hunterbirk") character_name = list("Amaryll") +/datum/gear/fluff/aria_conduct_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Aria's Distinguished Conduct Medal" + ckeywhitelist = list("hunterbirk") + character_name = list("Aria Blue") + // I CKEYS /datum/gear/fluff/ruda_badge path = /obj/item/clothing/accessory/badge/holo/detective/ruda diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 13d2f7e50d3..156b5a4c87a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -313,6 +313,26 @@ ..() gear_tweaks += gear_tweak_free_color_choice +/datum/gear/suit/ranger_poncho + display_name = "ranger poncho selection" + path = /obj/item/clothing/accessory/poncho/roles/ranger + cost = 1 + +/datum/gear/suit/ranger_poncho/New() + ..() + var/list/ranger_ponchos = list( + "red ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger, + "tan ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/tan, + "gray ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/gray, + "green ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/green, + "blue ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/blue, + "purple ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/purple, + "orange ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/orange, + "charcoal ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/charcoal, + "white ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/snow + ) + gear_tweaks += new/datum/gear_tweak/path(ranger_ponchos) + /datum/gear/suit/unathi_robe display_name = "roughspun robe" path = /obj/item/clothing/suit/unathi/robe diff --git a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm new file mode 100644 index 00000000000..28ca463500f --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm @@ -0,0 +1,592 @@ +//template for quickly making more, if it's ever needed +/* + +/datum/gear/uniform/BLANK_selector + display_name = "DEPT - BLANK's Uniforms" + description = "Select from a range of outfits available to all BLANK personnel." + allowed_roles = list("") + path = + slot = slot_w_uniform + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/BLANK_selector/New() + ..() + var/list/selector_uniforms = list( + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) +*/ + +//Command/Specific + +/datum/gear/uniform/site_manager_selector + display_name = "Command - Site Manager's Uniforms" + description = "Select from a range of outfits available to all Site Managers." + allowed_roles = list("Site Manager") + path = /obj/item/clothing/under/rank/neo_captain + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/site_manager_selector/New() + ..() + var/list/selector_uniforms = list( + "uniform w/ dress"=/obj/item/clothing/under/dress/dress_cap, + "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "voidsuit underlayer"=/obj/item/clothing/under/undersuit/command, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_captain, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_captain_skirt, + "TG&C utility suit"=/obj/item/clothing/under/rank/neo_commandutil, + "TG&C black suit"=/obj/item/clothing/under/rank/neo_captain_blacksuit, + "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_captain_parade, + "TG&C jumpkilt"=/obj/item/clothing/under/rank/neo_captain_kilt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmd_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/head_of_personnel_selector + display_name = "Command - Head of Personnel's Uniforms" + description = "Select from a range of outfits available to all Heads of Personnel." + allowed_roles = list("Head of Personnel") + path = /obj/item/clothing/under/rank/neo_hop + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/head_of_personnel_selector/New() + ..() + var/list/selector_uniforms = list( + "uniform w/ dress"=/obj/item/clothing/under/dress/dress_hop, + "HR director"=/obj/item/clothing/under/dress/dress_hr, + "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "voidsuit underlayer"=/obj/item/clothing/under/undersuit/command, + "TG&C command utility"=/obj/item/clothing/under/rank/neo_commandutil, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_hop, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_hop_skirt, + "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_hop_parade_masc, + "TG&C parade dress"=/obj/item/clothing/under/rank/neo_hop_parade_fem, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_hop_turtle, + "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_hop_turtle_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmd_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/pilot_uniform_selector + display_name = "Civilian - Pilot's Uniforms" + description = "Select from a range of outfits available to all Pilots." + allowed_roles = list("Pilot") + path = /obj/item/clothing/under/rank/neo_pilot + sort_category = "Uniform Selectors" + cost = 1 + +/datum/gear/uniform/pilot_uniform_selector/New() + ..() + var/list/selector_uniforms = list( + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_pilot, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_pilot_skirt, + "Major Bill's flightsuit"=/obj/item/clothing/under/mbill_flight, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_pilot_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/janitor_uniform_selector + display_name = "Civilian - Janitor's Uniforms" + description = "Select from a range of outfits available to all Janitorial personnel." + allowed_roles = list("Janitor") + path = /obj/item/clothing/under/rank/neo_janitor + sort_category = "Uniform Selectors" + cost = 1 + +/datum/gear/uniform/janitor_uniform_selector/New() + ..() + var/list/selector_uniforms = list( + "TG&C janitor's uniform"=/obj/item/clothing/under/rank/neo_janitor, + "TG&C janitor's uniform w/ skirt"=/obj/item/clothing/under/rank/neo_janitor_skirt + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/civvie_uniform_selector + display_name = "Civilian - Basic Uniforms" + description = "Select from a range of uniforms available to all personnel. Includes miscellaneous corporate contractor uniforms." + path = /obj/item/clothing/under/utility/grey + sort_category = "Uniform Selectors" + cost = 1 + +/datum/gear/uniform/civvie_uniform_selector/New() + ..() + var/list/selector_uniforms = list( + "KHI uniform"=/obj/item/clothing/under/rank/khi/civ, + "TG&C plain turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck, + "TG&C plain turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_turtleskirt, + "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck_blue, + "TG&C blue turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue, + "TG&C red turtleneck"=/obj/item/clothing/under/rank/neo_suspicious_turtleneck, + "TG&C red turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspicious_turtleskirt, + "TG&C comfy overalls"=/obj/item/clothing/under/rank/neo_suspect_overalls, + "TG&C comfy overalls w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_overalls_skirt, + "TG&C contractor's suit"=/obj/item/clothing/under/rank/neo_contract, + "Corporate, Major Bill's uniform"=/obj/item/clothing/under/mbill, + "Corporate, Aether Atmospherics uniform"=/obj/item/clothing/under/corp/aether, + "Corporate, Focal Point Energistics uniform"=/obj/item/clothing/under/corp/focal, + "Corporate, Grayson Manufactories uniform"=/obj/item/clothing/under/corp/grayson, + "Corporate, Grayson Manufactories jumpsuit"=/obj/item/clothing/under/corp/grayson_jump, + "Corporate, Ward-Takahashi uniform"=/obj/item/clothing/under/corp/wardt, + "Corporate, Hephaestus Arms uniform"=/obj/item/clothing/under/corp/hephaestus, + "Corporate, Centauri Provisions uniform"=/obj/item/clothing/under/corp/centauri, + "Corporate, Morpheus Cyberkinetics uniform"=/obj/item/clothing/under/corp/morpheus, + "Corporate, Wulf Aeronautics uniform"=/obj/item/clothing/under/corp/wulf, + "Corporate, Zeng-Hu uniform"=/obj/item/clothing/under/corp/zenghu, + "Corporate, Xion Manufacturing uniform"=/obj/item/clothing/under/corp/xion, + "Galactic Survey utility uniform"=/obj/item/clothing/under/gsa, + "Galactic Survey reinforced uniform"=/obj/item/clothing/under/gsa_work, + "Utility uniform, black"=/obj/item/clothing/under/utility, + "Utility uniform, navy"=/obj/item/clothing/under/utility/blue, + "Utility uniform, grey"=/obj/item/clothing/under/utility/grey, + "Utility uniform, tan"=/obj/item/clothing/under/utility/tan, + "Utility uniform, green"=/obj/item/clothing/under/utility/green, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_civvie_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +//Security + +/datum/gear/uniform/security_selector + display_name = "Security - Basic Uniforms" + description = "Select from a range of outfits available to all Security personnel." + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") + path = /obj/item/clothing/under/rank/security/corp + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/security_selector/New() + ..() + var/list/selector_uniforms = list( + "undersuit, modernized"=/obj/item/clothing/under/rank/security/modern, + "KHI uniform"=/obj/item/clothing/under/rank/khi/sec, + "voidsuit underlayer"=/obj/item/clothing/under/undersuit/sec, + "skirt"=/obj/item/clothing/under/rank/security/skirt, + "turtleneck"=/obj/item/clothing/under/rank/security/turtleneck, + "corporate"=/obj/item/clothing/under/rank/security/corp, + "formal, navy"=/obj/item/clothing/under/rank/security/navyblue, + "formal, tan"=/obj/item/clothing/under/rank/security/tan, + "Proxima Centauri Risk Control"=/obj/item/clothing/under/corp/pcrc, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_sec_red, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_sec_red_skirt, + "TG&C blue jumpsuit"=/obj/item/clothing/under/rank/neo_sec_blue, + "TG&C white"=/obj/item/clothing/under/rank/neo_sec_suit, + "TG&C blue"=/obj/item/clothing/under/rank/neo_sec_suit_blue, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_sec_turtle_red, + "TG&C turtleneck & skirt"=/obj/item/clothing/under/rank/neo_sec_turtle_red_skirt, + "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_sec_turtle_blue, + "TG&C blue turtleneck & skirt"=/obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt, + "corrections officer"=/obj/item/clothing/under/rank/neo_corrections, + "corrections officer w/ skirt"=/obj/item/clothing/under/rank/neo_corrections_skirt, + "runner's turtleneck"=/obj/item/clothing/under/rank/neo_runner, + "ST: Original Series Ops"=/obj/item/clothing/under/rank/trek/engsec, + "ST: Next Generation Ops"=/obj/item/clothing/under/rank/trek/engsec/next, + "ST: Voyager Ops"=/obj/item/clothing/under/rank/trek/engsec/voy, + "ST: DS9 Ops"=/obj/item/clothing/under/rank/trek/engsec/ds9, + "ST: Enterprise Ops"=/obj/item/clothing/under/rank/trek/engsec/ent, + "TG&C bodyguard's suit"=/obj/item/clothing/under/rank/bodyguard_suit, + "TG&C bodyguard's skirt"=/obj/item/clothing/under/rank/bodyguard_skirt, + "TG&C bodyguard's turtleneck"=/obj/item/clothing/under/rank/bodyguard_turtleneck, + "TG&C bodyguard's turtleneck w/ skirt"=/obj/item/clothing/under/rank/bodyguard_turtleskirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_sec_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/security_warden_selector + display_name = "Security - Warden's Uniforms" + description = "Select from a range of outfits available to Wardens." + allowed_roles = list("Head of Security","Warden") + path = /obj/item/clothing/under/rank/warden/corp + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/security_warden_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/warden/skirt, + "corporate"=/obj/item/clothing/under/rank/warden/corp, + "formal, navy"=/obj/item/clothing/under/rank/warden/navyblue, + "formal, tan"=/obj/item/clothing/under/rank/warden/navyblue, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_warden_red, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_warden_red_skirt, + "TG&C blue jumpsuit"=/obj/item/clothing/under/rank/neo_warden_blue + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/security_detective_selector + display_name = "Security - Detective's Uniforms" + description = "Select from a range of outfits available to all Detectives." + allowed_roles = list("Head of Security","Detective") + path = /obj/item/clothing/under/det/corporate + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/security_detective_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/det/skirt, + "corporate"=/obj/item/clothing/under/det/corporate + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/security_head_selector + display_name = "Security - Head's Uniforms" + description = "Select from a range of outfits available to all Heads of Security." + allowed_roles = list("Head of Security") + path = /obj/item/clothing/under/rank/head_of_security/corp + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/security_head_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/head_of_security/skirt, + "corporate"=/obj/item/clothing/under/rank/head_of_security/corp, + "formal, navy"=/obj/item/clothing/under/rank/head_of_security/navyblue, + "formal, tan"=/obj/item/clothing/under/rank/head_of_security/tan, + "voidsuit underlayer"=/obj/item/clothing/under/undersuit/sec/hos, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_hos_red, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_hos_red_skirt, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_hos_blackred, + "TG&C turtleneck & skirt"=/obj/item/clothing/under/rank/neo_hos_blackred_skirt, + "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_hos_parade, + "TG&C parade uniform, feminine"=/obj/item/clothing/under/rank/neo_hos_parade_fem, + "TG&C blue"=/obj/item/clothing/under/rank/neo_hos_blue, + "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_hos_blackblue, + "TG&C blue turtleneck & skirt"=/obj/item/clothing/under/rank/neo_hos_blackblue_skirt, + "TG&C blue parade uniform"=/obj/item/clothing/under/rank/neo_hos_parade_blue, + "TG&C blue parade uniform, feminine"=/obj/item/clothing/under/rank/neo_hos_parade_blue_fem, + "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_hos_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +//Cargo + +/datum/gear/uniform/quartermaster_selector + display_name = "Cargo - Quartermaster's Uniforms" + description = "Select from a range of outfits available to all Quartermasters." + allowed_roles = list("Quartermaster") + path = /obj/item/clothing/under/rank/cargo/jeans + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/quartermaster_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/cargo/skirt, + "jeans"=/obj/item/clothing/under/rank/cargo/jeans, + "jeans, feminine cut"=/obj/item/clothing/under/rank/cargo/jeans/female, + "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_qm, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_qm_skirt, + "TG&C casualwear"=/obj/item/clothing/under/rank/neo_qm_jacket, + "TG&C button-up"=/obj/item/clothing/under/rank/neo_qm_white, + "TG&C button-up w/ skirt"=/obj/item/clothing/under/rank/neo_qm_white_skirt, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_qm_turtle, + "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_qm_turtle_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_qm_gorka, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/cargo_general_selector + display_name = "Cargo - Basic Uniforms" + description = "Select from a range of outfits available to all Cargo personnel." + allowed_roles = list("Cargo Technician","Shaft Miner","Quartermaster") + path = /obj/item/clothing/under/rank/cargotech/jeans + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/cargo_general_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/cargotech/skirt, + "jeans"=/obj/item/clothing/under/rank/cargotech/jeans, + "jeans, feminine cut"=/obj/item/clothing/under/rank/cargotech/jeans/female, + "KHI uniform"=/obj/item/clothing/under/rank/khi/crg, + "TG&C shorts"=/obj/item/clothing/under/rank/neo_cargo_shorts, + "TG&C skirt"=/obj/item/clothing/under/rank/neo_cargo_skirt, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_cargo, + "TG&C utility uniform"=/obj/item/clothing/under/rank/neo_util_cargo, + "TG&C dark"=/obj/item/clothing/under/rank/neo_cargo_dark, + "TG&C casual"=/obj/item/clothing/under/rank/neo_cargo_casual, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_cargo_turtle, + "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_cargo_turtle_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cargo_gorka, + "customs officer"=/obj/item/clothing/under/rank/neo_cargo_customs + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/cargo_miner_selector + display_name = "Cargo - Miner's Uniforms" + description = "Select from a range of outfits available to all Mining personnel." + allowed_roles = list("Shaft Miner","Quartermaster") + path = /obj/item/clothing/under/rank/neo_miner + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/cargo_miner_selector/New() + ..() + var/list/selector_uniforms = list( + "TG&C miner's uniform"=/obj/item/clothing/under/rank/neo_miner, + "TG&C hunter's uniform"=/obj/item/clothing/under/rank/neo_miner_fauna + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +//Engineering + +/datum/gear/uniform/engineering_chief_selector + display_name = "Engineering - Chief Engineer's Uniforms" + description = "Select from a range of outfits available to all Chief Engineers." + allowed_roles = list("Chief Engineer") + path = /obj/item/clothing/under/rank/neo_chiefengi + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/engineering_chief_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/chief_engineer/skirt, + "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_chiefengi, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_chiefengi_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_ce_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/engineer_selector + display_name = "Engineering - Basic Uniforms" + description = "Select from a range of outfits available to all Engineering personnel." + allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician") + path = /obj/item/clothing/under/rank/neo_engi + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/engineer_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/engineer/skirt, + "turtleneck"=/obj/item/clothing/under/rank/engineer/turtleneck, + "KHI uniform"=/obj/item/clothing/under/rank/khi/eng, + "ST: Original Series Ops"=/obj/item/clothing/under/rank/trek/engsec, + "ST: Next Generation Ops"=/obj/item/clothing/under/rank/trek/engsec/next, + "ST: Voyager Ops"=/obj/item/clothing/under/rank/trek/engsec/voy, + "ST: DS9 Ops"=/obj/item/clothing/under/rank/trek/engsec/ds9, + "ST: Enterprise Ops"=/obj/item/clothing/under/rank/trek/engsec/ent, + "voidsuit underlayer"=/obj/item/clothing/under/undersuit/hazard, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_engi, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_engi_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_engi_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/engi_atmos_selector + display_name = "Engineering - Atmos Tech's Uniforms" + description = "Select from a range of outfits available to all Atmospherics Technicians." + allowed_roles = list("Chief Engineer","Atmospheric Technician") + path = /obj/item/clothing/under/rank/atmospheric_technician/skirt + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/engi_atmos_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/atmospheric_technician/skirt, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_atmos, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_atmos_skirt + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +//Medical + +/datum/gear/uniform/medical_selector + display_name = "Medical - Basic Uniforms" + description = "Select from a range of outfits available to all Medical personnel." + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") + path = /obj/item/clothing/under/rank/neo_med + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/medical_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/medical/skirt, + "virologist skirt"=/obj/item/clothing/under/rank/virologist/skirt, + "turtleneck"=/obj/item/clothing/under/rank/medical/turtleneck, + "vey-medical jumpsuit"=/obj/item/clothing/under/corp/veymed, + "KHI uniform"=/obj/item/clothing/under/rank/khi/med, + "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci, + "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next, + "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy, + "ST: DS9 Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ds9, + "ST: Enterprise Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ent, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_med, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_med_skirt, + "TG&C virology jumpsuit"=/obj/item/clothing/under/rank/neo_viro, + "TG&C virology jumpskirt"=/obj/item/clothing/under/rank/neo_viro_skirt, + "TG&C dark jumpsuit"=/obj/item/clothing/under/rank/neo_med_dark, + "TG&C dark jumpskirt"=/obj/item/clothing/under/rank/neo_med_dark_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_med_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/chemist_selector + display_name = "Medical - Chemist's Uniforms" + description = "Select from a range of outfits available to all Chemists." + allowed_roles = list("Chief Medical Officer","Chemist") + path = /obj/item/clothing/under/rank/neo_chem + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/chemist_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/chemist/skirt, + "TG&C chemist's jumpsuit"=/obj/item/clothing/under/rank/neo_chem, + "TG&C chemist's jumpskirt"=/obj/item/clothing/under/rank/neo_chem_skirt, + "TG&C pharmacy jumpsuit"=/obj/item/clothing/under/rank/neo_pharma, + "TG&C pharmacy jumpskirt"=/obj/item/clothing/under/rank/neo_pharma_skirt + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/paramedic_selector + display_name = "Medical - Paramedic's Uniforms" + description = "Select from a range of outfits available to all Paramedics." + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + path = /obj/item/clothing/under/rank/paramedunidark + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/paramedic_selector/New() + ..() + var/list/selector_uniforms = list( + "dark"=/obj/item/clothing/under/rank/paramedunidark, + "dark w/ skirt"=/obj/item/clothing/under/rank/parameduniskirtdark, + "light"=/obj/item/clothing/under/rank/paramedunilight, + "light w/ skirt"=/obj/item/clothing/under/rank/parameduniskirtlight, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_para, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_para_skirt, + "TG&C light jumpsuit"=/obj/item/clothing/under/rank/neo_para_light, + "TG&C light jumpskirt"=/obj/item/clothing/under/rank/neo_para_light_skirt + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/chief_medical_selector + display_name = "Medical - Chief Medical Officer's Uniforms" + description = "Select from a range of outfits available to all Chief Medical Officers." + allowed_roles = list("Chief Medical Officer") + path = /obj/item/clothing/under/rank/neo_cmo + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/chief_medical_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/chief_medical_officer/skirt, + "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_cmo, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_cmo_skirt, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_cmo_turtle, + "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_cmo_turtle_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmo_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +//Science + +/datum/gear/uniform/research_director_selector + display_name = "Science - Research Director's Uniforms" + description = "Select from a range of outfits available to all Research Directors." + allowed_roles = list("Research Director") + path = /obj/item/clothing/under/rank/neo_rd_suit + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/research_director_selector/New() + ..() + var/list/selector_uniforms = list( + "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, + "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, + "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, + "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9, + "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_rd_suit, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_rd_suit_skirt, + "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_rd_turtle, + "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_rd_turtle_skirt, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_rd_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/science_dept_selector + display_name = "Science - Basic Uniforms" + description = "Select from a range of outfits available to all Science personnel." + allowed_roles = list("Scientist","Research Director","Roboticist","Xenobiologist","Xenobotanist") + path = /obj/item/clothing/under/rank/neo_science + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/science_dept_selector/New() + ..() + var/list/selector_uniforms = list( + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_science, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_science_skirt, + "TG&C utility"=/obj/item/clothing/under/rank/neo_util_sci, + "KHI uniform"=/obj/item/clothing/under/rank/khi/sci, + "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci, + "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next, + "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy, + "ST: DS9 Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ds9, + "ST: Enterprise Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ent, + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_sci_gorka + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/uniform/science_robotics_selector + display_name = "Science - Roboticist's Uniforms" + description = "Select from a range of outfits available to all Roboticists." + allowed_roles = list("Research Director","Roboticist") + path = /obj/item/clothing/under/rank/neo_robo + sort_category = "Uniform Selectors" + cost = 2 + +/datum/gear/uniform/science_robotics_selector/New() + ..() + var/list/selector_uniforms = list( + "skirt"=/obj/item/clothing/under/rank/roboticist/skirt, + "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_robo, + "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_robo_skirt + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c5e3200a2bf..db1e8fda212 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -29,6 +29,7 @@ var/list/preferences_datums = list() var/tgui_fancy = TRUE var/tgui_lock = FALSE var/tgui_input_mode = FALSE // All the Input Boxes (Text,Number,List,Alert) + var/tgui_input_lock = FALSE var/tgui_large_buttons = TRUE var/tgui_swapped_buttons = FALSE diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index fa84a8c8ec7..ec4e6ca70bf 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -343,9 +343,31 @@ BLIND // can't see anything icon_state = "aviator" /obj/item/clothing/glasses/sunglasses/bigshot - name = "big shot's glasses" - desc = "A pair of glasses to help you feel more like a \[BIG SHOT]." - icon_state = "bigshot" + name = "colored glasses" + desc = "A pair of glasses with uniquely colored lenses to make you feel like a \[BIG SHOT]." + description_fluff = "A prototype model of the AR glasses which focused on stylization and \ + functionality. The concept never caught on and was replaced with the earlier rendition of \ + the modern AR glasses. These have quite clearly seen better days as the AR function no \ + longer works, the toggle merely obscuring the users vison." + icon_state = "salesman" + var/ar = 0 + +/obj/item/clothing/glasses/sunglasses/bigshot/examine(mob/user as mob) + . = ..() + . += to_chat(usr, "Alt-click to toggle modes") + +/obj/item/clothing/glasses/sunglasses/bigshot/AltClick() + set src in usr + if(usr.canmove && !usr.stat && !usr.restrained()) + if(src.ar) + src.ar = !src.ar + icon_state = initial(icon_state) + to_chat(usr, "You press a small button on \the [src] and deactivate the AR mode.") + else + src.ar = !src.ar + icon_state = "[initial(icon_state)]_fzz" + to_chat(usr, "You press a small button on \the [src] and activate the AR mode.") + update_clothing_icon() /obj/item/clothing/glasses/welding name = "welding goggles" diff --git a/code/modules/clothing/head/neohats.dm b/code/modules/clothing/head/neohats.dm new file mode 100644 index 00000000000..bfc675c5ebf --- /dev/null +++ b/code/modules/clothing/head/neohats.dm @@ -0,0 +1,45 @@ +/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes. +this file deals with hats/headwear. */ + +/obj/item/clothing/head/helmet/HoS/hat/blue + name = "Blue Head of Security Hat" + desc = "The hat of the Head of Security. For showing the officers who's in charge." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_hoshat_blue" + valid_accessory_slots = null + +/obj/item/clothing/head/soft/neo_softcap + name = "suspect softcap" + desc = "a dark-colored softcap." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_softcap" + +/obj/item/clothing/head/neo_irs + name = "IRS cap" + desc = "a blue cap with the letters 'IRS' emblazoned on the front." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_irs" + +/obj/item/clothing/head/ushanka/neo_ushanka + name = "Ushanka" + desc = "an old beat-up ushanka." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_ushanka" + +/obj/item/clothing/head/ushanka/neo_ushanka_blue + name = "Blue Ushanka" + desc = "a light-blue ushanka." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_blue_ushanka" + +/obj/item/clothing/head/papakha + name = "Papakha" + desc = "an old beat-up Papakha." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_papakha" + +/obj/item/clothing/head/papakha_white + name = "White Papakha" + desc = "an old beat-up white papakha." + icon = 'icons/inventory/head/item.dmi' + icon_state = "neo_papakha_white" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index c3bdad4e4ea..bbf0809bc4b 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -98,6 +98,7 @@ name = "shipping cap" desc = "It's a ballcap bearing the colors of Major Bill's Shipping." icon_state = "mbillsoft" + item_state_slots = list(slot_r_hand_str = "redsoft", slot_l_hand_str = "redsoft") catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills) /obj/item/clothing/head/soft/med diff --git a/code/modules/clothing/shoes/neoshoes.dm b/code/modules/clothing/shoes/neoshoes.dm new file mode 100644 index 00000000000..1174827930b --- /dev/null +++ b/code/modules/clothing/shoes/neoshoes.dm @@ -0,0 +1,14 @@ +/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes. +this file deals with shoes/footwear. */ + +/obj/item/clothing/shoes/boots/jackboots/white + name = "white jackboots" + desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "neo_jack_white" + icon = 'icons/inventory/feet/item.dmi' + +/obj/item/clothing/shoes/boots/jackboots/silver + name = "silver jackboots" + desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "neo_jack_silver" + icon = 'icons/inventory/feet/item.dmi' diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm index a55d6ff93d5..bfdaea02229 100644 --- a/code/modules/clothing/suits/armor_vr.dm +++ b/code/modules/clothing/suits/armor_vr.dm @@ -169,3 +169,10 @@ /obj/item/clothing/suit/armor/combat/crusader_explo/FM name = "field medic low tech suit" icon_state = "crusader_explo/FM" + +// martian miner coat +/obj/item/clothing/suit/storage/vest/martian_miner + name = "martian miner's coat" + desc = "A sturdy, rugged coat once favoured by miners on Mars. These coats became strongly associated with early Martian Independence movements as a result, and remain moderately popular amongst members of the Third Ares Confederation." + icon_state = "martian_miner" + armor = list(melee = 25, bullet = 15, laser = 15, energy = 0, bomb = 25, bio = 0, rad = 0) \ No newline at end of file diff --git a/code/modules/clothing/suits/neosuits.dm b/code/modules/clothing/suits/neosuits.dm new file mode 100644 index 00000000000..5f70441870e --- /dev/null +++ b/code/modules/clothing/suits/neosuits.dm @@ -0,0 +1,159 @@ +/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes. +this file deals with suits/overwear. */ + +// labcoats + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_emt + name = "EMT jacket" + desc = "A dark blue labcoat with reflective strips for emergency medical technicians." + icon_state = "neo_emt" + item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat") + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_robo_coat + name = "robotics labcoat" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_robo_coat" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat + name = "long labcoat" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_labcoat" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_highvis + name = "high visibility jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_coat_highvis" + item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat") + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_redemt + name = "red EMT jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_redemt" + item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat") + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_blueemt + name = "dark blue EMT jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_blueemt" + item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat") + +// generic labcoat subtypes + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_hos_parade + name = "head of security's parade jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_hos_parade" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_engi_dep + name = "engineer's department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_engi_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_cargo_dep + name = "cargo department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_cargo_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_sci_dep + name = "science department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_sci_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_med_dep + name = "medical department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_med_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_blue_dep + name = "blue security department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_sec_blue_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_red_dep + name = "red security department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_sec_red_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep + name = "off-duty department jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_civ_dep" + + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_police + name = "traffic officer's jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_police" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_ranger + name = "ranger's cloak" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_ranger" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_bodyguard_dep + name = "bodyguard's jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_bodyguard_dep" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_hopformal + name = "hop's formal jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_hopformal" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_bluemed + name = "paramedic's jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_bluemed" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_hosformal_blue + name = "head of security's blue formal jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_hosformal_blue" + +/obj/item/clothing/suit/storage/toggle/labcoat/neo_leather + name = "leather hoodie" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_leather" + +// non transforming coats + +/obj/item/clothing/suit/neo_gorka + name = "gorka jacket" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_gorka" + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/neo_gorka_cargo + name = "cargo gorka" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_gorka_cargo" + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/neo_runner_coat + name = "runner's coat" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_runner_coat" + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/neo_medical_coat + name = "medical coat" + desc = "it bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_medical_coat" + body_parts_covered = UPPER_TORSO|ARMS + +// non-transforming armoured coats with storage + +/obj/item/clothing/suit/storage/vest/wardencoat/neo_bluewarden + name = "blue warden's jacket" + desc = "A common style of warden's jacket with armour vest, but in blue. It bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_bluewarden" + +/obj/item/clothing/suit/storage/vest/wardencoat/neo_warden_heavy + name = "heavy warden coat" + desc = "A heavy and somewhat-imposing looking armour vest over a long jacket. It bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_warden_heavy" + +/obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench + name = "armsco heavy coat" + desc = "A rich red longcoat trimmed in black with a warm brown synthetic fur ruff around the neck, lined with layers of para-aramid fibers for increased durability without compromising comfort. It bears a tag that says 'Product of Total Gear & Co.'" + icon_state = "neo_armsco_trench" \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index f1385484783..28a7dab8264 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -602,3 +602,51 @@ /obj/item/clothing/accessory/pride/vore name = "vore pride pin" icon_state = "pride_vore" + +// ranger ponchos + +/obj/item/clothing/accessory/poncho/roles/ranger + name = "red ranger poncho" + desc = "A rugged all-weather poncho, perfectly coloured to match a popular line of neck gaiters. You could probably use it as a tent in a pinch!" + icon_state = "rangerponcho_red" + item_state = "rangerponcho_red" + +/obj/item/clothing/accessory/poncho/roles/ranger/tan + name = "tan ranger poncho" + icon_state = "rangerponcho_tan" + item_state = "rangerponcho_tan" + +/obj/item/clothing/accessory/poncho/roles/ranger/gray + name = "gray ranger poncho" + icon_state = "rangerponcho_gray" + item_state = "rangerponcho_gray" + +/obj/item/clothing/accessory/poncho/roles/ranger/green + name = "green ranger poncho" + icon_state = "rangerponcho_green" + item_state = "rangerponcho_green" + +/obj/item/clothing/accessory/poncho/roles/ranger/blue + name = "blue ranger poncho" + icon_state = "rangerponcho_blue" + item_state = "rangerponcho_blue" + +/obj/item/clothing/accessory/poncho/roles/ranger/purple + name = "purple ranger poncho" + icon_state = "rangerponcho_purple" + item_state = "rangerponcho_purple" + +/obj/item/clothing/accessory/poncho/roles/ranger/orange + name = "orange ranger poncho" + icon_state = "rangerponcho_orange" + item_state = "rangerponcho_orange" + +/obj/item/clothing/accessory/poncho/roles/ranger/charcoal + name = "charcoal ranger poncho" + icon_state = "rangerponcho_charcoal" + item_state = "rangerponcho_charcoal" + +/obj/item/clothing/accessory/poncho/roles/ranger/snow + name = "white ranger poncho" + icon_state = "rangerponcho_snow" + item_state = "rangerponcho_snow" \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index a49a604b0bc..a001d5aa7cd 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -190,3 +190,28 @@ icon_state = "wardenblueclothes" item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") rolled_sleeves = 0 + +/* + * Tan uniforms + */ +/obj/item/clothing/under/rank/security/tan + name = "security officer's uniform" + desc = "The latest in fashionable security outfits." + icon_state = "officertanclothes" + item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") + rolled_sleeves = 0 + +/obj/item/clothing/under/rank/head_of_security/tan + desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security." + name = "head of security's uniform" + icon_state = "hostanclothes" + item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") + rolled_sleeves = 0 + +/obj/item/clothing/under/rank/warden/tan + desc = "The insignia on this uniform tells you that this uniform belongs to the Warden." + name = "warden's uniform" + icon_state = "wardentanclothes" + item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") + rolled_sleeves = 0 + diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 4393be1bfd6..3c3ba740499 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -239,6 +239,7 @@ name = "sleek overalls" desc = "A set of modern pleather reinforced overalls." icon_state = "overalls_sleek" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS /obj/item/clothing/under/pirate name = "pirate outfit" diff --git a/code/modules/clothing/under/neounder.dm b/code/modules/clothing/under/neounder.dm new file mode 100644 index 00000000000..59a939987e8 --- /dev/null +++ b/code/modules/clothing/under/neounder.dm @@ -0,0 +1,1098 @@ +/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes. +this file deals with uniforms/under. */ + + +// Civvie + +/obj/item/clothing/under/rank/neo_chef_skirt + name = "chef's skirt" + desc = "a high class skirt, made of a stain resistant fabtic. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_chef_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_teal + name = "teal suit" + desc = "a somewhat garish teal suit. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_teal_suit" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_teal_skirt + name = "teal skirt" + desc = "a somewhat garish teal skirt. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_teal_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hydro + name = "hydroponics jumpsuit" + desc = "a dirt resistant suit. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hydroponics" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hydro_skirt + name = "hydroponics jumpskirt" + desc = "a dirt resistant skirt. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hydroponics_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_janitor + name = "janitor's jumpsuit" + desc = "a cleaning jumpsuit. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_janitor" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_janitor_skirt + name = "janitor's jumpskirt" + desc = "a cleaning jumpskirt. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_janitor_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop + name = "head of personnel's jumpsuit" + desc = "a proper HR professional's jumpsuit. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hop" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop_skirt + name = "head of personnel's jumpskirt" + desc = "a proper HR professional's jumpskirt. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hop_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop_parade_masc + name = "head of personnel's parade suit" + desc = "an over the top HR professional's wear. this one is a masculine fit. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hop_parade_male" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop_parade_fem + name = "head of personnel's feminine parade suit" + desc = "an over the top HR professional's wear. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hop_parade_female" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop_turtle + name = "head of personnel's turtleneck" + desc = "an HR worker's turtleneck. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hopturtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_hop_turtle_skirt + name = "head of personnel's turtleskirt" + desc = "an HR worker's turtleskirt. it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hopturtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_civvie_gorka + name = "civilan gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. For those who appreciate durable clothing. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_civvie_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +// Command + +/obj/item/clothing/under/rank/neo_captain + name = "captain's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_captain" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_captain_skirt + name = "captain's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_captain_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_captain_parade + name = "captain's parade suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_captain_parade" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_captain_kilt + name = "captain's kilt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_capkilt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_captain_blacksuit + name = "captain's black suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_captainblacksuit" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/bodyguard_suit + name = "bodyguard's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_blueshield" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/bodyguard_skirt + name = "bodyguard's skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_blueshield_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/bodyguard_turtleneck + name = "bodyguard's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_blueshield_turtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/bodyguard_turtleskirt + name = "bodyguard's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_blueshield_turtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_ntrep + name = "NT rep's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_ntrep" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_ntrep_skirt + name = "NT rep's suitskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_ntrep_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_commandutil + name = "command utility jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_util_com" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_pilot + name = "pilot's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_pilot" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_pilot_skirt + name = "pilot's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_pilot_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cmd_gorka + name = "CO's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. Who said command-wear can't look slick? It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmd_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_pilot_gorka + name = "pilot's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. In the pipe, five by five. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_pilot_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +//'Suspicious' + +/obj/item/clothing/under/rank/neo_suspect_turtleneck + name = "suspiciously comfortable turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_turtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspect_turtleskirt + name = "suspiciously comfortable turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspect_turtleneck_blue + name = "curiously comfortable turtlneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_blue" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue + name = "curiously comfortable turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_blue_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspicious_turtleneck + name = "suspicious turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_red" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspicious_turtleskirt + name = "suspicious turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_red_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspect_overalls + name = "suspiciously comfortable overalls" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_overall" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_suspect_overalls_skirt + name = "suspiciously comfortable skirt overalls" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_suspect_overall_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +// CC + +/obj/item/clothing/under/rank/neo_centcom + name = "centcom officer's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_centcom_skirt + name = "centcom officer's skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_centcom_official + name = "centcom official's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom_official" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_centcom_intern + name = "centcom intern's uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom_intern" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_centcom_turtleneck + name = "centcom official's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom_officer" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_centcom_turtleskirt + name = "centcom official's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_centcom_officer_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_admiral_green + name = "admiral's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_admiral_green" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_admiral_white + name = "admiral's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_admiral_white" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_armsco + name = "arms company suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_armsco" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_armsco_tac + name = "tactical arms company jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_armsco_tac" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_contract + name = "contractor's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_contract" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_contract_tac + name = "tactical contractor jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_contract_tac" + rolled_sleeves = -1 + rolled_down = -1 + +//Security + +/obj/item/clothing/under/rank/neo_sec_red + name = "red security jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_red" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_red_skirt + name = "red security skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_red_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_warden_red + name = "warden's red suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_warden_red" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_warden_red_skirt + name = "warden's red skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_warden_red_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_red + name = "head of security's red jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_red" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_red_skirt + name = "head of security's red skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_red_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_blackred + name = "head of security's red turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_blackred" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_blackred_skirt + name = "head of security's red skirtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_blackred_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_parade + name = "head of security's red parade uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_parade" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_parade_fem + name = "head of security's femme red parade uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_parade_fem" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_blue + name = "blue security jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_suit + name = "white security suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_suit" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_suit_blue + name = "blue security suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_suit_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_warden_blue + name = "warden's blue suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_warden_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_blue + name = "head of security's blue suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_blackblue + name = "head of security's blue turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_blackblue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_blackblue_skirt + name = "head of security's blue skirtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_blackblue_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_parade_blue + name = "head of security's blue parade uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_parade_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_parade_blue_fem + name = "head of security's femme blue parade uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_parade_blue_fem" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_turtle_red + name = "red security turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_turtle_red" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_turtle_red_skirt + name = "red security skirtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_turtle_red_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_turtle_blue + name = "blue security turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_turtle_blue" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt + name = "blue security skirtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_turtle_blue_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_corrections + name = "corrections officer suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_corrections" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_corrections_skirt + name = "corrections officer skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_corrections_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_runner + name = "runner's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_runner" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_hos_gorka + name = "head of security's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. Favoured by the Head of Security who wants to stay dry no matter what. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_hos_gorka" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +/obj/item/clothing/under/rank/neo_sec_gorka + name = "security officer's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. For officers who expect to be patrolling in harsh conditions. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sec_gorka" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + +// Cargo + + +/obj/item/clothing/under/rank/neo_qm + name = "QM's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_skirt + name = "QM's skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_shorts + name = "cargo tech's shorts" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_shorts" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_skirt + name = "cargo tech's skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_miner + name = "miner's overalls" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_miner" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_miner_fauna + name = "hunter's suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_miner_fauna" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_jacket + name = "QM's casualwear" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_jacket" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_white + name = "QM's button-up suit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_white" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_white_skirt + name = "QM's button-up skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_white_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_turtle + name = "QM's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_turtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_turtle_skirt + name = "QM's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_turtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_qm_gorka + name = "QM's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. Preferred by quartermasters who do heavy lifting as well as paperwork. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_qm_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo + name = "cargo tech's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_util_cargo + name = "cargo utility uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_util_cargo" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_dark + name = "dark cargo uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_dark" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_casual + name = "casual cargo uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_casual" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_turtle + name = "cargo tech's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_turtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_turtle_skirt + name = "cargo tech's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_turtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_gorka + name = "cargo tech's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. No need to worry about improperly packaged goods ripping your jumpsuit with this. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_cargo_customs + name = "customs uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cargo_customs" + rolled_sleeves = -1 + rolled_down = -1 + +//Engi + + +/obj/item/clothing/under/rank/neo_engi + name = "engineer's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_engi" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/under/rank/neo_engi_skirt + name = "engineer's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_engi_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/under/rank/neo_atmos + name = "atmos tech's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_atmos" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_atmos_skirt + name = "atoms tech's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_atmos_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_chiefengi + name = "chief engineer's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_chiefengi" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/under/rank/neo_chiefengi_skirt + name = "chief engineer's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_chiefengi_skirt" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/under/rank/neo_ce_gorka + name = "chief engineer's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. For the chief engineer who values style and safety. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_ce_gorka" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/under/rank/neo_engi_gorka + name = "engineer's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. Not rated for high-power electrical shocks. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_engi_gorka" + rolled_sleeves = -1 + rolled_down = -1 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + +// Sci + +/obj/item/clothing/under/rank/neo_rd_turtle + name = "research director's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_rd_turtle" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_rd_turtle_skirt + name = "research director's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_rd_turtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_science + name = "scientist's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_science" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_science_skirt + name = "scientist's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_science_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_util_sci + name = "science utility uniform" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_util_sci" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_robo + name = "roboticist's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_robo" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_robo_skirt + name = "roboticist's skirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_robo_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_rd_suit + name = "research director's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_rd_suit" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_rd_suit_skirt + name = "research director's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_rd_suit_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_gene + name = "genetic engineer's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_gene" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_gene_skirt + name = "genetic engineer's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_gene_skirt" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_rd_gorka + name = "research director's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. For research directors who like to get their hands dirty. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_rd_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +/obj/item/clothing/under/rank/neo_sci_gorka + name = "scientist's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. A favourite of mountaineering archaeologists. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_sci_gorka" + rolled_sleeves = -1 + rolled_down = -1 + +// Med + +/obj/item/clothing/under/rank/neo_med + name = "doctor's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_med" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_med_skirt + name = "doctor's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_med_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_cmo + name = "CMO's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmo" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_cmo_skirt + name = "CMO's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmo_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_cmo_turtle + name = "CMO's turtleneck" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmo_turtle" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_cmo_turtle_skirt + name = "CMO's turtleskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmo_turtle_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_viro + name = "virologist's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_viro" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_viro_skirt + name = "virologist's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_viro_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_chem + name = "chemist's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_chem" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_chem_skirt + name = "chemist's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_chem_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_para + name = "paramedic's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_para" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_para_skirt + name = "paramedic's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_para_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_para_light + name = "paramedic's light jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_para_light" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_para_light_skirt + name = "paramedic's light jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_para_light_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_pharma + name = "pharmacist's jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_pharma" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_pharma_skirt + name = "pharmacist's jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_pharma_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_med_dark + name = "dark medical jumpsuit" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_med_dark" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_med_dark_skirt + name = "dark medical jumpskirt" + desc = "it has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_med_dark_skirt" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_cmo_gorka + name = "chief medical officer's gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. Why worry about stains when everything slides right off? It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_cmo_gorka" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/under/rank/neo_med_gorka + name = "medical staff gorka" + desc = "A rugged weather-resistant uniform made of ripstop fabric. A popular choice among paramedical personnel. It has a tag denoting it's made by Total Gear & Co." + icon_state = "neo_med_gorka" + rolled_sleeves = -1 + rolled_down = -1 + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 82386c97697..228c22b0951 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -63,6 +63,18 @@ icon_state = "greyutility" worn_state = "greyutility" +/obj/item/clothing/under/utility/tan + name = "utility uniform" + desc = "A comfortable tan utility jumpsuit." + icon_state = "tanutility" + worn_state = "tanutility" + +/obj/item/clothing/under/utility/green + name = "utility uniform" + desc = "A comfortable green utility jumpsuit." + icon_state = "greenutility" + worn_state = "greenutility" + //Here's the real ones /obj/item/clothing/under/solgov/utility/sifguard name = "\improper SifGuard uniform" diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index a1375bfca67..0011b4fbcc2 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -301,7 +301,7 @@ /obj/item/toy/tennis = 15) //VOREStation Edit End - contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2) // VOREStation Add - Slurpable blobs. + contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2, /obj/item/toy/baseball = 2) // VOREStation Add - Slurpable blobs. /obj/machinery/vending/cart name = "PTech" @@ -1177,11 +1177,13 @@ products = list( /obj/item/clothing/under/rank/bartender = 5, /obj/item/clothing/under/rank/bartender/skirt = 5, + /obj/item/clothing/under/rank/neo_chef_skirt = 5, /obj/item/clothing/under/waiter = 5, /obj/item/clothing/head/that = 5, /obj/item/clothing/head/flatcap = 5, /obj/item/clothing/shoes/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/bar = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5, /obj/item/clothing/accessory/permit/gun/bar = 1 ) req_log_access = access_hop @@ -1203,6 +1205,30 @@ /obj/item/clothing/head/soft/sec = 5, /obj/item/clothing/head/beret/sec = 5, /obj/item/clothing/head/beret/sec/corporate/officer = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_bodyguard_dep = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_blue_dep = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_red_dep = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_police = 5, + /obj/item/clothing/under/rank/bodyguard_suit = 5, + /obj/item/clothing/under/rank/bodyguard_skirt = 5, + /obj/item/clothing/under/rank/bodyguard_turtleneck = 5, + /obj/item/clothing/under/rank/bodyguard_turtleskirt = 5, + /obj/item/clothing/under/rank/neo_sec_red = 5, + /obj/item/clothing/under/rank/neo_sec_red_skirt = 5, + /obj/item/clothing/under/rank/neo_sec_blue = 5, + /obj/item/clothing/under/rank/neo_sec_suit = 5, + /obj/item/clothing/under/rank/neo_sec_suit_blue = 5, + /obj/item/clothing/under/rank/neo_sec_turtle_red = 5, + /obj/item/clothing/under/rank/neo_sec_turtle_red_skirt = 5, + /obj/item/clothing/under/rank/neo_sec_turtle_blue = 5, + /obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt = 5, + /obj/item/clothing/under/rank/neo_corrections = 5, + /obj/item/clothing/under/rank/neo_corrections_skirt = 5, + /obj/item/clothing/under/rank/neo_runner = 5, + /obj/item/clothing/under/rank/neo_sec_gorka = 5, + /obj/item/clothing/suit/neo_runner_coat = 5, + /obj/item/clothing/shoes/boots/jackboots/silver = 5, + /obj/item/clothing/shoes/boots/jackboots/white = 5, /obj/item/clothing/mask/bandana/red = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/security = 5, /obj/item/clothing/accessory/armband = 5, @@ -1229,6 +1255,8 @@ /obj/item/clothing/suit/storage/apron/white = 5, /obj/item/clothing/suit/chef = 5, /obj/item/clothing/suit/chef/classic = 5, + /obj/item/clothing/under/rank/neo_chef_skirt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5, /obj/item/clothing/head/chefhat = 5, /obj/item/clothing/head/hairnet = 5, /obj/item/clothing/under/waiter = 5, @@ -1257,6 +1285,23 @@ /obj/item/clothing/head/surgery/blue = 5, /obj/item/clothing/head/surgery/green = 5, /obj/item/clothing/head/surgery/black = 5, + /obj/item/clothing/under/rank/neo_med = 5, + /obj/item/clothing/under/rank/neo_med_skirt = 5, + /obj/item/clothing/under/rank/neo_para =5, + /obj/item/clothing/under/rank/neo_para_skirt = 5, + /obj/item/clothing/under/rank/neo_para_light = 5, + /obj/item/clothing/under/rank/neo_para_light_skirt = 5, + /obj/item/clothing/under/rank/neo_med_dark = 5, + /obj/item/clothing/under/rank/neo_med_dark_skirt = 5, + /obj/item/clothing/under/rank/neo_med_gorka = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_emt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_highvis = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_redemt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_blueemt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_med_dep = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_bluemed = 5, + /obj/item/clothing/suit/neo_medical_coat = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/suit/storage/toggle/labcoat = 5, /obj/item/clothing/suit/storage/toggle/labcoat/modern = 5, @@ -1282,6 +1327,10 @@ /obj/item/clothing/shoes/white = 5, /obj/item/clothing/suit/storage/toggle/labcoat/chemist = 5, /obj/item/clothing/suit/storage/toggle/labcoat/old/chem = 5, //VoreStation edit, pre-fulp labcoat. + /obj/item/clothing/under/rank/neo_chem = 5, + /obj/item/clothing/under/rank/neo_chem_skirt = 5, + /obj/item/clothing/under/rank/neo_pharma = 5, + /obj/item/clothing/under/rank/neo_pharma_skirt = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/medical/chemist = 5, /obj/item/clothing/head/beret/medical/chem = 5, /obj/item/weapon/storage/backpack/chemistry = 5, @@ -1301,6 +1350,8 @@ /obj/item/clothing/under/rank/geneticist = 5, /obj/item/clothing/under/rank/geneticist/skirt = 5, /obj/item/clothing/shoes/white = 5, + /obj/item/clothing/under/rank/neo_gene = 5, + /obj/item/clothing/under/rank/neo_gene_skirt = 5, /obj/item/clothing/suit/storage/toggle/labcoat/genetics = 5, /obj/item/weapon/storage/backpack/genetics = 5, /obj/item/weapon/storage/backpack/satchel/gen = 5 @@ -1318,6 +1369,8 @@ /obj/item/clothing/under/rank/virologist = 5, /obj/item/clothing/under/rank/virologist/skirt = 5, /obj/item/clothing/shoes/white = 5, + /obj/item/clothing/under/rank/neo_viro = 5, + /obj/item/clothing/under/rank/neo_viro_skirt = 5, /obj/item/clothing/suit/storage/toggle/labcoat/virologist = 5, /obj/item/clothing/suit/storage/toggle/labcoat/old/vir = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/medical/viro = 5, //VoreStation edit, pre-fulp labcoat. @@ -1344,6 +1397,12 @@ /obj/item/clothing/suit/storage/toggle/labcoat/modern = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/shoes/slippers = 5, + /obj/item/clothing/under/rank/neo_science = 5, + /obj/item/clothing/under/rank/neo_science_skirt = 5, + /obj/item/clothing/under/rank/neo_util_sci = 5, + /obj/item/clothing/under/rank/neo_sci_gorka = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_sci_dep = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/science = 5, /obj/item/clothing/shoes/boots/winter/science = 5, /obj/item/clothing/head/beret/science = 5, @@ -1366,6 +1425,10 @@ /obj/item/clothing/head/beret/science/robotics = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/gloves/black = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_robo_coat = 5, + /obj/item/clothing/under/rank/neo_robo = 5, + /obj/item/clothing/under/rank/neo_robo_skirt = 5, /obj/item/weapon/storage/backpack/toxins = 5, /obj/item/weapon/storage/backpack/satchel/tox = 5 ) @@ -1416,6 +1479,10 @@ /obj/item/clothing/head/hardhat = 5, /obj/item/clothing/head/beret/engineering = 5, /obj/item/clothing/mask/bandana/gold = 5, + /obj/item/clothing/under/rank/neo_engi = 5, + /obj/item/clothing/under/rank/neo_engi_skirt = 5, + /obj/item/clothing/under/rank/neo_engi_gorka = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_engi_dep = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering = 5, /obj/item/clothing/shoes/boots/winter/engineering = 5, /obj/item/clothing/shoes/boots/workboots = 5 @@ -1436,6 +1503,8 @@ /obj/item/clothing/head/hardhat/red = 5, /obj/item/clothing/head/beret/engineering = 5, /obj/item/clothing/mask/bandana/gold = 5, + /obj/item/clothing/under/rank/neo_atmos = 5, + /obj/item/clothing/under/rank/neo_atmos_skirt = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos = 5, /obj/item/clothing/shoes/boots/winter/atmos = 5 ) @@ -1454,6 +1523,9 @@ /obj/item/clothing/head/greenbandana = 5, /obj/item/weapon/material/minihoe = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/hydro = 5, + /obj/item/clothing/under/rank/neo_hydro = 5, + /obj/item/clothing/under/rank/neo_hydro_skirt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5, /obj/item/clothing/shoes/boots/winter/hydro = 5 ) req_log_access = access_hop @@ -1472,6 +1544,19 @@ /obj/item/clothing/under/rank/cargotech/jeans/female = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 5, /obj/item/clothing/suit/storage/cargo = 5, + /obj/item/clothing/under/rank/neo_cargo_shorts = 5, + /obj/item/clothing/under/rank/neo_cargo_skirt = 5, + /obj/item/clothing/under/rank/neo_miner = 5, + /obj/item/clothing/under/rank/neo_cargo = 5, + /obj/item/clothing/under/rank/neo_util_cargo = 5, + /obj/item/clothing/under/rank/neo_cargo_dark = 5, + /obj/item/clothing/under/rank/neo_cargo_casual = 5, + /obj/item/clothing/under/rank/neo_cargo_turtle = 5, + /obj/item/clothing/under/rank/neo_cargo_turtle_skirt = 5, + /obj/item/clothing/under/rank/neo_cargo_gorka = 5, + /obj/item/clothing/under/rank/neo_cargo_customs = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_cargo_dep = 5, + /obj/item/clothing/suit/neo_gorka_cargo = 5, /obj/item/clothing/shoes/boots/winter/supply = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/gloves/black = 5, @@ -1508,6 +1593,9 @@ /obj/item/clothing/under/rank/janitor = 5, /obj/item/clothing/under/dress/maid/janitor = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/janitor = 5, + /obj/item/clothing/under/rank/neo_janitor = 5, + /obj/item/clothing/under/rank/neo_janitor_skirt = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5, /obj/item/clothing/gloves/black = 5, /obj/item/weapon/storage/belt/janitor = 5, /obj/item/clothing/shoes/galoshes = 5, @@ -1535,6 +1623,8 @@ /obj/item/clothing/under/lawyer/purpsuit = 5, /obj/item/clothing/under/lawyer/purpsuit/skirt = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, + /obj/item/clothing/under/rank/neo_teal = 5, + /obj/item/clothing/under/rank/neo_teal_skirt = 5, /obj/item/clothing/shoes/brown = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/shoes/laceup = 5, @@ -1555,6 +1645,7 @@ products = list( /obj/item/clothing/head/det = 5, /obj/item/clothing/head/det/grey = 5, + /obj/item/clothing/head/neo_irs = 5, /obj/item/clothing/shoes/brown = 5, /obj/item/clothing/shoes/laceup = 5, /obj/item/clothing/under/det = 5, diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 1161a8604ab..784bbcca65c 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -637,6 +637,10 @@ /obj/item/clothing/mask/bandana/green = 5, /obj/item/clothing/mask/bandana/red = 5, /obj/item/clothing/mask/surgical = 5, + /obj/item/clothing/head/ushanka/neo_ushanka = 5, + /obj/item/clothing/head/ushanka/neo_ushanka_blue = 5, + /obj/item/clothing/head/papakha = 5, + /obj/item/clothing/head/papakha_white = 5, /obj/item/clothing/accessory/pride/bi = 5, /obj/item/clothing/accessory/pride/trans = 5, /obj/item/clothing/accessory/pride/ace = 5, @@ -925,6 +929,10 @@ /obj/item/clothing/under/suit_jacket/checkered/skirt = 5, /obj/item/clothing/under/suit_jacket/tan = 5, /obj/item/clothing/under/suit_jacket/tan/skirt = 5, + /obj/item/clothing/under/rank/neo_civvie_gorka = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_leather = 5, + /obj/item/clothing/suit/neo_gorka = 5, + /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5, /obj/item/clothing/under/scratch = 5, /obj/item/clothing/under/scratch/skirt = 5, /obj/item/clothing/under/sundress = 5, @@ -1131,7 +1139,16 @@ /obj/item/clothing/under/tropical/pink = 50, /obj/item/clothing/under/tropical/blue = 50) premium = list(/obj/item/clothing/under/color/rainbow = 1) - contraband = list(/obj/item/clothing/under/rank/clown = 1) + contraband = list(/obj/item/clothing/under/rank/clown = 1, + /obj/item/clothing/under/rank/neo_suspect_turtleneck = 1, + /obj/item/clothing/under/rank/neo_suspect_turtleskirt = 1, + /obj/item/clothing/under/rank/neo_suspect_turtleneck_blue = 1, + /obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue = 1, + /obj/item/clothing/under/rank/neo_suspicious_turtleneck = 1, + /obj/item/clothing/under/rank/neo_suspicious_turtleskirt = 1, + /obj/item/clothing/under/rank/neo_suspect_overalls = 1, + /obj/item/clothing/under/rank/neo_suspect_overalls_skirt = 1, + /obj/item/clothing/head/soft/neo_softcap = 2) /obj/machinery/vending/loadout/loadout_misc name = "Bits and Bobs" diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index c55cf89469c..ff5768559da 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -42,6 +42,9 @@ /// Canned food switch to this state when opened, if set var/canned_open_state + /// For packaged/canned food sounds + var/opening_sound = null + /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) @@ -290,7 +293,7 @@ /obj/item/weapon/reagent_containers/food/snacks/proc/unpackage(mob/user) package = FALSE to_chat(user, "You unwrap [src].") - playsound(user,'sound/effects/packagedfoodopen.ogg', 15, 1) + playsound(user,opening_sound, 15, 1) if(package_trash) var/obj/item/T = new package_trash user.put_in_hands(T) @@ -302,7 +305,7 @@ /obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user) canned = FALSE to_chat(user, "You unseal \the [src] with a crack of metal.") - playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1) + playsound(loc,opening_sound, rand(10,50), 1) if(canned_open_state) icon_state = canned_open_state @@ -6136,6 +6139,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb01" + trash = /obj/item/trash/candy/cb01 nutriment_amt = 4 nutriment_desc = list("stale chocolate" = 2, "nougat" = 1, "caramel" = 1) w_class = 1 @@ -6152,6 +6156,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb02" + trash = /obj/item/trash/candy/cb02 nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "caramel" = 1, "puffed rice" = 1) w_class = 1 @@ -6168,6 +6173,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb03" + trash = /obj/item/trash/candy/cb03 nutriment_amt = 4 nutriment_desc = list("chocolate" = 4) w_class = 1 @@ -6184,6 +6190,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb04" + trash = /obj/item/trash/candy/cb04 nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "salt = 1", "licorice" = 1) w_class = 1 @@ -6200,6 +6207,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb05" + trash = /obj/item/trash/candy/cb05 nutriment_amt = 3 nutriment_desc = list("milk chocolate" = 2) w_class = 1 @@ -6216,6 +6224,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb06" + trash = /obj/item/trash/candy/cb06 nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "coffee" = 1, "vanilla wafer" = 1) w_class = 1 @@ -6233,6 +6242,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb07" + trash = /obj/item/trash/candy/cb07 nutriment_amt = 4 nutriment_desc = list("chocolate" = 2, "taro" = 2) w_class = 1 @@ -6249,6 +6259,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb08" + trash = /obj/item/trash/candy/cb08 nutriment_amt = 3 nutriment_desc = list("chocolate" = 2, "malt puffs" = 1) w_class = 1 @@ -6265,6 +6276,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb09" + trash = /obj/item/trash/candy/cb09 nutriment_amt = 6 nutriment_desc = list("peanuts" = 3, "condensed milk" = 1, "cashews" = 2) w_class = 1 @@ -6283,6 +6295,7 @@ filling_color = "#552200" icon = 'icons/obj/food_snacks.dmi' icon_state = "cb10" + trash = /obj/item/trash/candy/cb10 nutriment_amt = 5 nutriment_desc = list("chocolate" = 2, "caramel" = 1, "peanuts" = 1, "nougat" = 1) w_class = 1 @@ -6826,6 +6839,7 @@ /obj/item/weapon/reagent_containers/food/snacks/canned icon = 'icons/obj/food_canned.dmi' + opening_sound = 'sound/effects/tincanopen.ogg' canned = TRUE //////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts////////// @@ -7008,6 +7022,7 @@ /obj/item/weapon/reagent_containers/food/snacks/packaged icon = 'icons/obj/food_package.dmi' + opening_sound = 'sound/effects/packagedfoodopen.ogg' package = TRUE //////////////Lunar Cakes - proof of concept////////////// diff --git a/code/modules/food/kitchen/smartfridge/engineering.dm b/code/modules/food/kitchen/smartfridge/engineering.dm index 2e31edf34c4..721f5040dac 100644 --- a/code/modules/food/kitchen/smartfridge/engineering.dm +++ b/code/modules/food/kitchen/smartfridge/engineering.dm @@ -1,7 +1,12 @@ +/* + * Industrial Sized Sheet Storage (but not actually industrial sized) + */ /obj/machinery/smartfridge/sheets - name = "\improper Smart Sheet Storage" - desc = "A storage unit for metals." - icon_contents = "boxes" + name = "\improper Industrial Sheet Storage" + desc = "An industrial sized storage unit for materials." + icon_state = "base_industrial" + icon_base = "industrial" + icon_contents = "sheet" stored_datum_type = /datum/stored_item/stack /obj/machinery/smartfridge/sheets/persistent @@ -30,3 +35,17 @@ if(O.type == I.item_path) // Typecheck should evaluate material-specific subtype return I return null + +/* + * Mining Variant + */ +/obj/machinery/smartfridge/sheets/mining + name = "\improper Mining Sheet Storage" + icon_state = "base_mining" + icon_base = "mining" + icon_contents = "sheet" + +/obj/machinery/smartfridge/sheets/mining/persistent + persistent = /datum/persistent/storage/smartfridge/sheet_storage +/obj/machinery/smartfridge/sheets/mining/persistent_lossy + persistent = /datum/persistent/storage/smartfridge/sheet_storage/lossy \ No newline at end of file diff --git a/code/modules/food/kitchen/smartfridge/medical.dm b/code/modules/food/kitchen/smartfridge/medical.dm index b1749068165..f7a5ea9bb57 100644 --- a/code/modules/food/kitchen/smartfridge/medical.dm +++ b/code/modules/food/kitchen/smartfridge/medical.dm @@ -1,21 +1,46 @@ +/* + * Medical + */ +/obj/machinery/smartfridge/medbay + name = "\improper Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for securely storing medicine and chemicals." + icon_contents = "chem" + +/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/)) + return 1 + return 0 + /obj/machinery/smartfridge/secure/medbay name = "\improper Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." + icon_contents = "chem" req_one_access = list(access_medical,access_chemistry) /obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass/)) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 - if(istype(O,/obj/item/weapon/storage/pill_bottle/)) + return 0 + +/* + * Virology + */ +/obj/machinery/smartfridge/virology + name = "\improper Refrigerated Virus Storage" + desc = "A refrigerated storage unit for storing viral material." + icon_contents = "viro" + +/obj/machinery/smartfridge/virology/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/)) return 1 - if(istype(O,/obj/item/weapon/reagent_containers/pill/)) + if(istype(O,/obj/item/weapon/virusdish/)) return 1 return 0 /obj/machinery/smartfridge/secure/virology name = "\improper Refrigerated Virus Storage" - desc = "A refrigerated storage unit for storing viral material." - icon_contents = "misc" + desc = "A refrigerated storage unit for securely storing viral material." + icon_contents = "viro" req_access = list(access_virology) /obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj) @@ -25,15 +50,27 @@ return 1 return 0 -/obj/machinery/smartfridge/chemistry //Is this used anywhere? It's not secure. +/* + * Chemistry + */ +/obj/machinery/smartfridge/chemistry name = "\improper Smart Chemical Storage" - desc = "A refrigerated storage unit for medicine and chemical storage." + desc = "A refrigerated storage unit for storing medicine and chemicals." + icon_contents = "chem" + req_one_access = list(access_chemistry) /obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 return 0 -/obj/machinery/smartfridge/chemistry/virology //Same - name = "\improper Smart Virus Storage" - desc = "A refrigerated storage unit for volatile sample storage." \ No newline at end of file +/obj/machinery/smartfridge/secure/chemistry + name = "\improper Smart Chemical Storage" + desc = "A refrigerated storage unit for securely storing medicine and chemicals." + icon_contents = "chem" + req_one_access = list(access_chemistry) + +/obj/machinery/smartfridge/secure/chemistry/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/)) + return 1 + return 0 diff --git a/code/modules/food/kitchen/smartfridge/research.dm b/code/modules/food/kitchen/smartfridge/research.dm new file mode 100644 index 00000000000..eaab3c635ba --- /dev/null +++ b/code/modules/food/kitchen/smartfridge/research.dm @@ -0,0 +1,13 @@ +/* + * Xenobiological + */ +/obj/machinery/smartfridge/secure/extract + name = "\improper Biological Sample Storage" + desc = "A refrigerated storage unit for xenobiological samples." + icon_contents = "slime" + req_access = list(access_research) + +/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) + if(istype(O, /obj/item/slime_extract) || istype(O, /obj/item/slimepotion)) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/food/kitchen/smartfridge/hydroponics.dm b/code/modules/food/kitchen/smartfridge/service.dm similarity index 52% rename from code/modules/food/kitchen/smartfridge/hydroponics.dm rename to code/modules/food/kitchen/smartfridge/service.dm index 93afa67b19d..8d0485cd190 100644 --- a/code/modules/food/kitchen/smartfridge/hydroponics.dm +++ b/code/modules/food/kitchen/smartfridge/service.dm @@ -1,7 +1,59 @@ +/* + * Chef + */ +/obj/machinery/smartfridge/chef + desc = "For storing all sorts of delicious foods!" + +/obj/machinery/smartfridge/chef/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks)) + return 1 + return 0 + +/* + * Bartender + */ +/obj/machinery/smartfridge/drinks + name = "\improper Smart Drink Storage" + desc = "A refrigerated storage unit for tasty tasty alcohol." + icon_contents = "drinks" + +/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) + return 1 + return 0 + +/obj/machinery/smartfridge/drinks/showcase + name = "\improper Drink Showcase" + icon_state = "base_showcase" + icon_base = "showcase" + +//Showcase needs a special icon update +/obj/machinery/smartfridge/drinks/showcase/update_icon() + cut_overlays() + if(panel_open) + add_overlay("[icon_base]-panel") + + if(stat & (BROKEN)) + cut_overlays() + icon_state = "[icon_base]-broken" + + if(stat & (NOPOWER)) + icon_state = "[icon_base]-off" + else + icon_state = icon_base + switch(contents.len) + if(0) + add_overlay("[icon_base]") + if(1 to 3) + add_overlay("[icon_base]-fill") + +/* + * Hydroponics + */ /obj/machinery/smartfridge/produce name = "\improper Smart Produce Storage" - desc = "For storing all sorts of perishable foods!" - icon_contents = "boxes" + desc = "For storing all sorts of perishable produce!" + icon_contents = "plants" /obj/machinery/smartfridge/produce/persistent persistent = /datum/persistent/storage/smartfridge/produce @@ -11,43 +63,15 @@ /obj/machinery/smartfridge/produce/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) - return TRUE - return FALSE + return 1 + return 0 -/obj/machinery/smartfridge/drinks - name = "\improper Smart Drink Storage" - desc = "A refrigerated storage unit for tasty tasty alcohol." - icon_contents = "drinks" - -/obj/machinery/smartfridge/drinks/showcase - name = "\improper Drink Showcase" - icon_state = "showcase" - icon_base = "showcase" - -/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) - return TRUE - return FALSE - -/obj/machinery/smartfridge/seeds +/obj/machinery/smartfridge/seeds //I honestly don't know why this exists when you can store seeds in the vendor. It's not even persistent. name = "\improper MegaSeed Servitor" desc = "When you need seeds fast!" - icon_contents = "boxes" + icon_contents = "petri" //There's no seed base in the current batch /obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/seeds/)) return 1 - return 0 - -/obj/machinery/smartfridge/secure/extract - name = "\improper Biological Sample Storage" - desc = "A refrigerated storage unit for xenobiological samples." - req_access = list(access_research) - icon_contents = "drinks" - -/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj) - if(istype(O, /obj/item/slime_extract)) - return TRUE - if(istype(O, /obj/item/slimepotion)) - return TRUE - return FALSE \ No newline at end of file + return 0 \ No newline at end of file diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm index a929c8eda88..c683bf9a603 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm @@ -1,12 +1,10 @@ -/* SmartFridge. Much todo -*/ /obj/machinery/smartfridge name = "\improper SmartFridge" desc = "For storing all sorts of things! This one doesn't accept any of them!" - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/vending_smartfridge.dmi' icon_state = "smartfridge" var/icon_base = "smartfridge" //Iconstate to base all the broken/deny/etc on - var/icon_contents = "misc" //Overlay to put on glass to show contents + var/icon_contents = "food" //Overlay to put on that show contents density = TRUE anchored = TRUE use_power = USE_POWER_IDLE @@ -67,26 +65,35 @@ /obj/machinery/smartfridge/update_icon() cut_overlays() - if(stat & (BROKEN|NOPOWER)) - icon_state = "[icon_base]-off" - else - icon_state = icon_base - if(panel_open) add_overlay("[icon_base]-panel") - // Fridge contents - switch(contents.len) - if(1 to 3) - add_overlay("[icon_base]-[icon_contents]1") - if(3 to 6) - add_overlay("[icon_base]-[icon_contents]2") - if(6 to INFINITY) - add_overlay("[icon_base]-[icon_contents]3") + if(stat & (BROKEN)) + cut_overlays() + icon_state = "[icon_base]-broken" -/******************* -* Item Adding -********************/ + if(stat & (NOPOWER)) + icon_state = "[icon_base]-off" + switch(contents.len) + if(0) + add_overlay("[icon_base]-0-off") + if(1 to 3) + add_overlay("[icon_base]-[icon_contents]1-off") + if(3 to 6) + add_overlay("[icon_base]-[icon_contents]2-off") + if(6 to INFINITY) + add_overlay("[icon_base]-[icon_contents]3-off") + else + icon_state = icon_base + switch(contents.len) + if(0) + add_overlay("[icon_base]-0") + if(1 to 3) + add_overlay("[icon_base]-[icon_contents]1") + if(3 to 6) + add_overlay("[icon_base]-[icon_contents]2") + if(6 to INFINITY) + add_overlay("[icon_base]-[icon_contents]3") /obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) if(O.is_screwdriver()) @@ -226,6 +233,7 @@ return TRUE vend(item_records[index], amount) + update_icon() return TRUE return FALSE @@ -247,12 +255,12 @@ throw_item.throw_at(target,16,3,src) src.visible_message("[src] launches [throw_item.name] at [target.name]!") SStgui.update_uis(src) + update_icon() return TRUE -/************************ -* Secure SmartFridges -*************************/ - +/* + * Secure Smartfridges + */ /obj/machinery/smartfridge/secure/tgui_act(action, params) if(stat & (NOPOWER|BROKEN)) return TRUE diff --git a/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm b/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm index 8863448ca5d..222cd4f52a4 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm @@ -1,3 +1,6 @@ +/* + * Expert Jobs + */ /obj/machinery/smartfridge var/expert_job = "Chef" /obj/machinery/smartfridge/seeds @@ -6,14 +9,16 @@ expert_job = "Xenobiologist" /obj/machinery/smartfridge/secure/medbay expert_job = "Chemist" +/obj/machinery/smartfridge/secure/chemistry + expert_job = "Chemist" /obj/machinery/smartfridge/secure/virology expert_job = "Medical Doctor" //Virologist is an alt-title unfortunately -/obj/machinery/smartfridge/chemistry - expert_job = "Chemist" //Unsure what this one is used for, actually /obj/machinery/smartfridge/drinks expert_job = "Bartender" -// Allow thrown items into smartfridges +/* + * Allow thrown items into smartfridges + */ /obj/machinery/smartfridge/hitby(var/atom/movable/A, speed) . = ..() if(accept_check(A) && A.thrower) @@ -31,12 +36,20 @@ else if(prob(20)) stock(A) -//Chemistry 'chemavator' +/* + * Chemistry 'chemavator' (multi-z chem storage) + */ /obj/machinery/smartfridge/chemistry/chemvator name = "\improper Smart Chemavator - Upper" desc = "A refrigerated storage unit for medicine and chemical storage. Now sporting a fancy system of pulleys to lift bottles up and down." + expert_job = "Chemist" var/obj/machinery/smartfridge/chemistry/chemvator/attached +/obj/machinery/smartfridge/chemistry/chemvator/accept_check(var/obj/item/O as obj) + if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/)) + return 1 + return 0 + /obj/machinery/smartfridge/chemistry/chemvator/down/Destroy() attached = null return ..() diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm index cd6113f5051..166c5d05ed3 100644 --- a/code/modules/mining/abandonedcrates_vr.dm +++ b/code/modules/mining/abandonedcrates_vr.dm @@ -99,7 +99,8 @@ list(pick(/obj/item/weapon/grenade/spawnergrenade/spesscarp, /obj/item/weapon/grenade/spawnergrenade/spider, /obj/item/weapon/grenade/explosive/frag), 7) = 1, list(/obj/item/weapon/grenade/flashbang/clusterbang, 7) = 1, list(/obj/item/weapon/card/emag, 11) = 1, - list(/obj/item/weapon/melee/shock_maul, 11) = 5, + list(/obj/item/weapon/melee/shock_maul, 11) = 3, + list(/obj/item/clothing/suit/storage/vest/martian_miner, 4) = 6, list(/obj/item/weapon/storage/backpack/sport/hyd/catchemall, 11) = 1 )) var/path = choice[1] diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 7b3b1f5cce8..49962ef351c 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -20,6 +20,7 @@ var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect. var/bloodsucker = FALSE // Allows safely getting nutrition from blood. + var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation. var/is_weaver = FALSE var/silk_production = FALSE diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index ddaf32787c6..94e0d2f47cd 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -389,8 +389,6 @@ set desc = "Bites prey and drains them of a significant portion of blood, feeding you in the process. You may only do this once per minute." set category = "Abilities" - if(last_special > world.time) - return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) to_chat(src, "You cannot bite anyone in your current state!") @@ -400,9 +398,27 @@ for(var/mob/living/carbon/human/M in view(1,src)) if(!istype(M,/mob/living/silicon) && Adjacent(M)) choices += M - choices -= src - var/mob/living/carbon/human/B = tgui_input_list(src, "Who do you wish to bite?", "Suck Blood", choices) + + var/mob/living/carbon/human/B = tgui_input_list(src, "Who do you wish to bite? Select yourself to bring up configuration for privacy and bleeding. \ + Beware! Configuration resets on new round!", "Suck Blood", choices) + + if(B == src) //We are using this to minimize the amount of pop-ups or buttons. + var/control_options = list("always loud", "pop-up", "intents", "always subtle") + src.species.bloodsucker_controlmode = tgui_input_list(src,"Choose your preferred control of blood sucking. \ + You can only cause bleeding wounds with pop up and intents modes. Choosing intents prints controls to chat.", "Configure Bloodsuck", control_options, "always loud") + if(src.species.bloodsucker_controlmode == "intents") //We are printing to chat for better readability + to_chat(src, SPAN_NOTICE("You've chosen to use intents for blood draining. \n \ + HELP - Loud, No Bleeding \n \ + DISARM - Subtle, Causes bleeding \n \ + GRAB - Subtle, No Bleeding \n \ + HARM - Loud, Causes Bleeding")) + return + + if(last_special > world.time) + to_chat(src, "You cannot suck blood so quickly in a row!") + return + if(!B || !src || src.stat) return @@ -418,12 +434,64 @@ return last_special = world.time + 600 - src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!") + + var/control_pref = src.species.bloodsucker_controlmode + var/noise = TRUE + var/bleed = FALSE + + switch(control_pref) + if("always subtle") + noise = FALSE + if("pop-up") + if(tgui_alert(src, "Do you want to be subtle?", "Privacy", list("Yes", "No")) == "Yes") + noise = FALSE + if(tgui_alert(src, "Do you want your target to keep bleeding?", "Continue Bleeding", list("Yes", "No")) == "Yes" ) + bleed = TRUE + if("intents") + /* + Logic is, with "Help", we are taking our time but it's pretty obvious.. + With "disarm", we rush the act, letting it keep bleeding + "HURT" is self-evidently loud and bleedy + "Grab" is subtle because we keep our prey tight and close. + */ + switch(src.a_intent) + //if(I_HELP) uses default values. Added as a comment for clarity + if(I_DISARM) + noise = FALSE + bleed = TRUE + if(I_GRAB) + noise = FALSE + if(I_HURT) + bleed =TRUE + + + + + if(noise) + src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!") + else + src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!", range = 1) + + if(bleed) //Due to possibility of missing/misclick and missing the bleeding cues, we are warning the scene members of BLEEDING being on + to_chat(src, SPAN_WARNING("This is going to cause [B] to keep bleeding!")) + to_chat(B, SPAN_DANGER("You are going to keep bleeding from this bite!")) if(do_after(src, 300, B)) //Thrirty seconds. if(!Adjacent(B)) return - src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!") - B.apply_damage(5, BRUTE, BP_HEAD) //You're getting fangs pushed into your neck. What do you expect???? + if(noise) + src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!") + else + src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!", range = 1) + if(bleed) + B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, soaked = 0, sharp = TRUE, edge = FALSE) + var/obj/item/organ/external/E = B.get_organ(BP_HEAD) + if(!(E.status & ORGAN_BLEEDING)) + E.status |= ORGAN_BLEEDING //If 10 points of piercing didn't make the organ bleed, we are making it bleed. + + + else + B.apply_damage(5, BRUTE, BP_HEAD) //You're getting fangs pushed into your neck. What do you expect???? + B.drip(80) //Remove enough blood to make them a bit woozy, but not take oxyloss. adjust_nutrition(400) sleep(50) @@ -1386,4 +1454,4 @@ name = "tongue ball" hitsound = 'sound/vore/sunesound/pred/schlorp.ogg' hitsound_wall = 'sound/vore/sunesound/pred/schlorp.ogg' - zaptype = /obj/item/projectile/beam/appendage \ No newline at end of file + zaptype = /obj/item/projectile/beam/appendage diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index a8cfa95f2c0..ef0bf2915ce 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -85,6 +85,16 @@ /datum/trait/neutral/bloodsucker name = "Bloodsucker, Obligate" desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey." + tutorial = "This trait forces you to only consume blood - you cannot have normal food anymore. Vore is, of course, an exception!
\ + You can satisfy this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \ + or finding a (un)willing donor for your appropriate appendage!

\ + Controls for taking blood from your victim can be changed at will by trying to drink from yourself.
\ + Intent-based control scheme:
\ + HELP - Loud, No Bleeding
\ + DISARM - Subtle, Causes bleeding
\ + GRAB - Subtle, No Bleeding
\ + HARM - Loud, Causes Bleeding" + cost = 0 custom_only = FALSE var_changes = list("organic_food_coeff" = 0, "bloodsucker" = TRUE) @@ -97,6 +107,15 @@ /datum/trait/neutral/bloodsucker_freeform name = "Bloodsucker" desc = "You get fangs that can be used to drain blood from prey." + tutorial = "This trait allows you to consume blood on top of normal food!
\ + You can do this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \ + or finding a (un)willing donor for your appropriate appendage!

\ + Controls for taking blood from your victim can be changed at will by trying to drink from yourself.
\ + Intent-based control scheme:
\ + HELP - Loud, No Bleeding
\ + DISARM - Subtle, Causes bleeding
\ + GRAB - Subtle, No Bleeding
\ + HARM - Loud, Causes Bleeding" cost = 0 custom_only = FALSE var_changes = list("bloodsucker" = TRUE) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index 0de5ae30974..6239f894282 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -1,6 +1,7 @@ /datum/trait var/name var/desc = "Contact a developer if you see this trait." + var/tutorial = "This trait has no detailed tutorial yet. Suggest one at #Dev-Suggestions on the discord!" //Use
for newlines, NOT \n var/cost = 0 var/sort = TRAIT_SORT_NORMAL // Sort order, 1 before 2 before 3 etc. Alphabetical is used for same-group traits. @@ -32,6 +33,7 @@ S.vars[trait] = trait_prefs[trait] if(TRAIT_VAREDIT_TARGET_MOB) H.vars[trait] = trait_prefs[trait] + H.verbs |= /mob/living/carbon/human/proc/trait_tutorial return //Applying trait to preferences rather than just us. diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm new file mode 100644 index 00000000000..05aff46d1ff --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm @@ -0,0 +1,76 @@ +/* +A new Ability given to those human mobs that have a non-zero number of traits. +Verb is added by /datum/trait/proc/apply() in code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm file. +This proc gets called whenever the user is spawned, resleeved, autoresleeved and so forth. +If there are special cases that do NOT call this var that result in a completely new body - +I will fix it once I am informed of their existence. +Been tested - does NOT lead to multiples of the verb thanks to the |=. +Given the apply() proc is only called if they have verbs - this should avoid it erronously popping up for traitless people. + +This ability intends to retrieve all positive, neutral and negative traits chosen in the character set-up +then retrieve their relevant vars by assuming the character's species has the full list. This should always work. Should + +The ability is intended to be developed both as a to_chat() and a tgui window. +The user is given the ability to choose which they would like whenever they press the ability to better suit whatever scenario they find themselves +thirsty for knowledge. + +When adding new tutorials for trait subtypes, use
rather than \n newlines + +TGUI backend path: code\modules\tgui\modules\trait_tutorial_tgui.dm +TGUI frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx +*/ + + + + + +/mob/living/carbon/human/proc/trait_tutorial() + set name = "Explain Custom Traits" + set desc = "Click this verb to obtain a detailed tutorial on your selected traits. " + set category = "Abilities" + var/datum/tgui_module/trait_tutorial_tgui/fancy_UI + if(!fancy_UI) + fancy_UI = new /datum/tgui_module/trait_tutorial_tgui/ //Preventing a bunch of instances being spawned all over the place. Hopefully + + + + var/list/list_of_traits = species.traits + if(!LAZYLEN(list_of_traits)) //Although we shouldn't show up if no traits, leaving this in case someone loses theirs after (re)spawning. + to_chat(usr, SPAN_NOTICE("You do not have any custom traits!")) + return //Dont want an empty TGUI panel and list by accident after all. + + + var/UI_choice = tgui_alert(src, "Would you like the tutorial text to be printed to chat?", "Choose preferred tutorial interface", list("TGUI","To Chat", "Cancel")) + if(UI_choice == "Cancel") + return + + //Initializing associative lists + var/trait_names = list() //List of keys + var/trait_category = list() // name:category + var/trait_desc = list() // name:desc + var/trait_tutorial = list() //name:tutorial + for(var/trait in list_of_traits) + var/datum/trait/T = all_traits[trait] + trait_names += T.name + trait_desc[T.name] = T.desc + trait_tutorial[T.name] = T.tutorial + switch(T.category) + if(TRAIT_TYPE_NEGATIVE) + trait_category[T.name] = "Negative Trait" + if(TRAIT_TYPE_NEUTRAL) + trait_category[T.name] = "Neutral Trait" + if(TRAIT_TYPE_POSITIVE) + trait_category[T.name] = "Positive Trait" + + + if(UI_choice == "To Chat") + var/to_chat_choice = tgui_input_list(usr, "Please choose the trait to be explained", "Print to Chat", trait_names, null) + if(to_chat_choice) + to_chat(usr,SPAN_NOTICE("Name: [to_chat_choice] \n Category: [trait_category[to_chat_choice]] \n Description: [trait_desc[to_chat_choice]] \n \ + Guide: \n [trait_tutorial[to_chat_choice]]")) + + + else if(UI_choice == "TGUI") + + fancy_UI.set_vars(trait_names, trait_category, trait_desc, trait_tutorial) + fancy_UI.tgui_interact(usr) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index ca99f6ec32f..fb761a167bb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -28,6 +28,7 @@ selective_preference = client.prefs_vr.selective_preference appendage_color = client.prefs_vr.appendage_color appendage_alt_setting = client.prefs_vr.appendage_alt_setting + eating_privacy_global = client.prefs_vr.eating_privacy_global drop_vore = client.prefs_vr.drop_vore stumble_vore = client.prefs_vr.stumble_vore diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index 63aa9f57540..9db4b297827 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -916,4 +916,11 @@ icon_state = "zaprat" extra_overlay = "zaprat-tips" do_colouration = 1 - color_blend_mode = ICON_MULTIPLY \ No newline at end of file + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kara //SatinIsle Fluff Item + name = "Pterokara horn" + desc = "" + icon = 'icons/mob/vore/ears_vr.dmi' + icon_state = "kara_horn" + ckeys_allowed = list("satinisle") \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm index 85bb90c1cba..08c0d4e0152 100644 --- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -975,3 +975,9 @@ color_blend_mode = ICON_MULTIPLY body_parts = list(BP_R_LEG, BP_L_LEG, BP_GROIN) +/datum/sprite_accessory/marking/vr/nevrean_long + name = "Long Snout" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "nevrean_long" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) 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 8e3e3f7c12a..bc29290da62 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1337,6 +1337,12 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/tail/kara //SatinIsle fluff item + name = "Pterokara Tail" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "kara_tail" + ckeys_allowed = list("satinisle") + //LONG TAILS ARE NOT TAUR BUTTS >:O /datum/sprite_accessory/tail/longtail name = "You should not see this..." diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm index aba84d495bd..94db4dee96f 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -319,3 +319,10 @@ icon_state = "sectdrone_wing" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/kara //SatinIsle Fluff Item + name = "Pterokara wings" + desc = "" + icon = 'icons/mob/vore/wings_vr.dmi' + icon_state = "feathered_kara" + ckeys_allowed = list("satinisle") \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8d0002f0daf..25e9e9c9bf8 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -79,6 +79,8 @@ var/sel_mode = 1 //index of the currently selected mode var/list/firemodes = list() + var/reload_time = 1 //Base reload time in seconds + //aiming system stuff var/keep_aim = 1 //1 for keep shooting until aim is lowered //0 for one bullet after tarrget moves and aim is lowered diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index cf684200457..49d53b2babf 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -14,6 +14,8 @@ var/modifystate var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge + reload_time = 5 //Energy weapons are slower to reload than ballistics by default, but this is no change from current values + //self-recharging var/self_recharge = 0 //if set, the weapon will recharge itself var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically @@ -113,8 +115,8 @@ if(!power_supply) return null if(!ispath(projectile_type)) return null if(!power_supply.checked_use(charge_cost)) return null - var/mob/living/M = loc // TGMC Ammo HUD - if(istype(M)) // TGMC Ammo HUD + var/mob/living/M = loc // TGMC Ammo HUD + if(istype(M)) // TGMC Ammo HUD M?.hud_used.update_ammo_hud(M, src) return new projectile_type(src) @@ -129,7 +131,7 @@ to_chat(user, "[src] already has a power cell.") else user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") - if(do_after(user, 5 * P.w_class)) + if(do_after(user, reload_time * P.w_class)) user.remove_from_mob(P) power_supply = P P.loc = src diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 92ca4535fc5..4769aef9999 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -17,6 +17,8 @@ var/load_method = SINGLE_CASING|SPEEDLOADER //1 = Single shells, 2 = box or quick loader, 3 = magazine var/obj/item/ammo_casing/chambered = null + reload_time = 1 //Ballistics reload fast, but not instantly + //For SINGLE_CASING or SPEEDLOADER guns var/max_shells = 0 //the number of casings that will fit inside var/ammo_type = null //the type of ammo that the gun comes preloaded with @@ -54,9 +56,9 @@ chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] if(handle_casings != HOLD_CASINGS) ammo_magazine.stored_ammo -= chambered - - var/mob/living/M = loc // TGMC Ammo HUD - if(istype(M)) // TGMC Ammo HUD + + var/mob/living/M = loc // TGMC Ammo HUD + if(istype(M)) // TGMC Ammo HUD M?.hud_used.update_ammo_hud(M, src) if (chambered) @@ -102,9 +104,9 @@ if(handle_casings != HOLD_CASINGS) chambered = null - - var/mob/living/M = loc // TGMC Ammo HUD - if(istype(M)) // TGMC Ammo HUD + + var/mob/living/M = loc // TGMC Ammo HUD + if(istype(M)) // TGMC Ammo HUD M?.hud_used.update_ammo_hud(M, src) @@ -121,12 +123,13 @@ if(ammo_magazine) to_chat(user, "[src] already has a magazine loaded.") //already a magazine here return - user.remove_from_mob(AM) - AM.loc = src - ammo_magazine = AM - user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].") - user.hud_used.update_ammo_hud(user, src) - playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) + if(do_after(user, reload_time * AM.w_class)) + user.remove_from_mob(AM) + AM.loc = src + ammo_magazine = AM + user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].") + user.hud_used.update_ammo_hud(user, src) + playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) if(SPEEDLOADER) if(loaded.len >= max_shells) to_chat(user, "[src] is full!") @@ -140,11 +143,12 @@ loaded += C AM.stored_ammo -= C //should probably go inside an ammo_magazine proc, but I guess less proc calls this way... count++ - user.hud_used.update_ammo_hud(user, src) - if(count) - user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].") - user.hud_used.update_ammo_hud(user, src) - playsound(src, 'sound/weapons/empty.ogg', 50, 1) + user.hud_used.update_ammo_hud(user, src) + if(do_after(user, reload_time * AM.w_class)) + if(count) + user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].") + user.hud_used.update_ammo_hud(user, src) + playsound(src, 'sound/weapons/empty.ogg', 50, 1) AM.update_icon() else if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/C = A @@ -154,11 +158,12 @@ to_chat(user, "[src] is full.") return - user.remove_from_mob(C) - C.loc = src - loaded.Insert(1, C) //add to the head of the list - user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].") - playsound(src, 'sound/weapons/empty.ogg', 50, 1) + if(do_after(user, reload_time * C.w_class)) + user.remove_from_mob(C) + C.loc = src + loaded.Insert(1, C) //add to the head of the list + user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].") + playsound(src, 'sound/weapons/empty.ogg', 50, 1) else if(istype(A, /obj/item/weapon/storage)) var/obj/item/weapon/storage/storage = A @@ -179,7 +184,7 @@ sleep(1 SECOND) update_icon() - user.hud_used.update_ammo_hud(user, src) + user.hud_used.update_ammo_hud(user, src) //attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled /obj/item/weapon/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump=1) @@ -189,7 +194,7 @@ playsound(src, 'sound/weapons/empty.ogg', 50, 1) ammo_magazine.update_icon() ammo_magazine = null - user.hud_used.update_ammo_hud(user, src) + user.hud_used.update_ammo_hud(user, src) else if(loaded.len) //presumably, if it can be speed-loaded, it can be speed-unloaded. if(allow_dump && (load_method & SPEEDLOADER)) @@ -208,11 +213,11 @@ user.put_in_hands(C) user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].") playsound(src, 'sound/weapons/empty.ogg', 50, 1) - user.hud_used.update_ammo_hud(user, src) + user.hud_used.update_ammo_hud(user, src) else to_chat(user, "[src] is empty.") update_icon() - user.hud_used.update_ammo_hud(user, src) + user.hud_used.update_ammo_hud(user, src) /obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob) ..() @@ -243,7 +248,7 @@ ammo_magazine.update_icon() ammo_magazine = null update_icon() //make sure to do this after unsetting ammo_magazine - user.hud_used.update_ammo_hud(user, src) + user.hud_used.update_ammo_hud(user, src) /obj/item/weapon/gun/projectile/examine(mob/user) . = ..() @@ -320,7 +325,7 @@ for(var/obj/item/ammo_casing/bullet in ammo_magazine.stored_ammo) if(bullet.BB) shots_left++ - + if(shots_left > 0) return shots_left else @@ -332,7 +337,7 @@ for(var/obj/item/ammo_casing/bullet in loaded) if(bullet.BB) // Only increment how many shots we have left if we're loaded. shots_left++ - + if(shots_left > 0) return shots_left else diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 2416f688266..86d298d0542 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -322,6 +322,7 @@ var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc) src.transfer_fingerprints_to(P) P.set_dir(dir) + P.target = get_ranged_target_turf(src, dir, 10) //TODO: replace this with a proc parameter or other cleaner var/obj/structure/disposalpipe/trunk/Trunk = CP Trunk.linked = P diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index cfd8db13688..88e7c90a0fb 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -1,7 +1,8 @@ -/** - * tgui external +/*! + * External tgui definitions, such as src_object APIs. * - * Contains all external tgui declarations. + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT */ /** diff --git a/code/modules/tgui/modules/trait_tutorial_tgui.dm b/code/modules/tgui/modules/trait_tutorial_tgui.dm new file mode 100644 index 00000000000..68c8afe350c --- /dev/null +++ b/code/modules/tgui/modules/trait_tutorial_tgui.dm @@ -0,0 +1,48 @@ +/* +Verb/Main definition path: code\modules\mob\living\carbon\human\species\station\traits_vr\traits_tutorial.dm +Frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx +*/ + +/datum/tgui_module/trait_tutorial_tgui + name = "Explain Custom Traits" + tgui_id = "TraitTutorial" + var/trait_names = list() + var/trait_category = list() // name:category + var/trait_desc = list() // name:desc + var/trait_tutorial = list() //name:tutorial + var/trait_selected = "" + +/datum/tgui_module/trait_tutorial_tgui/proc/set_vars(list/names, list/categories, list/descriptions, list/tutorials) + trait_names = names + trait_category = categories + trait_desc = descriptions + trait_tutorial = tutorials + +/datum/tgui_module/trait_tutorial_tgui/tgui_interact(mob/living/carbon/human/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, tgui_id, name) + ui.open() + +/datum/tgui_module/trait_tutorial_tgui/tgui_data(mob/user) + var/list/data = list() + data["names"] = trait_names //passes a list of strings + data["descriptions"] = trait_desc //passes an assoc list as obj + data["categories"] = trait_category //passes an assoc list as obj + data["tutorials"] = trait_tutorial //passes an assoc list as obj + data["selection"] = trait_selected //passes a string + return data + +/datum/tgui_module/trait_tutorial_tgui/tgui_act(action, params) + . = ..() + if(.) + return + if(action == "select_trait") + var/selection = params["name"] + trait_selected = selection + + + . = TRUE + +/datum/tgui_module/trait_tutorial_tgui/tgui_state(mob/user) + return GLOB.tgui_always_state diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 5a66efc090d..ab80a41bd50 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -1,6 +1,9 @@ -/** +/*! * Base state and helpers for states. Just does some sanity checks, * implement a proper state for in-depth checks. + * + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT */ /** diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm index 7009f6f8844..bfa877bc096 100644 --- a/code/modules/tgui/states/admin.dm +++ b/code/modules/tgui/states/admin.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: admin_state * diff --git a/code/modules/tgui/states/always.dm b/code/modules/tgui/states/always.dm index 30915785442..9095d043505 100644 --- a/code/modules/tgui/states/always.dm +++ b/code/modules/tgui/states/always.dm @@ -1,3 +1,7 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ /** * tgui state: always_state diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm index 6bc0c7ec031..7213a99be7f 100644 --- a/code/modules/tgui/states/conscious.dm +++ b/code/modules/tgui/states/conscious.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: conscious_state * diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm index c2fbd0b6b06..e16159c5e54 100644 --- a/code/modules/tgui/states/contained.dm +++ b/code/modules/tgui/states/contained.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: contained_state * diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm index 14419874538..3d0913cf82f 100644 --- a/code/modules/tgui/states/deep_inventory.dm +++ b/code/modules/tgui/states/deep_inventory.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: deep_inventory_state * diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 93ba1df55f7..2fe058f3e09 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: default_state * diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm index 0981b5d6ec7..9d742a4ab0b 100644 --- a/code/modules/tgui/states/hands.dm +++ b/code/modules/tgui/states/hands.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: hands_state * diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm index 8164d5f9cee..845459e0717 100644 --- a/code/modules/tgui/states/human_adjacent.dm +++ b/code/modules/tgui/states/human_adjacent.dm @@ -1,3 +1,7 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ /** * tgui state: human_adjacent_state diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm index 92274cc1f2e..042ca7264cc 100644 --- a/code/modules/tgui/states/inventory.dm +++ b/code/modules/tgui/states/inventory.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: inventory_state * diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm index 1185b516478..49f6d0097a8 100644 --- a/code/modules/tgui/states/not_incapacitated.dm +++ b/code/modules/tgui/states/not_incapacitated.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: not_incapacitated_state * diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm index 56b789e3c04..452d0f649bc 100644 --- a/code/modules/tgui/states/notcontained.dm +++ b/code/modules/tgui/states/notcontained.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: notcontained_state * diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm index bdfe690dbaa..f20bb1b71ff 100644 --- a/code/modules/tgui/states/observer.dm +++ b/code/modules/tgui/states/observer.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: observer_state * @@ -12,4 +17,3 @@ GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new) if(check_rights(R_ADMIN|R_EVENT, 0, src)) return STATUS_INTERACTIVE return STATUS_CLOSE - diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm index 9712090b5da..dc7f93d2ee7 100644 --- a/code/modules/tgui/states/physical.dm +++ b/code/modules/tgui/states/physical.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: physical_state * @@ -72,4 +77,4 @@ GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigs return max(STATUS_UPDATE, shared_living_tgui_distance_bigscreen(src_object)) // Silicons can always see. /mob/living/silicon/ai/physical_can_use_tgui_topic(src_object) - return STATUS_UPDATE // AIs are not physical. \ No newline at end of file + return STATUS_UPDATE // AIs are not physical. diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm index 109fd6ae440..064b1b0ce66 100644 --- a/code/modules/tgui/states/self.dm +++ b/code/modules/tgui/states/self.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: self_state * diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm index a589a4b64d7..3e7d84e2621 100644 --- a/code/modules/tgui/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -1,3 +1,8 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + /** * tgui state: z_state * diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 74d16a2e33d..29431c42f3b 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -1,7 +1,6 @@ -/** - * tgui - * - * /tg/station user interface library +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT */ /** diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index f115fdde63c..614f9e142ec 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -39,6 +39,11 @@ return input(user, message, title, default) as message|null else return input(user, message, title, default) as text|null + + //Client has TGUI input lock on; override whatever prevent_enter was specified beforehand + if(user.client.prefs.tgui_input_lock) + prevent_enter = TRUE + var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout, prevent_enter) text_input.tgui_interact(user) text_input.wait() diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 2ae59893136..02960e0a4bd 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -54,6 +54,7 @@ var/emote_active = TRUE // Are we even giving emotes out at all or not? var/next_emote = 0 // When we're supposed to print our next emote, as a world.time var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to? + var/eating_privacy_local = "default" //Overrides eating_privacy_global if not "default". Determines if attempt/success messages are subtle/loud // Generally just used by AI var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location @@ -226,7 +227,8 @@ "belly_fullscreen_color", "colorization_enabled", "egg_type", - "save_digest_mode" + "save_digest_mode", + "eating_privacy_local" ) if (save_digest_mode == 1) @@ -391,16 +393,28 @@ if(!ishuman(owner)) owner.update_icons() + //Determines privacy + var/privacy_range = world.view + var/privacy_volume = 100 + switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched + if("default") + if(owner.eating_privacy_global) + privacy_range = 1 + privacy_volume = 25 + if("subtle") + privacy_range = 1 + privacy_volume = 25 + //Print notifications/sound if necessary if(!silent && count) - owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!") + owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!", range = privacy_range) var/soundfile if(!fancy_vore) soundfile = classic_release_sounds[release_sound] else soundfile = fancy_release_sounds[release_sound] if(soundfile) - playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) + playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) return count @@ -459,16 +473,28 @@ if(!ishuman(owner)) owner.update_icons() + //Determines privacy + var/privacy_range = world.view + var/privacy_volume = 100 + switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched + if("default") + if(owner.eating_privacy_global) + privacy_range = 1 + privacy_volume = 25 + if("subtle") + privacy_range = 1 + privacy_volume = 25 + //Print notifications/sound if necessary if(!silent) - owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!") + owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!",range = privacy_range) var/soundfile if(!fancy_vore) soundfile = classic_release_sounds[release_sound] else soundfile = fancy_release_sounds[release_sound] if(soundfile) - playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) + playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) //Should fix your view not following you out of mobs sometimes! if(ismob(M)) var/mob/ourmob = M @@ -1187,6 +1213,7 @@ dupe.emote_active = emote_active dupe.selective_preference = selective_preference dupe.save_digest_mode = save_digest_mode + dupe.eating_privacy_local = eating_privacy_local //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index f7e9f6d9526..7a7a3ac8a85 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -26,27 +26,56 @@ skull_type = /obj/item/weapon/digestion_remains/skull/vox /obj/belly/proc/handle_remains_leaving(var/mob/living/M) - if(!ishuman(M)) //Are we even humanoid? + if(!ishuman(M) && !isrobot(M)) //Are we even humanoid or a borg? return + //Moving some vars here for both borgs and carbons to use + var/bones_amount = rand(2,4) //some random variety in amount of bones left + if(isrobot(M)) //If borg, handle differently + //var/mob/living/silicon/robot/R = M // Not Needed at the moment. Uncomment if you need borg stuff + + var/list/borg_bones = list( //Borg bones are the same at this point. might change in the future if borgs or synths get + /obj/item/weapon/digestion_remains/synth, // different remains in the future. + /obj/item/weapon/digestion_remains/synth/variant1, + /obj/item/weapon/digestion_remains/synth/variant2, + /obj/item/weapon/digestion_remains/synth/variant3 + ) + for(var/i = 1, i <= bones_amount, i++) //Just fill them with bones. Borgs dont have anything special. + var/new_bone = pick(borg_bones) + new new_bone(src,owner) + return //Dont need to do carbon stuff after this + var/mob/living/carbon/human/H = M - if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave + if((H.species.name in remainless_species)) //Don't leave anything if there is nothing to leave return - var/bones_amount = rand(2,3) //some random variety in amount of bones left - if(prob(20)) //ribcage surviving whole is some luck + if(prob(20) && !H.isSynthetic()) //ribcage surviving whole is some luck //Edit: no robor new /obj/item/weapon/digestion_remains/ribcage(src,owner) bones_amount-- - while(bones_amount) //throw in the rest - new /obj/item/weapon/digestion_remains(src,owner) - bones_amount-- + var/list/organic_bones = list( //Generic bone variation system + /obj/item/weapon/digestion_remains, + /obj/item/weapon/digestion_remains/variant1, + /obj/item/weapon/digestion_remains/variant2, + /obj/item/weapon/digestion_remains/variant3 + ) + var/list/synthetic_bones = list( + /obj/item/weapon/digestion_remains/synth, + /obj/item/weapon/digestion_remains/synth/variant1, + /obj/item/weapon/digestion_remains/synth/variant2, + /obj/item/weapon/digestion_remains/synth/variant3 + ) + for(var/i = 1, i <= bones_amount, i++) //throw in the rest + var/new_bone = H.isSynthetic() ? pick(synthetic_bones) : pick(organic_bones) + new new_bone(src,owner) + if(H.isSynthetic()) // Synths dont have skulls, atleast not any that survive digestion. + return // TODO: add synth skulls and remove this. var/skull_amount = 1 if(H.species.skull_type) new H.species.skull_type(src, owner) skull_amount-- - + if(skull_amount && H.species.selects_bodytype) // We still haven't found correct skull... if(H.species.base_species == SPECIES_HUMAN) @@ -62,7 +91,9 @@ name = "bone" desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from." icon = 'icons/obj/bones_vr.dmi' - icon_state = "generic" + icon_state = "generic-1" + drop_sound = 'sound/items/drop/wooden.ogg' //sounds kinda like a bone + pickup_sound = 'sound/items/pickup/woodweapon.ogg' force = 0 throwforce = 0 item_state = "bone" @@ -70,6 +101,13 @@ var/pred_ckey var/pred_name +/obj/item/weapon/digestion_remains/synth + name = "ruined component" + desc = "A ruined component. It seems to have come from some sort of robotic entity, but there's no telling what kind." + icon_state = "synth-1" + drop_sound = 'sound/items/drop/device.ogg' //not organic bones, so they get different sounds + pickup_sound = 'sound/items/pickup/device.ogg' + /obj/item/weapon/digestion_remains/Initialize(var/mapload, var/mob/living/pred) . = ..() if(!mapload) @@ -86,6 +124,24 @@ desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to." icon_state = "ribcage" +/obj/item/weapon/digestion_remains/variant1 //Generic bone variations + icon_state = "generic-2" + +/obj/item/weapon/digestion_remains/variant2 + icon_state = "generic-3" + +/obj/item/weapon/digestion_remains/variant3 + icon_state = "generic-4" + +/obj/item/weapon/digestion_remains/synth/variant1 //synthbones start + icon_state = "synth-2" + +/obj/item/weapon/digestion_remains/synth/variant2 + icon_state = "synth-3" + +/obj/item/weapon/digestion_remains/synth/variant3 + icon_state = "synth-4" + /obj/item/weapon/digestion_remains/skull name = "skull" desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human." diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 9e37b888cea..66739c747b6 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -50,6 +50,7 @@ var/selective_preference = DM_DEFAULT // Preference for selective bellymode var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait. var/appendage_alt_setting = FALSE // Dictates if 'long_vore' user pulls prey to them or not. 1 = user thrown towards target. + var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var var/regen_sounds = list( 'sound/effects/mob_effects/xenochimera/regen_1.ogg', 'sound/effects/mob_effects/xenochimera/regen_2.ogg', @@ -286,6 +287,7 @@ P.slip_vore = src.slip_vore P.throw_vore = src.throw_vore P.stumble_vore = src.stumble_vore + P.eating_privacy_global = src.eating_privacy_global P.nutrition_message_visible = src.nutrition_message_visible P.nutrition_messages = src.nutrition_messages @@ -335,6 +337,7 @@ slip_vore = P.slip_vore throw_vore = P.throw_vore stumble_vore = P.stumble_vore + eating_privacy_global = P.eating_privacy_global nutrition_message_visible = P.nutrition_message_visible nutrition_messages = P.nutrition_messages @@ -600,6 +603,18 @@ to_chat(user, "They aren't aren't in a state to be devoured.") return FALSE + //Determining vore attempt privacy + var/message_range = world.view + if(!pred.is_slipping && !prey.is_slipping) //We only care about privacy preference if it's NOT a spontaneous vore. + switch(belly.eating_privacy_local) //if("loud") case not added, as it would not modify message_range + if("default") + if(pred.eating_privacy_global) + message_range = 1 + if("subtle") + message_range = 1 + + + // Slipnoms from chompstation downstream, credit to cadyn for the original PR. // Prepare messages if(prey.is_slipping) @@ -616,7 +631,10 @@ success_msg = "[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!" // Announce that we start the attempt! - user.visible_message(attempt_msg) + + + user.visible_message(attempt_msg, range = message_range) + // Now give the prey time to escape... return if they did var/swallow_time @@ -633,7 +651,7 @@ return FALSE // Prey escpaed (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! - user.visible_message(success_msg) + user.visible_message(success_msg, range = message_range) // Actually shove prey into the belly. if(istype(prey.loc, /obj/item/weapon/holder)) @@ -1079,6 +1097,7 @@ dispvoreprefs += "Spontaneous transformation: [allow_spontaneous_tf ? "Enabled" : "Disabled"]
" dispvoreprefs += "Can be stepped on/over: [step_mechanics_pref ? "Allowed" : "Disallowed"]
" dispvoreprefs += "Can be picked up: [pickup_pref ? "Allowed" : "Disallowed"]
" + dispvoreprefs += "Global Vore Privacy is: [eating_privacy_global ? "Subtle" : "Loud"]
" user << browse("Vore prefs: [src]
[dispvoreprefs]
", "window=[name]mvp;size=300x400;can_resize=1;can_minimize=0") onclose(user, "[name]") return diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index 2228c9cfb68..7911fcc09f1 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -55,6 +55,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/allowmobvore = TRUE var/permit_healbelly = TRUE var/noisy = FALSE + var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var // These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings. var/drop_vore = TRUE @@ -192,6 +193,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE nutrition_messages = json_from_file["nutrition_messages"] weight_message_visible = json_from_file["weight_message_visible"] weight_messages = json_from_file["weight_messages"] + eating_privacy_global = json_from_file["eating_privacy_global"] //Quick sanitize if(isnull(digestable)) @@ -246,6 +248,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE nutrition_message_visible = TRUE if(isnull(weight_message_visible)) weight_message_visible = TRUE + if(isnull(eating_privacy_global)) + eating_privacy_global = FALSE if(isnull(nutrition_messages)) nutrition_messages = list( "They are starving! You can hear their stomach snarling from across the room!", @@ -316,6 +320,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE "nutrition_messages" = nutrition_messages, "weight_message_visible" = weight_message_visible, "weight_messages" = weight_messages, + "eating_privacy_global" = eating_privacy_global, ) //List to JSON diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 54c0dc25a52..4a222d72ce2 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -191,6 +191,7 @@ "belly_fullscreen" = selected.belly_fullscreen, "belly_fullscreen_color" = selected.belly_fullscreen_color, "colorization_enabled" = selected.colorization_enabled, + "eating_privacy_local" = selected.eating_privacy_local ) var/list/addons = list() @@ -284,7 +285,8 @@ "nutrition_message_visible" = host.nutrition_message_visible, "nutrition_messages" = host.nutrition_messages, "weight_message_visible" = host.weight_message_visible, - "weight_messages" = host.weight_messages + "weight_messages" = host.weight_messages, + "eating_privacy_global" = host.eating_privacy_global ) return data @@ -450,6 +452,12 @@ host.client.prefs_vr.digestable = host.digestable unsaved_changes = TRUE return TRUE + if("toggle_global_privacy") + host.eating_privacy_global = !host.eating_privacy_global + if(host.client.prefs_vr) + host.eating_privacy_global = host.eating_privacy_global + unsaved_changes = TRUE + return TRUE if("toggle_devour") host.devourable = !host.devourable if(host.client.prefs_vr) @@ -1101,6 +1109,12 @@ host.vore_selected.release_verb = new_release_verb . = TRUE + if("b_eating_privacy") + var/privacy_choice = tgui_input_list(usr, "Choose your belly-specific preference. Default uses global preference!", "Eating message privacy", list("default", "subtle", "loud"), "default") + if(privacy_choice == null) + return FALSE + host.vore_selected.eating_privacy_local = privacy_choice + . = TRUE if("b_fancy_sound") host.vore_selected.fancy_vore = !host.vore_selected.fancy_vore host.vore_selected.vore_sound = "Gulp" diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index 20ea7baa0be..eb98a0ae762 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -245,6 +245,7 @@ new_mob.vore_smell = vore_smell new_mob.nutrition_message_visible = nutrition_message_visible new_mob.allow_spontaneous_tf = allow_spontaneous_tf + new_mob.eating_privacy_global = eating_privacy_global /////SUBTYPES///// diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 3f2c5964db5..440e35dbf25 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -111,6 +111,9 @@ pastelprincedan - Protean pearlprophet - Protean pemdesos - Protean phoenixx0 - Vox +pontifexminimus - Black-Eyed Shadekin +pontifexminimus - Protean +pontifexminimus - Xenochimera qrocakes - Black-Eyed Shadekin radiantaurora - Protean residentcody - Black-Eyed Shadekin diff --git a/icons/inventory/accessory/item.dmi b/icons/inventory/accessory/item.dmi index b17ed5c1e2e..568c866874d 100644 Binary files a/icons/inventory/accessory/item.dmi and b/icons/inventory/accessory/item.dmi differ diff --git a/icons/inventory/accessory/mob.dmi b/icons/inventory/accessory/mob.dmi index 8858b2f5805..b5bb6eff556 100644 Binary files a/icons/inventory/accessory/mob.dmi and b/icons/inventory/accessory/mob.dmi differ diff --git a/icons/inventory/eyes/item.dmi b/icons/inventory/eyes/item.dmi index f63df487f2f..0d3623eb408 100644 Binary files a/icons/inventory/eyes/item.dmi and b/icons/inventory/eyes/item.dmi differ diff --git a/icons/inventory/eyes/mob.dmi b/icons/inventory/eyes/mob.dmi index 5efd06109e5..ecc8ccd7c87 100644 Binary files a/icons/inventory/eyes/mob.dmi and b/icons/inventory/eyes/mob.dmi differ diff --git a/icons/inventory/face/mob_vr_fennec.dmi b/icons/inventory/face/mob_vr_fennec.dmi index e956562a590..4179157c787 100644 Binary files a/icons/inventory/face/mob_vr_fennec.dmi and b/icons/inventory/face/mob_vr_fennec.dmi differ diff --git a/icons/inventory/face/mob_vr_fox.dmi b/icons/inventory/face/mob_vr_fox.dmi index aed2ae8eced..1f3ed5263b9 100644 Binary files a/icons/inventory/face/mob_vr_fox.dmi and b/icons/inventory/face/mob_vr_fox.dmi differ diff --git a/icons/inventory/face/mob_vr_sergal.dmi b/icons/inventory/face/mob_vr_sergal.dmi index 99d4a069ef4..6a2fdb781df 100644 Binary files a/icons/inventory/face/mob_vr_sergal.dmi and b/icons/inventory/face/mob_vr_sergal.dmi differ diff --git a/icons/inventory/feet/item.dmi b/icons/inventory/feet/item.dmi index 37cd05ce5e5..51aa74dbc8d 100644 Binary files a/icons/inventory/feet/item.dmi and b/icons/inventory/feet/item.dmi differ diff --git a/icons/inventory/feet/mob.dmi b/icons/inventory/feet/mob.dmi index 6c3603fd8ab..7aafeee41d4 100644 Binary files a/icons/inventory/feet/mob.dmi and b/icons/inventory/feet/mob.dmi differ diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi index c184d1888d6..47d3e4ef83d 100644 Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi index aded629d431..68d6262d98e 100644 Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ diff --git a/icons/inventory/head/mob_vr_vulpkanin.dmi b/icons/inventory/head/mob_vr_vulpkanin.dmi index 7da329c30a7..d82fece7caf 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/suit/item.dmi b/icons/inventory/suit/item.dmi index ccaed21c383..2ca5afa8fbb 100644 Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi index fdf7d8be3f5..66f4a55e12f 100644 Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ diff --git a/icons/inventory/uniform/item.dmi b/icons/inventory/uniform/item.dmi index 1102094c31a..0cc9ef154a3 100644 Binary files a/icons/inventory/uniform/item.dmi and b/icons/inventory/uniform/item.dmi differ diff --git a/icons/inventory/uniform/mob.dmi b/icons/inventory/uniform/mob.dmi index 7f69ac69388..5d36de239b8 100644 Binary files a/icons/inventory/uniform/mob.dmi and b/icons/inventory/uniform/mob.dmi differ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 672985eeec6..755050fe4af 100644 Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ diff --git a/icons/mob/items/lefthand_balls_vr.dmi b/icons/mob/items/lefthand_balls_vr.dmi index 70455d01c20..9c34b823a58 100644 Binary files a/icons/mob/items/lefthand_balls_vr.dmi and b/icons/mob/items/lefthand_balls_vr.dmi differ diff --git a/icons/mob/items/righthand_balls_vr.dmi b/icons/mob/items/righthand_balls_vr.dmi index 286540595d5..c1030a143c9 100644 Binary files a/icons/mob/items/righthand_balls_vr.dmi and b/icons/mob/items/righthand_balls_vr.dmi differ diff --git a/icons/mob/mouthball_vr.dmi b/icons/mob/mouthball_vr.dmi index f3c605ab56e..3fb8a228208 100644 Binary files a/icons/mob/mouthball_vr.dmi and b/icons/mob/mouthball_vr.dmi differ diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 0da5ddb7266..a9a4980b58d 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index d55293ae14f..a842bfd6ce8 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi index cdcac1d4cde..3eb91889e58 100644 Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ diff --git a/icons/obj/balls_vr.dmi b/icons/obj/balls_vr.dmi index e85f4cab05d..6900c2df12f 100644 Binary files a/icons/obj/balls_vr.dmi and b/icons/obj/balls_vr.dmi differ diff --git a/icons/obj/bones_vr.dmi b/icons/obj/bones_vr.dmi index aef73ed7563..103fceb06eb 100644 Binary files a/icons/obj/bones_vr.dmi and b/icons/obj/bones_vr.dmi differ diff --git a/icons/obj/food_snacks.dmi b/icons/obj/food_snacks.dmi index 2bf14581c0d..84350f88bf3 100644 Binary files a/icons/obj/food_snacks.dmi and b/icons/obj/food_snacks.dmi differ diff --git a/icons/obj/hydroponics_machines_vr.dmi b/icons/obj/hydroponics_machines_vr.dmi index 1b767937f44..4a097b9c00c 100644 Binary files a/icons/obj/hydroponics_machines_vr.dmi and b/icons/obj/hydroponics_machines_vr.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 0d1d14c56ed..16fc3a25e8e 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/storage_vr.dmi b/icons/obj/storage_vr.dmi index 268d1c827d8..04f8d08b6ee 100644 Binary files a/icons/obj/storage_vr.dmi and b/icons/obj/storage_vr.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 99c2939c7e0..e3663011dda 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 562496523fb..9497aaf55f5 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/obj/vending_smartfridge.dmi b/icons/obj/vending_smartfridge.dmi new file mode 100644 index 00000000000..37074419b65 Binary files /dev/null and b/icons/obj/vending_smartfridge.dmi differ diff --git a/maps/groundbase/gb-centcomm.dmm b/maps/groundbase/gb-centcomm.dmm index 1d31b107c56..4fa63e3b8b4 100644 --- a/maps/groundbase/gb-centcomm.dmm +++ b/maps/groundbase/gb-centcomm.dmm @@ -4405,12 +4405,6 @@ /obj/item/weapon/book/manual/security_space_law, /turf/simulated/floor/tiled, /area/centcom/security) -"pf" = ( -/obj/structure/bed/chair/shuttle{ - dir = 4 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) "pg" = ( /obj/structure/table/standard, /turf/simulated/floor/carpet, @@ -7858,6 +7852,12 @@ /obj/effect/floor_decal/corner/paleblue/bordercorner2, /turf/simulated/floor/tiled/white, /area/centcom/medical) +"Af" = ( +/obj/machinery/item_bank{ + pixel_y = 25 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "Ai" = ( /obj/structure/sign/department/armory, /turf/simulated/floor/tiled, @@ -9127,6 +9127,17 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/tiled, /area/centcom/command) +"ET" = ( +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9, +/obj/machinery/item_bank{ + dir = 8; + pixel_x = 25 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "EV" = ( /obj/item/weapon/storage/box/evidence, /obj/item/weapon/folder/red, @@ -21031,9 +21042,9 @@ SA tQ tQ Ll -pf -pf -pf +Sc +Sc +Sc jh Sc Sc @@ -29040,7 +29051,7 @@ dR Fo Fo Fo -Fo +ET Fo Fo Fo @@ -33702,7 +33713,7 @@ Lu bm qE wc -vd +Af vd vd vd diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index 55007f41dba..fd74501e4d0 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -2774,8 +2774,8 @@ }, /obj/machinery/button/remote/blast_door{ dir = 4; - pixel_x = -25; - id = "chem_room" + id = "chem_room"; + pixel_x = -25 }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/Chemistry) @@ -5088,14 +5088,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - dir = 8; - pixel_x = 28 - }, -/turf/simulated/floor/wood, -/area/groundbase/cargo/qm) +/turf/simulated/floor/tiled, +/area/groundbase/cargo/storage) "ou" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7271,7 +7265,13 @@ /turf/simulated/floor/wood, /area/groundbase/civilian/library) "uA" = ( -/obj/structure/closet/secure_closet/cargotech, +/obj/structure/table/standard, +/obj/item/clothing/under/pizzaguy, +/obj/item/clothing/under/pizzaguy, +/obj/item/clothing/under/pizzaguy, +/obj/item/clothing/head/pizzaguy, +/obj/item/clothing/head/pizzaguy, +/obj/item/clothing/head/pizzaguy, /turf/simulated/floor/tiled, /area/groundbase/cargo/storage) "uC" = ( @@ -7777,9 +7777,9 @@ /obj/structure/window/reinforced/full, /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular{ + dir = 4; id = "chem_room"; - name = "Chemistry Shutters"; - dir = 4 + name = "Chemistry Shutters" }, /turf/simulated/floor, /area/groundbase/medical/Chemistry) diff --git a/maps/stellar_delight/ship_centcom.dmm b/maps/stellar_delight/ship_centcom.dmm index f20a4ce113e..a29f00e50f2 100644 --- a/maps/stellar_delight/ship_centcom.dmm +++ b/maps/stellar_delight/ship_centcom.dmm @@ -2394,6 +2394,12 @@ }, /turf/simulated/floor/tiled/dark, /area/centcom/control) +"hK" = ( +/obj/machinery/item_bank{ + pixel_y = 28 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "hL" = ( /obj/machinery/door/airlock/centcom{ name = "Special Operations"; @@ -4050,6 +4056,17 @@ }, /turf/simulated/floor/tiled/dark, /area/centcom/security) +"of" = ( +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9, +/obj/machinery/item_bank{ + dir = 8; + pixel_x = 28 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "oj" = ( /obj/structure/bed/chair/sofa/bench/left{ dir = 4; @@ -29072,7 +29089,7 @@ vu Zy Zy Zy -Zy +of Zy Zy Zy @@ -33734,7 +33751,7 @@ Ll OA Xf as -VH +hK VH VH VH diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index 4938e34bf91..9b433defd3d 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -10741,6 +10741,7 @@ /turf/simulated/floor/tiled/dark, /area/security/security_lockerroom) "wf" = ( +/obj/machinery/alarm/angled, /turf/simulated/floor, /area/maintenance/security_port) "wg" = ( diff --git a/maps/submaps/engine_submaps_vr/tether/engine_sme.dmm b/maps/submaps/engine_submaps_vr/tether/engine_sme.dmm index 0b831f3f23c..8180975429b 100644 --- a/maps/submaps/engine_submaps_vr/tether/engine_sme.dmm +++ b/maps/submaps/engine_submaps_vr/tether/engine_sme.dmm @@ -134,6 +134,9 @@ /obj/machinery/atmospherics/pipe/manifold/visible/black{ dir = 1 }, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor, /area/engineering/engine_room) "az" = ( @@ -1591,6 +1594,10 @@ /obj/item/device/geiger/wall/south, /turf/template_noop, /area/template_noop) +"UW" = ( +/obj/machinery/light, +/turf/simulated/floor, +/area/engineering/engine_room) (1,1,1) = {" aa @@ -1966,7 +1973,7 @@ bQ cf cq cB -aE +UW cJ cY cN diff --git a/maps/tether/submaps/tether_centcom.dmm b/maps/tether/submaps/tether_centcom.dmm index 85049a7f99c..3333aeb76d4 100644 --- a/maps/tether/submaps/tether_centcom.dmm +++ b/maps/tether/submaps/tether_centcom.dmm @@ -1297,7 +1297,7 @@ /area/centcom/specops) "dG" = ( /obj/machinery/conveyor{ - dir = 4; + dir = 8; id = "QMLoad2" }, /turf/simulated/shuttle/floor, @@ -3500,6 +3500,12 @@ }, /turf/simulated/floor/tiled/white, /area/centcom/control) +"lB" = ( +/obj/machinery/item_bank{ + pixel_y = 28 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "lC" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -5470,6 +5476,17 @@ }, /turf/simulated/floor/tiled, /area/centcom/terminal) +"vF" = ( +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9, +/obj/machinery/item_bank{ + dir = 8; + pixel_x = 28 + }, +/turf/simulated/floor/tiled, +/area/centcom/living) "vG" = ( /obj/item/modular_computer/console/preset/civilian{ dir = 8 @@ -6597,10 +6614,10 @@ name = "Shuttle Hatch" }, /obj/machinery/conveyor{ - dir = 4; + dir = 8; id = "QMLoad2" }, -/turf/simulated/shuttle/plating, +/turf/simulated/shuttle/floor, /area/shuttle/supply) "BM" = ( /obj/effect/floor_decal/fancy_shuttle{ @@ -29101,7 +29118,7 @@ vu Zy Zy Zy -Zy +vF Zy Zy Zy @@ -33763,7 +33780,7 @@ Ll OA Xf as -VH +lB VH VH VH diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index be6b4515a9c..44d85843029 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -20656,6 +20656,9 @@ dir = 4; pixel_x = 24 }, +/obj/machinery/light/small{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/cargostore/office) "aHU" = ( diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 653eccfe256..1cb9e939137 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -9068,6 +9068,7 @@ /obj/machinery/vending/snack{ dir = 1 }, +/obj/machinery/light, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_three_hall) "aov" = ( diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 0105eaff52b..0b23ae96685 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -6139,6 +6139,9 @@ /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 2 }, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled, /area/engineering/hallway) "any" = ( @@ -9291,6 +9294,7 @@ pixel_x = 2; pixel_y = 6 }, +/obj/machinery/light, /turf/simulated/floor/tiled, /area/quartermaster/delivery) "awM" = ( @@ -9920,11 +9924,11 @@ "ayN" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/glass_external, +/obj/effect/map_helper/airlock/door/simple, /obj/machinery/conveyor{ - dir = 4; + dir = 8; id = "QMLoad2" }, -/obj/effect/map_helper/airlock/door/simple, /turf/simulated/floor/plating, /area/quartermaster/storage) "ayP" = ( @@ -14090,6 +14094,9 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, +/obj/machinery/light/floortube{ + dir = 8 + }, /turf/simulated/floor/tiled, /area/engineering/foyer) "beU" = ( @@ -22594,6 +22601,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/light{ + dir = 8 + }, /turf/simulated/floor/wood, /area/quartermaster/qm) "jab" = ( @@ -24221,7 +24231,7 @@ /area/gateway/prep_room) "kHf" = ( /obj/machinery/conveyor_switch/oneway{ - //convdir = -1; //Incompatable with new behavior -Reo + //convdir = -1; //Incompatable with new behavior -Reo; id = "QMLoad2" }, /obj/machinery/light{ @@ -25032,6 +25042,11 @@ }, /turf/simulated/floor/tiled, /area/engineering/hallway) +"lps" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floortube, +/turf/simulated/floor/tiled, +/area/quartermaster/storage) "lqr" = ( /obj/machinery/atmospherics/binary/passive_gate, /obj/machinery/light/small{ @@ -25830,6 +25845,19 @@ }, /turf/simulated/floor/grass, /area/quartermaster/qm) +"mbB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/monotile, +/area/tether/exploration) "mcE" = ( /obj/structure/table/rack/shelf, /obj/item/weapon/tank/oxygen, @@ -30857,6 +30885,16 @@ }, /turf/simulated/floor/tiled, /area/quartermaster/storage) +"sAy" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floortube{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/quartermaster/storage) "sBs" = ( /obj/structure/cable/green{ d1 = 1; @@ -30870,7 +30908,7 @@ /area/quartermaster/office) "sBQ" = ( /obj/machinery/conveyor{ - dir = 4; + dir = 8; id = "QMLoad2" }, /turf/simulated/floor, @@ -46935,12 +46973,12 @@ aBM lje tIs saQ -aEw +lps uqB uqB uqB uqB -tQu +sAy oPH tHB bOm @@ -47718,7 +47756,7 @@ bYN kRk bpT aWH -cto +afD cto cto cto @@ -47726,13 +47764,13 @@ cto cto cto bpT -cto +afD cto cto fez -afD +cto iaf -vLG +mbB gVQ hbc htA diff --git a/tgui/packages/tgui/interfaces/TraitTutorial.tsx b/tgui/packages/tgui/interfaces/TraitTutorial.tsx new file mode 100644 index 00000000000..8f0e22617ae --- /dev/null +++ b/tgui/packages/tgui/interfaces/TraitTutorial.tsx @@ -0,0 +1,80 @@ +/* eslint-disable react/no-danger */ +import { useBackend } from '../backend'; +import { Flex, Tabs, Section, Box, Divider } from '../components'; +import { Window } from '../layouts'; + +type data = { + namae: string; + names: string[]; + descriptions: { key: string; val: string }[]; + categories: { key: string; val: string }[]; + tutorials: { key: string; val: string }[]; + selection: string; +}; + +export const TraitTutorial = (props, context) => { + const { act, data } = useBackend(context); + return ( + + +
+ +
+
+
+ ); +}; + +export const TraitSelection = (props, context) => { + const { act, data } = useBackend(context); + + const { names, selection } = data; + + return ( + + +
+ + {names.map((name) => ( + act('select_trait', { name })}> + {name} + + ))} + +
+
+ + + + + {selection && ( +
+ +
+ )} +
+
+ ); +}; + +export const TraitDescription = (props, context) => { + const { act, data } = useBackend(context); + + const { name } = props; + const { descriptions, categories, tutorials } = data; + + return ( +
+ Name: {name} +
+ Category: {categories[name]} +
+ Description: {descriptions[name]} +
+ Details & How to Use: +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index cdd511d6873..f4cb7514193 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -451,6 +451,7 @@ const VoreSelectedBellyOptions = (props, context) => { egg_type, selective_preference, save_digest_mode, + eating_privacy_local, } = belly; return ( @@ -512,6 +513,12 @@ const VoreSelectedBellyOptions = (props, context) => { content={display_absorbed_examine ? 'True' : 'False'} /> + +