Files
7d058fc613 Jukebox TGUI update, Earphones autoplay, sound keys refactor (#21630)
V2 of [previous music playing
PR](https://github.com/Aurorastation/Aurora.3/pull/21466). TLDR no
longer uses the connect_range component for implementation because it
turned out a bit too inflexible for overlapping music players.

Removes a NanoUI template for the [TGUI
update](https://github.com/Aurorastation/Aurora.3/pull/21046).

New changelog:
  - refactor: "Ported Jukebox's NanoUI interface to TGUI."
- refactor: "Ported Jukebox audio playing functionality to a component."
- refactor: "Sound keys refactored from singletons to datums, along with
larger breakout of sound.dm to allow for easier SFX updates in future."
  - code_imp: "Expanded track datums to include track lengths."
- code_imp: "Reorganized music file folders for more intuitive access."
  - rscadd: "Earphone status feedback text now includes track length."
  - rscadd: "Added autoplay functionality to earphones."
- bugfix: "Fixed earphones' 'Previous Song' verb not sending you to the
end of the playlist when used while the first track is selected."
- bugfix: "Fixed gain adjustment for 'Konyang-1' (-23 dB -> standard
-9.8 dB)."
- bugfix: "Fixed y-offset of audioconsole-running overlay animation to
line up with the actual screen."

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-01-22 16:54:40 +00:00

466 lines
16 KiB
Plaintext

/obj/item/clothing/gloves/cyborg
desc = "beep boop borp"
name = "cyborg gloves"
icon_state = "black"
item_state = "black"
siemens_coefficient = 1.0
/obj/item/clothing/gloves/swat
desc = "These tactical gloves are somewhat fire and impact-resistant."
name = "\improper SWAT gloves"
icon_state = "black"
item_state = "black"
siemens_coefficient = 0.50
permeability_coefficient = 0.05
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/gloves/swat/ert
species_restricted = null
/obj/item/clothing/gloves/swat/tactical
name = "\improper tactical gloves"
icon_state = "black_leather"
item_state = "black_leather"
species_restricted = null
/obj/item/clothing/gloves/combat //Combined effect of SWAT gloves and insulated gloves
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
icon_state = "black"
item_state = "black"
siemens_coefficient = 0
permeability_coefficient = 0.05
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/ring/ninja
desc = "A pair of plain black infiltration gloves. Too thin to protect anything, but can fit underneath a hardsuit gauntlet."
name = "black slipgloves"
icon = 'icons/obj/clothing/gloves.dmi'
icon_state = "black"
item_state = "black"
siemens_coefficient = 0
permeability_coefficient = 0.05
undergloves = 1
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/gloves/latex
name = "latex gloves"
desc = "Sterile latex gloves."
icon_state = "latex"
item_state = "latex"
siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC)
permeability_coefficient = 0.01
germ_level = 0
fingerprint_chance = 75
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
var/balloon = /obj/item/toy/balloon/latex
/obj/item/clothing/gloves/latex/assembly_hints(mob/user, distance, is_adjacent)
. += ..()
. += "You can make balloons with these using some cable coil."
/obj/item/clothing/gloves/latex/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = attacking_item
if(C.use(1))
var/obj/item/L = new src.balloon
user.drop_from_inventory(L,get_turf(src))
to_chat(user, SPAN_NOTICE("You make a balloon."))
qdel(src)
else
to_chat(user, SPAN_WARNING("You need one length of cable to finish the balloon!"))
. = ..()
/obj/item/clothing/gloves/latex/nitrile
name = "nitrile gloves"
desc = "Sterile nitrile gloves."
icon_state = "nitrile"
item_state = "nitrile"
balloon = /obj/item/toy/balloon/latex/nitrile
anomaly_protection = 0.1
/obj/item/clothing/gloves/latex/nitrile/zeng
name = "zeng-hu vinyl gloves"
desc = "A key design element in the labwear was utility and compatibility with the Zeng-Hu positronic chassis workers that are ubiquitous throughout the corporation. \
As a result they are breathable yet non-porous, allowing for ample airflow while retaining the cleanroom standards expected of a medical and scientific uniform."
icon_state = "zeng_gloves"
item_state = "zeng_gloves"
/obj/item/clothing/gloves/latex/nitrile/unathi
name = "unathi nitrile gloves"
desc = "Sterile nitrile gloves. Designed for Unathi use."
icon_state = "nitrile"
item_state = "nitrile"
species_restricted = list(BODYTYPE_UNATHI)
/obj/item/clothing/gloves/latex/nitrile/tajara
name = "tajaran nitrile gloves"
desc = "Sterile nitrile gloves. Designed for Tajara use."
icon_state = "nitrile"
item_state = "nitrile"
species_restricted = list(BODYTYPE_TAJARA)
/obj/item/clothing/gloves/latex/nitrile/vaurca
name = "vaurca nitrile gloves"
desc = "Sterile nitrile gloves. Designed for Vaurca use."
icon_state = "nitrile"
item_state = "nitrile"
species_restricted = list(BODYTYPE_VAURCA)
/obj/item/clothing/gloves/latex/unathi
name = "unathi latex gloves"
desc = "Sterile latex gloves. Designed for Unathi use."
species_restricted = list(BODYTYPE_UNATHI)
/obj/item/clothing/gloves/latex/tajara
name = "tajaran latex gloves"
desc = "Sterile latex gloves. Designed for Tajara use."
species_restricted = list(BODYTYPE_TAJARA)
/obj/item/clothing/gloves/latex/vaurca
name = "vaurca latex gloves"
desc = "Sterile latex gloves. Designed for Vaurca use."
species_restricted = list(BODYTYPE_VAURCA)
/obj/item/clothing/gloves/botanic_leather
desc = "These leather work gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
name = "leather gloves"
icon_state = "leather"
item_state = "leather"
permeability_coefficient = 0.05
siemens_coefficient = 0.50 //thick work gloves
drop_sound = 'sound/items/drop/leather.ogg'
pickup_sound = 'sound/items/pickup/leather.ogg'
/obj/item/clothing/gloves/botanic_leather/unathi
name = "unathi leather gloves"
species_restricted = list(BODYTYPE_UNATHI)
/obj/item/clothing/gloves/botanic_leather/tajara
name = "tajaran leather gloves"
species_restricted = list(BODYTYPE_TAJARA)
/obj/item/clothing/gloves/botanic_leather/vaurca
name = "vaurca leather gloves"
species_restricted = list(BODYTYPE_VAURCA)
/obj/item/clothing/gloves/janitor
name = "rubber cleaning gloves"
desc = "A pair of thick, long, yellow rubber gloves, designed to protect the wearer from the splash of industrial strength cleaners. Not certified for electrical work."
icon_state = "janitor"
item_state = "janitor"
permeability_coefficient = 0.01 //Prevents chemical seepage as well as latex, but without any of the sterility or protection
siemens_coefficient = 0.50
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
/obj/item/clothing/gloves/janitor/unathi
name = "unathi cleaning gloves"
species_restricted = list(BODYTYPE_UNATHI)
/obj/item/clothing/gloves/janitor/tajara
name = "tajaran cleaning gloves"
species_restricted = list(BODYTYPE_TAJARA)
/obj/item/clothing/gloves/janitor/vaurca
name = "vaurca cleaning gloves"
species_restricted = list(BODYTYPE_VAURCA)
/*
Forcegloves. They amplify force from melee hits as well as muck up disarm and stuff a little.
Has bits of code in item_attack.dm, stungloves.dm, human_attackhand, human_defense
*/
/obj/item/clothing/gloves/force // this pair should be put in r&d if you choose to do so. and also the hos office locker. do it okay
name = "force gloves"
desc = "These gloves bend gravity and bluespace, dampening inertia and augmenting the wearer's melee capabilities."
icon_state = "force_glove" //todo: different sprites for different levels of power
item_state = "force_glove"
siemens_coefficient = 0.6
permeability_coefficient = 0.05
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
var/active = 1 //i am actually too lazy to code an on/off switch so if you want it off, take them off for now. yes.
var/amplification = 2
/obj/item/clothing/gloves/force/basic //dooo iiiitttttt
name = "basic force gloves" //do it skull do it give it to all sec the forums agree go
desc = "These gloves bend gravity and bluespace, providing a cheap boost to the effectiveness of your average security staff."
icon_state = "power_glove" //todo: different sprites for different levels of power
item_state = "power_glove"
amplification = 1 //just do it
/obj/item/clothing/gloves/force/syndicate //for syndies. pda, *maybe* nuke team or ert. up to you. maybe just use the amp 2 variant.
name = "enhanced force gloves"
amplification = 2.5 //because *2.5 is kind of scary okay. sometimes you want the scary effect. sometimes not.
/obj/item/clothing/gloves/brassknuckles
name = "brass knuckles"
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
icon_state = "knuckledusters"
item_state = "knuckledusters"
attack_verb = list("punched", "beaten", "struck")
siemens_coefficient = 1
fingerprint_chance = 100
force = 11
punch_force = 5
clipped = 1
matter = list(DEFAULT_WALL_MATERIAL = 1000)
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = SFX_PICKUP_SWORD
/obj/item/clothing/gloves/powerfist
name = "power fist"
desc = "A metal gauntlet with a piston-powered ram ontop for that extra punch in your punch."
icon_state = "powerfist"
item_state = "powerfist"
attack_verb = list("whacked", "fisted", "power-punched")
siemens_coefficient = 1
fingerprint_chance = 50
force = 11
punch_force = 10
clipped = 1
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM,BODYTYPE_VAURCA_BULWARK)
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
gender = NEUTER
/obj/item/clothing/gloves/powerfist/Touch(atom/A, mob/living/user, proximity)
if(!proximity)
return
if(!isliving(A))
return
var/mob/living/L = A
if(prob(50) && (user.a_intent == I_HURT))
playsound(user, 'sound/weapons/beartrap_shut.ogg', 50, 1, -1)
user.visible_message(SPAN_DANGER("\The [user] slams \the [L] away with \the [src]!"))
var/T = get_turf(user)
spark(T, 3, GLOB.alldirs)
L.throw_at(get_edge_target_turf(loc, loc.dir), 5, 1)
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.apply_effect(2, WEAKEN)
/obj/item/clothing/gloves/claws
name = "clawed gauntlets"
desc = "A pair of metal gauntlets outfited with menacing sharp blades."
icon_state = "warping_claws"
item_state = "warping_claws"
attack_verb = list("ripped", "torn", "cut")
armor = list(
MELEE = ARMOR_MELEE_MAJOR,
BULLET = ARMOR_BALLISTIC_MINOR,
LASER = ARMOR_LASER_MINOR,
ENERGY = ARMOR_ENERGY_MINOR,
BOMB = ARMOR_BOMB_MINOR
)
siemens_coefficient = 1
force = 11
punch_force = 10
clipped = 1
sharp = 1
edge = TRUE
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
/obj/item/clothing/gloves/offworlder
name = "starmitts"
desc = "Thick arm warmers and mittens that reach past the elbow."
icon = 'icons/obj/item/clothing/accessory/offworlder.dmi'
contained_sprite = TRUE
icon_state = "starmittens"
item_state = "starmittens"
build_from_parts = TRUE
worn_overlay = "over"
/obj/item/clothing/gloves/ballistic
name = "ballistic gauntlet"
desc = "A metal gauntlet armed with a wrist-mounted shotgun."
icon_state = "ballisticfist"
item_state = "ballisticfist"
siemens_coefficient = 1
fingerprint_chance = 50
clipped = 1
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM,BODYTYPE_VAURCA_BULWARK)
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
gender = NEUTER
var/obj/item/gun/projectile/mounted
var/gun_type = /obj/item/gun/projectile/shotgun/doublebarrel/pellet
/obj/item/clothing/gloves/ballistic/Initialize()
. = ..()
if(!mounted)
var/obj/item/gun/projectile/new_gun = new gun_type (src)
mounted = new_gun
mounted.name = "wrist-mounted [initial(new_gun.name)]"
/obj/item/clothing/gloves/ballistic/Destroy()
if(mounted)
QDEL_NULL(mounted)
return ..()
/obj/item/clothing/gloves/ballistic/Touch(atom/A, mob/living/user, proximity)
if(!proximity)
return
if(!isliving(A))
return
var/mob/living/L = A
if(user.a_intent == I_HURT)
if(mounted)
spark(user, 3, GLOB.alldirs)
mounted.Fire(L, user)
/obj/item/clothing/gloves/ballistic/attackby(obj/item/attacking_item, mob/user)
..()
if(mounted)
mounted.load_ammo(attacking_item, user)
return
/obj/item/clothing/gloves/ballistic/verb/unload_shells()
set name = "Unload Ballistic Gauntlet"
set desc = "Unload the shells from the gauntlet's mounted gun."
set category = "Object"
set src in usr
if(usr.stat || usr.restrained() || usr.incapacitated())
return
if(mounted)
mounted.unload_ammo(usr)
/obj/item/clothing/gloves/ballistic/attack_self(mob/user as mob)
unload_shells()
/obj/item/clothing/gloves/ballistic/double
name = "ballistic gauntlets"
icon_state = "dual-ballisticfist"
item_state = "ballisticfist" //just reuse the single inhand
fingerprint_chance = 0
gender = PLURAL
/obj/item/clothing/gloves/ballistic/double/Initialize()
. = ..()
if(mounted)
mounted.switch_firemodes()
/obj/item/clothing/gloves/tesla
name = "tesla glove"
desc = "A weaponized gauntlet capable of firing lightning bolts."
desc_extended = "A tesla-based weapon created by the People's Republic of Adhomai as part of their Tesla Brigade program. Because of its long recharge time, the gauntlet is commonly \
used as an ancillary weapon."
icon_state = "tesla_glove_on"
item_state = "tesla_glove_on"
siemens_coefficient = 1
fingerprint_chance = 50
clipped = TRUE
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM,BODYTYPE_VAURCA_BULWARK)
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
gender = NEUTER
var/charged = TRUE
/obj/item/clothing/gloves/tesla/Touch(atom/A, mob/living/user, proximity)
if(!charged)
to_chat(user, SPAN_WARNING("\The [src] is still recharging."))
return
if(user.a_intent == I_HURT)
if(proximity)
if(iscarbon(A))
var/mob/living/carbon/L = A
L.electrocute_act(20,src, 1, user.zone_sel.selecting)
spark(src, 3, GLOB.alldirs)
charged = FALSE
update_icon()
user.update_inv_gloves()
addtimer(CALLBACK(src, PROC_REF(rearm)), 10 SECONDS)
else
var/turf/T = get_turf(user)
user.visible_message(SPAN_DANGER("\The [user] crackles with energy!"))
var/obj/projectile/beam/tesla/LE = new (T)
LE.preparePixelProjectile(A, user)
LE.firer = user
LE.fired_from = src
LE.def_zone = user.zone_sel? user.zone_sel.selecting : null
LE.fire()
spark(src, 3, GLOB.alldirs)
playsound(user.loc, 'sound/magic/LightningShock.ogg', 75, 1)
charged = FALSE
update_icon()
user.update_inv_gloves()
addtimer(CALLBACK(src, PROC_REF(rearm)), 30 SECONDS)
/obj/item/clothing/gloves/tesla/proc/rearm()
visible_message(SPAN_NOTICE("\The [src] surges back with energy!"))
charged = TRUE
update_icon()
/obj/item/clothing/gloves/tesla/update_icon()
if(charged)
icon_state = "tesla_glove_on"
item_state = "tesla_glove_on"
else
icon_state = "tesla_glove"
item_state = "tesla_glove"
if(ismob(src.loc))
var/mob/M = src.loc
M.update_inv_gloves()
/obj/item/clothing/gloves/black/forensic
name = "forensic gloves"
desc = "Specially made gloves for investigative personnel. The luminescent threads woven into the material stand out under scrutiny."
icon_state = "forensic"
item_state = "forensicgloves"
species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM,BODYTYPE_VAURCA_BULWARK)
/obj/item/clothing/gloves/single
name = "single glove"
desc = "A single glove. This one is for the right hand."
icon = 'icons/obj/item/clothing/gloves/single.dmi'
contained_sprite = TRUE
icon_state = "single"
item_state = "single"
/obj/item/clothing/gloves/single/left
desc = "A single glove. This one is for the left hand."
icon_state = "single_left"
item_state = "single_left"
/obj/item/clothing/gloves/multi_color
name = "multi-color gloves"
desc = "A pair of gloves, each is a different color."
icon = 'icons/obj/item/clothing/gloves/multi_color.dmi'
contained_sprite = TRUE
icon_state = "multi_color"
item_state = "multi_color"
has_accents = TRUE