Restore many missing inhand sprites for items, add/port others (#21831)

Many, many, many items have inhand sprites in their .dmis but for
whatever reasons do not display them in-game. This PR:

1. Updates many item definitions to point to their already-existing
inhands correctly. This consists largely of held tools, but also gas
tanks and jetpacks mounted in the suit storage slot.

2. Adds a few codersprites made by me for objects with either missing
inhands or poorly matching mishands (IE, the tape recorder, which has a
black case, reused the white inhand sprites of the health analyzer). The
new sprites are modified or recolored variations of other inhand sprites
from our repo, except for circuitboards which are new.
<img width="444" height="400" alt="image"
src="https://github.com/user-attachments/assets/7f107b9a-fe24-4e31-8f16-4d34768ee117"
/>


3. Adds inhand sprites for Inflatables and Inflatable Boxes made by
Tomixcomics.
<img width="424" height="101" alt="image"
src="https://github.com/user-attachments/assets/434107c4-8577-49a2-a58e-d6b014c03933"
/>

4. Ports inhand sprites for the Hydraulic Rescue Tool from tg's Jaws of
Life.
<img width="224" height="94" alt="Screenshot 2026-02-07 172931"
src="https://github.com/user-attachments/assets/070c7956-f6a8-4fb5-870f-10c64afcc8b3"
/>

5. Some additional cleanup while in the area. The 'analyzer' has been
renamed the 'gas analyzer' to be consistent with the other analyzer
objects, standardized icon_state naming conventions where I saw
oddballs, updated code docs to use DMDocs when in the area, etc.

### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:

| Path | Original Author | License |
| --- | --- | --- |
| icons/obj/item/hydraulic_rescue_tool.dmi | [SomeAngryMiner (bee
station)](https://github.com/BeeStation/BeeStation-Hornet/pull/2487),
[maxymax
(/tg/station)](https://github.com/tgstation/tgstation/pull/58616) |
CC-BY-SA |
| icons/obj/item/inflatables.dmi |
[Tomixcomics](https://github.com/tomixcomics) | CC-BY-SA |
This commit is contained in:
Batrachophreno
2026-02-17 17:51:22 +00:00
committed by GitHub
parent a1e55d0958
commit 8111a8489b
111 changed files with 246 additions and 116 deletions
+3 -1
View File
@@ -1,4 +1,4 @@
// Used to resolve throwing vendors without going directly into wiring.
/// Used to resolve throwing vendors without going directly into wiring.
/obj/item/debugger
name = "debugger"
desc = "Used to debug electronic equipment, debuggers come with a retractable data cable that can be plugged into most machines."
@@ -15,6 +15,8 @@
matter = list(MATERIAL_PLASTIC = 50, DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
contained_sprite = TRUE
/obj/item/debugger/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "The debugger can be used on vending machines and APCs to identify and resolve any viral infections."
+4 -2
View File
@@ -1,9 +1,10 @@
/obj/item/geiger
name = "geiger counter"
desc = "A handheld device used for detecting and measuring radiation in an area."
icon = 'icons/obj/geiger_counter.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "geiger_off"
item_state = "multitool"
item_state = "geiger"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
action_button_name = "Toggle geiger counter"
matter = list(MATERIAL_PLASTIC = 100, DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 50)
@@ -58,6 +59,7 @@
update_sound(0)
return 1
if(!sound_token) update_sound(1)
switch(radiation_count)
+1 -1
View File
@@ -9,7 +9,7 @@
icon = 'icons/obj/item/multitool.dmi'
icon_state = "multitool"
item_state = "multitool"
item_icons = null
contained_sprite = TRUE
obj_flags = OBJ_FLAG_CONDUCTABLE
force = 11
w_class = WEIGHT_CLASS_SMALL
+36 -24
View File
@@ -10,9 +10,10 @@ BREATH ANALYZER
/obj/item/healthanalyzer
name = "health analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
icon = 'icons/obj/item/healthanalyzer.dmi'
icon_state = "health"
item_state = "analyzer"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "healthanalyzer"
item_state = "healthanalyzer"
contained_sprite = TRUE
obj_flags = OBJ_FLAG_CONDUCTABLE
slot_flags = SLOT_BELT
throwforce = 3
@@ -373,11 +374,12 @@ BREATH ANALYZER
to_chat(usr, "The scanner no longer shows limb damage.")
/obj/item/analyzer
name = "analyzer"
name = "gas analyzer"
desc = "A hand-held environmental scanner which reports current gas levels."
icon = 'icons/obj/item/air_analyzer.dmi'
icon_state = "analyzer"
item_state = "analyzer"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "airanalyzer"
item_state = "airanalyzer"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
slot_flags = SLOT_BELT
@@ -393,7 +395,7 @@ BREATH ANALYZER
if(!user) return
var/air = user.return_air()
if (!air) return
flick("[icon_state]-scan", src)
return atmosanalyzer_scan(src, air, user)
/obj/item/analyzer/attack_self(mob/user as mob)
@@ -410,9 +412,11 @@ BREATH ANALYZER
/obj/item/mass_spectrometer
name = "mass spectrometer"
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
icon = 'icons/obj/item/mass_spectrometer.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "spectrometer"
item_state = "spectrometer"
// Reuses the basic health analyzer inhands.
item_state = "healthanalyzer"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
atom_flags = ATOM_FLAG_OPEN_CONTAINER
obj_flags = OBJ_FLAG_CONDUCTABLE
@@ -472,8 +476,7 @@ BREATH ANALYZER
/obj/item/mass_spectrometer/adv
name = "advanced mass spectrometer"
icon_state = "adv_spectrometer"
item_state = "adv_spectrometer"
icon_state = "spectrometer_adv"
details = TRUE
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
@@ -486,9 +489,11 @@ BREATH ANALYZER
/obj/item/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents."
icon = 'icons/obj/item/reagent_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "reagent_scanner"
item_state = "analyzer"
// Reuses the basic health analyzer inhands.
item_state = "healthanalyzer"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
slot_flags = SLOT_BELT
@@ -521,16 +526,18 @@ BREATH ANALYZER
/obj/item/reagent_scanner/adv
name = "advanced reagent scanner"
icon_state = "adv_reagent_scanner"
item_state = "analyzer"
icon_state = "reagent_scanner_adv"
// Reuses the advanced health analyzer inhands.
item_state = "healthanalyzer_adv"
details = 1
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
/obj/item/slime_scanner
name = "slime scanner"
icon = 'icons/obj/item/slime_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "slime_scanner"
item_state = "analyzer"
item_state = "slime_scanner"
contained_sprite = TRUE
origin_tech = list(TECH_BIO = 1)
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
@@ -574,8 +581,10 @@ BREATH ANALYZER
/obj/item/price_scanner
name = "price scanner"
desc = "Using an up-to-date database of various costs and prices, this device estimates the market price of an item up to 0.001% accuracy."
icon = 'icons/obj/item/price_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "price_scanner"
item_state = "price_scanner"
contained_sprite = TRUE
item_flags = ITEM_FLAG_NO_BLUDGEON
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
@@ -595,9 +604,11 @@ BREATH ANALYZER
/obj/item/breath_analyzer
name = "breath analyzer"
desc = "A hand-held breath analyzer that provides a robust amount of information about the subject's respiratory system."
icon = 'icons/obj/item/breath_analyzer.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "breath_analyzer"
item_state = "analyzer"
// Reuses the basic health analyzer inhands.
item_state = "healthanalyzer"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
slot_flags = SLOT_BELT
@@ -705,9 +716,10 @@ BREATH ANALYZER
/obj/item/advanced_healthanalyzer
name = "advanced health analyzer"
desc = "An expensive and varied-use health analyzer that prints full-body scans after a short scanning delay."
icon = 'icons/obj/item/advanced_healthanalyzer.dmi'
icon_state = "health_adv"
item_state = "analyzer"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "healthanalyzer_adv"
item_state = "healthanalyzer_adv"
contained_sprite = TRUE
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 3)
+1 -1
View File
@@ -65,7 +65,7 @@
/obj/item/spy_monitor
name = "\improper PDA"
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
icon = 'icons/obj/pda.dmi'
icon = 'icons/obj/modular_computers/pda.dmi'
icon_state = "pda"
item_state = "electronic"
+10 -8
View File
@@ -3,10 +3,10 @@
/obj/item/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon = 'icons/obj/item/t_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "t-ray0"
item_state = "t-ray"
contained_sprite = TRUE
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
matter = list(MATERIAL_PLASTIC = 100, MATERIAL_ALUMINIUM = 50)
@@ -16,10 +16,12 @@
var/scan_range = 3
var/on = 0
var/list/active_scanned = list() //assoc list of objects being scanned, mapped to their overlay
var/client/user_client //since making sure overlays are properly added and removed is pretty important, so we track the current user explicitly
var/global/list/overlay_cache = list() //cache recent overlays
/// Assoc list of objects being scanned, mapped to their overlay.
var/list/active_scanned = list()
/// Since making sure overlays are properly added and removed is pretty important, so we track the current user explicitly.
var/client/user_client
/// Cache recent overlays.
var/global/list/overlay_cache = list()
/obj/item/t_scanner/Destroy()
. = ..()
@@ -53,7 +55,7 @@
set_user_client(null)
update_icon()
//If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays.
/// If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays.
/obj/item/t_scanner/process()
if(!on)
return
@@ -87,7 +89,7 @@
user_client.images -= active_scanned[O]
active_scanned -= O
//creates a new overlay for a scanned object
/// Creates a new overlay for a scanned object
/obj/item/t_scanner/proc/get_overlay(obj/scanned)
//Use a cache so we don't create a whole bunch of new images just because someone's walking back and forth in a room.
//Also means that images are reused if multiple people are using t-rays to look at the same objects.
+4
View File
@@ -63,6 +63,10 @@
desc = "A hydraulic rescue tool that functions like a crowbar by applying strong amounts of hydraulic pressure to force open different things. Also known as jaws of life."
icon = 'icons/obj/item/hydraulic_rescue_tool.dmi'
icon_state = "jawspry"
item_state = "jawspry"
contained_sprite = TRUE
// Really do not want to deal with reconciling sprite implementations between parent and child for now.
item_icons = null
force = 15
throwforce = 1
w_class = WEIGHT_CLASS_NORMAL
+1 -1
View File
@@ -5,7 +5,7 @@
/obj/item/autopsy_scanner
name = "autopsy scanner"
desc = "Extracts information on wounds."
icon = 'icons/obj/item/autopsy_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "autopsy"
item_state = "autopsy"
contained_sprite = TRUE
@@ -4,6 +4,7 @@
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
item_state = "electronic"
contained_sprite = TRUE
origin_tech = list(TECH_DATA = 2)
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
@@ -1,7 +1,7 @@
/obj/item/ipc_tag_scanner
name = "IPC tag scanner"
desc = "A hand-held IPC tag scanner, that, when used to analyze the info of an IPC, will output its tag status and information."
icon = 'icons/obj/ipc_utilities.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "ipc_tag_scanner"
item_state = "ipc_tag_scanner"
contained_sprite = TRUE
+2 -1
View File
@@ -1524,7 +1524,8 @@
name = "tau ceti armed forces pamphlet"
desc = "A simple pamphlet containing information about the Tau Ceti Armed Forces."
icon_state = "tcfl_pamphlet"
item_state = "paper"
item_state = "tcfl_pamphlet"
contained_sprite = TRUE
title = "Tau Ceti Armed Forces pamphlet"
author = "Tau Ceti Armed Forces recruitment center"
pickup_sound = 'sound/items/drop/paper.ogg'
@@ -273,7 +273,7 @@ Frequency:
/obj/item/closet_teleporter
name = "closet teleporter"
desc = "A device that allows a user to connect two closets into a bluespace network."
icon = 'icons/obj/modular_components.dmi'
icon = 'icons/obj/modular_computers/modular_components.dmi'
icon_state = "cpu_normal_photonic"
obj_flags = OBJ_FLAG_CONDUCTABLE
w_class = WEIGHT_CLASS_SMALL
+2 -2
View File
@@ -15,8 +15,8 @@
/obj/random/technology_scanner
name = "random scanner"
desc = "This is a random technology scanner."
icon = 'icons/obj/item/air_analyzer.dmi'
icon_state = "analyzer"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "airanalyzer"
problist = list(
/obj/item/t_scanner = 5,
/obj/item/radio = 2,
@@ -842,8 +842,9 @@
/obj/item/cratescanner
name = "crate contents scanner"
desc = "A handheld device used to scan and print a manifest of a container's contents. Does not work on locked crates, for privacy reasons."
icon = 'icons/obj/item/cratescanner.dmi'
icon_state = "cratescanner"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "crate_scanner"
item_state = "crate_scanner"
matter = list(DEFAULT_WALL_MATERIAL = 250, MATERIAL_GLASS = 140)
w_class = WEIGHT_CLASS_SMALL
obj_flags = OBJ_FLAG_CONDUCTABLE
@@ -5,6 +5,8 @@
name = "inflatable"
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/item/inflatables.dmi'
item_state = "folded"
contained_sprite = TRUE
var/deploy_path = null
/obj/item/inflatable/mechanics_hints(mob/user, distance, is_adjacent)
@@ -334,6 +336,8 @@
drop_sound = 'sound/items/drop/backpack.ogg'
pickup_sound = 'sound/items/pickup/backpack.ogg'
contained_sprite = TRUE
/obj/item/storage/bag/inflatable/emergency
name = "emergency inflatable barrier box"
desc = "Contains inflatable walls and doors. This box has emergency labelling on it and outlines that there's only enough inflatables within to secure a small area."