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,8 +1,10 @@
/obj/item/export_scanner
name = "export scanner"
desc = "A device used to check objects against NanoTrasen exports and bounty database."
icon = 'icons/obj/item/export_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "export_scanner"
item_state = "export_scanner"
contained_sprite = TRUE
slot_flags = SLOT_BELT
item_flags = ITEM_FLAG_NO_BLUDGEON
w_class = WEIGHT_CLASS_SMALL
@@ -1,7 +1,7 @@
/obj/item/remote_mecha
name = "standard exosuit remote upgrade"
desc = "A device that, when inserted into an exosuit, allows it to be remotely piloted."
icon = 'icons/obj/modular_components.dmi'
icon = 'icons/obj/modular_computers/modular_components.dmi'
icon_state = "aislot"
origin_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 4, TECH_DATA = 4)
w_class = WEIGHT_CLASS_SMALL
+1 -1
View File
@@ -25,7 +25,7 @@
/// Like a health analyzer, but for plants! Tells you everything you need to know.
/obj/item/analyzer/plant_analyzer
name = "plant analyzer"
icon = 'icons/obj/item/plant_analyzer.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "hydro"
item_state = "hydro"
var/form_title
+1
View File
@@ -500,6 +500,7 @@
b.dat = paper.info
b.name = "blank book"
b.icon_state = "book[rand(1,7)]"
b.item_state = icon_state
qdel(paper)
return
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/mining_scanner
name = "deep ore scanner"
desc = "A complex device used to locate ore deep underground."
icon = 'icons/obj/item/mining_scanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "manual_mining"
item_state = "manual_mining"
contained_sprite = TRUE
+6 -4
View File
@@ -9,8 +9,10 @@
/obj/item/ore_detector
name = "ore detector"
desc = "A device capable of locating and displaying ores to the average untrained hole explorer."
icon = 'icons/obj/item/adv_mining_scanner.dmi'
icon_state = "advmining0"
icon = 'icons/obj/item/scanner.dmi'
icon_state = "mining_adv0"
item_state = "mining_adv"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
force = 1
@@ -40,7 +42,7 @@
return ..()
/obj/item/ore_detector/update_icon()
icon_state = "advmining[active]"
icon_state = "mining_adv[active]"
/obj/item/ore_detector/attack_self(mob/user)
ui_interact(user)
@@ -128,7 +130,7 @@
found_ores = TRUE
if(found_ores)
var/image/ore_ping = image(icon = 'icons/obj/item/adv_mining_scanner.dmi', icon_state = "signal_overlay", loc = anchor, layer = UNDER_HUD_LAYER)
var/image/ore_ping = image(icon = 'icons/obj/item/scanner.dmi', icon_state = "signal_overlay", loc = anchor, layer = UNDER_HUD_LAYER)
ore_ping.appearance_flags |= KEEP_APART|RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM
ore_ping.pixel_x = rand(-6, 6)
ore_ping.pixel_y = rand(-6, 6)
+2 -2
View File
@@ -127,7 +127,7 @@
if(!underlays.len)
underlays += image(firstaid_item.icon, firstaid_item.icon_state)
var/matrix/M = matrix()
var/image/ha_image = image('icons/obj/item/healthanalyzer.dmi', "health")
var/image/ha_image = image('icons/obj/item/scanner.dmi', "healthanalyzer")
M.Translate(5, 0)
ha_image.transform = M
underlays += ha_image
@@ -376,7 +376,7 @@
to_chat(user, SPAN_NOTICE("You add the health sensor to [src]."))
name = "first-aid/robot arm/health analyzer assembly"
var/matrix/M = matrix()
var/image/ha_image = image('icons/obj/item/healthanalyzer.dmi', "health")
var/image/ha_image = image('icons/obj/item/scanner.dmi', "health")
M.Translate(5, 0)
ha_image.transform = M
underlays += ha_image
@@ -271,9 +271,11 @@ There are several things that need to be remembered:
if(update_icons)
update_icon()
//Overlays for the worn overlay so you can overlay while you overlay
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the correct inhand file
/**
* Overlays for the worn overlay so you can overlay while you overlay
* eg: ammo counters, primed grenade flashing, etc.
* "icon_file" is used automatically for inhands etc. to make sure it gets the correct inhand file
*/
/obj/item/proc/worn_overlays(icon_file)
. = list()
var/mutable_appearance/M = null
@@ -320,7 +322,7 @@ There are several things that need to be remembered:
return WORN_GLOVES
return ""
//BASE MOB SPRITE
/// BASE MOB SPRITE
/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/force_base_icon = FALSE)
if (QDELETED(src))
return
@@ -436,8 +438,10 @@ There are several things that need to be remembered:
if(update_icons)
update_icon()
// This proc generates & returns an icon representing a human's hair, using a cached icon from SSicon_cache if possible.
// If `hair_is_visible` is FALSE, only facial hair will be drawn.
/**
* This proc generates & returns an icon representing a human's hair, using a cached icon from SSicon_cache if possible.
* If `hair_is_visible` is FALSE, only facial hair will be drawn.
*/
/mob/living/carbon/human/proc/generate_hair_icon(hair_is_visible = TRUE)
var/cache_key = "[f_style ? "[f_style][r_facial][g_facial][b_facial]" : "nofacial"]_[(h_style && hair_is_visible) ? "[h_style][r_hair][g_hair][b_hair]" : "nohair"]_[(g_style && g_style != "None" && hair_is_visible) ? "[g_style][r_grad][g_grad][b_grad]" : "nograd"]"
@@ -481,7 +485,7 @@ There are several things that need to be remembered:
return face_standing
//HAIR OVERLAY
/// HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
if (QDELETED(src))
return
@@ -560,7 +564,7 @@ There are several things that need to be remembered:
update_icon()
/* --------------------------------------- */
//For legacy support.
/// For legacy support.
/mob/living/carbon/human/regenerate_icons()
..()
@@ -3,9 +3,11 @@
//
/obj/item/robotanalyzer
name = "cyborg analyzer"
icon = 'icons/obj/item/robotanalyzer.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "robotanalyzer"
item_state = "analyzer"
// Reuses the basic health analyzer inhands.
item_state = "healthanalyzer"
contained_sprite = TRUE
desc = "A hand-held scanner able to diagnose robotic injuries."
obj_flags = OBJ_FLAG_CONDUCTABLE
slot_flags = SLOT_BELT
@@ -135,9 +137,6 @@
/obj/item/robotanalyzer/augment
name = "retractable cyborg analyzer"
desc = "An scanner implanted directly into the hand, popping through the finger. This scanner can diagnose robotic injuries."
icon = 'icons/obj/item/robotanalyzer.dmi'
icon_state = "robotanalyzer"
item_state = "analyzer"
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
@@ -1,7 +1,7 @@
/obj/item/modular_computer/console
name = "console"
desc = "A stationary computer."
icon = 'icons/obj/machinery/modular_console.dmi'
icon = 'icons/obj/modular_computers/modular_console.dmi'
icon_state = "computer"
icon_state_unpowered = "computer"
icon_state_screensaver = "standby"
@@ -2,7 +2,7 @@
name = "tablet computer"
lexical_name = "tablet"
desc = "A portable device for your needs on the go."
icon = 'icons/obj/modular_tablet.dmi'
icon = 'icons/obj/modular_computers/modular_tablet.dmi'
icon_state = "tablet"
icon_state_unpowered = "tablet"
icon_state_menu = "menu"
@@ -6,7 +6,7 @@
hardware_flag = PROGRAM_LAPTOP
can_reset = TRUE
icon_state_unpowered = "laptop-open"
icon = 'icons/obj/modular_laptop.dmi'
icon = 'icons/obj/modular_computers/modular_laptop.dmi'
icon_state = "laptop-open"
icon_state_broken = "laptop-broken"
randpixel = 6
@@ -2,7 +2,7 @@
name = "\improper PDA"
lexical_name = "tablet"
desc = "A personal data assistant. The latest in portable microcomputer solutions from Thinktronic Systems LTD."
icon = 'icons/obj/pda.dmi'
icon = 'icons/obj/modular_computers/pda.dmi'
icon_state = "pda"
item_state = "electronic"
contained_sprite = TRUE
@@ -18,13 +18,13 @@
icon_state_broken = icon_state
/obj/item/modular_computer/handheld/pda/old
icon = 'icons/obj/pda_old.dmi'
icon = 'icons/obj/modular_computers/pda_old.dmi'
/obj/item/modular_computer/handheld/pda/rugged
icon = 'icons/obj/pda_rugged.dmi'
icon = 'icons/obj/modular_computers/pda_rugged.dmi'
/obj/item/modular_computer/handheld/pda/slate
icon = 'icons/obj/pda_slate.dmi'
icon = 'icons/obj/modular_computers/pda_slate.dmi'
/obj/item/modular_computer/handheld/pda/smart
icon = 'icons/obj/pda_smart.dmi'
icon = 'icons/obj/modular_computers/pda_smart.dmi'
@@ -3,7 +3,7 @@
desc = "A synthetic computer."
hardware_flag = PROGRAM_SILICON
icon_state_unpowered = "laptop-open"
icon = 'icons/obj/modular_laptop.dmi'
icon = 'icons/obj/modular_computers/modular_laptop.dmi'
icon_state = "laptop-open"
icon_state_broken = "laptop-broken"
base_idle_power_usage = 5
@@ -1,7 +1,7 @@
/obj/item/modular_computer/telescreen
name = "telescreen"
desc = "A stationary wall-mounted touchscreen"
icon = 'icons/obj/modular_telescreen.dmi'
icon = 'icons/obj/modular_computers/modular_telescreen.dmi'
icon_state = "telescreen"
icon_state_unpowered = "telescreen"
icon_state_menu = "menu"
@@ -3,7 +3,7 @@
lexical_name = "wristbound"
desc = "A portable wristbound device for your needs on the go. Quite comfortable."
desc_extended = "A NanoTrasen design, this wristbound computer allows the user to quickly and safely access critical info, without taking their hands out of the equation."
icon = 'icons/obj/modular_wristbound.dmi'
icon = 'icons/obj/modular_computers/modular_wristbound.dmi'
icon_state = "wristbound"
icon_state_unpowered = "wristbound"
icon_state_menu = "menu"
@@ -1,7 +1,7 @@
/obj/item/computer_hardware
name = "Hardware"
desc = "Unknown Hardware."
icon = 'icons/obj/modular_components.dmi'
icon = 'icons/obj/modular_computers/modular_components.dmi'
var/obj/item/modular_computer/parent_computer
/// If the hardware uses extra power, change this.
var/power_usage = 0
@@ -1,7 +1,7 @@
/obj/item/paper_scanner
name = "paper scanner"
desc = "A simple device that can be used to scan paper or paper bundles in order to digitize them."
icon = 'icons/obj/devices/paperscanner.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "paperscanner"
item_state = "paperscanner"
contained_sprite = TRUE
@@ -16,7 +16,7 @@
/obj/machinery/computer/ship/targeting/terminal
name = "targeting systems terminal"
desc = "A targeting systems terminal using Zavodskoi software."
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "hostile"
icon_keyboard = "red_key"
icon_keyboard_emis = "red_key_mask"
@@ -19,7 +19,7 @@
/obj/machinery/computer/ship/engines/terminal
name = "engine control terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "engines"
icon_keyboard = "tech_key"
icon_keyboard_emis = "tech_key_mask"
+2 -2
View File
@@ -27,7 +27,7 @@
/obj/machinery/computer/ship/helm/terminal
name = "helm control terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "helm"
icon_keyboard = "security_key"
icon_keyboard_emis = "security_key_mask"
@@ -329,7 +329,7 @@
/obj/machinery/computer/ship/navigation/terminal
name = "navigation terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "nav"
icon_keyboard = "generic_key"
icon_keyboard_emis = "generic_key_mask"
@@ -38,7 +38,7 @@
/obj/machinery/computer/ship/sensors/terminal
name = "sensors terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "teleport"
icon_keyboard = "teleport_key"
icon_keyboard_emis = "teleport_key_mask"
@@ -65,7 +65,7 @@
/obj/machinery/computer/shuttle_control/explore/terminal
name = "shuttle control terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "helm"
icon_keyboard = "tech_key"
icon_keyboard_emis = "tech_key_mask"
+1
View File
@@ -31,6 +31,7 @@
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler0"
item_state = "labeler0"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
var/label = null
var/labels_left = 30
@@ -4,7 +4,7 @@
/obj/machinery/computer/fusion/core_control/terminal
name = "\improper INDRA fusion core control"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "solar_screen"
icon_keyboard = "id_key"
icon_keyboard_emis = "id_key_mask"
@@ -9,7 +9,7 @@
/obj/machinery/computer/fusion/gyrotron/terminal
name = "gyrotron control terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "rust_screen"
icon_keyboard = "generic_key"
icon_keyboard_emis = "generic_key_mask"
@@ -9,7 +9,7 @@
/obj/machinery/computer/fusion/fuel_control/terminal
name = "fuel injection control terminal"
icon = 'icons/obj/machinery/modular_terminal.dmi'
icon = 'icons/obj/modular_computers/modular_terminal.dmi'
icon_screen = "power_screen"
icon_keyboard = "med_key"
icon_keyboard_emis = "med_key_mask"
+1 -1
View File
@@ -269,7 +269,7 @@
/obj/machinery/power/solar_control
name = "solar panel control"
desc = "A controller for solar panel arrays."
icon = 'icons/obj/machinery/modular_console.dmi'
icon = 'icons/obj/modular_computers/modular_console.dmi'
icon_state = "computer"
light_color = LIGHT_COLOR_YELLOW
anchored = 1
@@ -252,6 +252,8 @@
desc = "Used to set the destination of properly wrapped packages."
icon = 'icons/obj/item/dest_tagger.dmi'
icon_state = "dest_tagger"
item_state = "dest_tagger"
contained_sprite = TRUE
var/currTag = 0
matter = list(DEFAULT_WALL_MATERIAL = 250, MATERIAL_GLASS = 140)
w_class = WEIGHT_CLASS_SMALL
@@ -2,9 +2,10 @@
/obj/item/ano_scanner
name = "Alden-Saraspova counter"
desc = "Aids in triangulation of exotic particles."
icon = 'icons/obj/xenoarchaeology.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "xenoarch_scanner"
item_state = "xenoarch_scanner"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
var/nearest_artifact_id = "unknown"
@@ -6,9 +6,10 @@
/obj/item/depth_scanner
name = "depth analysis scanner"
desc = "Used to check spatial depth and density of rock outcroppings."
icon = 'icons/obj/xenoarchaeology.dmi'
icon = 'icons/obj/item/scanner.dmi'
icon_state = "depth_scanner"
item_state = "depth_scanner"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
var/list/positive_locations = list()
@@ -4,6 +4,7 @@
icon = 'icons/obj/musician.dmi'
icon_state = "guitar"
item_state = "guitar"
contained_sprite = TRUE
slot_flags = SLOT_BACK
sound_player = /datum/sound_player/synthesizer
path = /datum/instrument/guitar/clean_crisis
@@ -15,6 +16,7 @@
icon = 'icons/obj/musician.dmi'
icon_state = "eguitar"
item_state = "eguitar"
contained_sprite = TRUE
slot_flags = SLOT_BACK
sound_player = /datum/sound_player/synthesizer
path = /datum/instrument/guitar
@@ -25,6 +27,7 @@
icon = 'icons/obj/tajara_items.dmi'
icon_state = "prrama"
item_state = "prrama"
contained_sprite = TRUE
/obj/item/synthesized_instrument/guitar/prrama/interact(mob/user)
if(!istajara(user))
+1
View File
@@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(gps_list)
icon = 'icons/obj/item/gps.dmi'
icon_state = "gps-com"
item_state = "radio"
contained_sprite = TRUE
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)