Refactors unique_reskin, deletes retool kit (#93775)

## About The Pull Request

Closes #93635

`unique_reskin` is no longer a list on `/item`, now `/datum/atom_skin`

The actual reskinning behavior has been moved out to
`/datum/component/reskinable_item`

PKC reskinning is now handled via alt-click reskin, rather than via the
retooling kit. The retooling kit has been removed.
There's no limit on how many times you can reskin your PKC (though
perhaps we limit it to one reskin and keep the retooling kit as a way to
allow a miner to reskin it a second time?)

The Ashen Skull unique reskin is still a trophy, and instead unlocks its
unique reskin option in the alt-click radial.

## Why It's Good For The Game

I'm unsure why the retooling kit exists on its own, when it's relatively
cheap and just performs the behavior of alt-click reskinning.

So to keep it consistent with all other forms of reskinning I've just
made it baseline. To accomplish that I refactored reskinning.

The new form of reskinning allows for greater potential in adding
reskins, allowing far more than just an icon state change. Also we can
put it on turfs and mobs and structures now which is cool I guess

There's also the added benefit of being able to see an item's reskins
without needing to instantiate it, which the loadout menu uses to great
effect.

## Changelog

🆑 Melbert
refactor: Refactored item reskinning (the alt-click way), report any
oddities with that
del: Deleted the crusher retool kit, now you can just reskin your
crusher with alt-click. The Skull skin is still locked behind having the
Ashen Skull trophy applied.
fix: Stunswords no longer have an incorrect lore blurb
fix: Fixed loadout item reskinning's UI
/🆑
This commit is contained in:
MrMelbert
2025-11-30 19:31:29 -07:00
committed by GitHub
parent 693d94d930
commit 6ebfbccebb
34 changed files with 757 additions and 489 deletions
@@ -9,7 +9,6 @@
pickup_sound = 'sound/items/handling/gun/gun_pick_up.ogg'
drop_sound = 'sound/items/handling/gun/gun_drop.ogg'
sound_vary = TRUE
unique_reskin_changes_base_icon_state = TRUE
///sound when inserting magazine
var/load_sound = 'sound/items/weapons/gun/general/magazine_insert_full.ogg'
@@ -97,8 +97,7 @@
. = ..()
var/live_ammo = get_ammo(FALSE, FALSE)
. += "[live_ammo ? live_ammo : "None"] of those are live rounds."
if (current_skin)
. += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].")
. += span_notice("It can be spun with [EXAMINE_HINT("alt-click")].")
/obj/item/gun/ballistic/revolver/ignition_effect(atom/A, mob/user)
if(last_fire && last_fire + 15 SECONDS > world.time)
@@ -112,6 +111,47 @@
base_icon_state = "c38"
fire_sound = 'sound/items/weapons/gun/revolver/shot.ogg'
// 38 special skins
/datum/atom_skin/det_revolver
abstract_type = /datum/atom_skin/det_revolver
change_base_icon_state = TRUE
/datum/atom_skin/det_revolver/default
preview_name = "Default"
new_icon_state = "c38"
/datum/atom_skin/det_revolver/fitz_special
preview_name = "Fitz Special"
new_icon_state = "c38_fitz"
/datum/atom_skin/det_revolver/police_positive_special
preview_name = "Police Positive Special"
new_icon_state = "c38_police"
/datum/atom_skin/det_revolver/blued_steel
preview_name = "Blued Steel"
new_icon_state = "c38_blued"
/datum/atom_skin/det_revolver/stainless_steel
preview_name = "Stainless Steel"
new_icon_state = "c38_stainless"
/datum/atom_skin/det_revolver/gold_trim
preview_name = "Gold Trim"
new_icon_state = "c38_trim"
/datum/atom_skin/det_revolver/golden
preview_name = "Golden"
new_icon_state = "c38_gold"
/datum/atom_skin/det_revolver/peacemaker
preview_name = "The Peacemaker"
new_icon_state = "c38_peacemaker"
/datum/atom_skin/det_revolver/black_panther
preview_name = "Black Panther"
new_icon_state = "c38_panther"
/obj/item/gun/ballistic/revolver/c38/detective
name = "\improper Colt Detective Special"
desc = "A classic, if not outdated, law enforcement firearm. Uses .38 Special rounds. \nSome spread rumors that if you loosen the barrel with a wrench, you can \"improve\" it."
@@ -126,17 +166,10 @@
misfire_percentage_increment = 25 //about 1 in 4 rounds, which increases rapidly every shot
obj_flags = UNIQUE_RENAME
unique_reskin = list(
"Default" = "c38",
"Fitz Special" = "c38_fitz",
"Police Positive Special" = "c38_police",
"Blued Steel" = "c38_blued",
"Stainless Steel" = "c38_stainless",
"Gold Trim" = "c38_trim",
"Golden" = "c38_gold",
"The Peacemaker" = "c38_peacemaker",
"Black Panther" = "c38_panther"
)
/obj/item/gun/ballistic/revolver/c38/detective/Initialize(mapload)
. = ..()
AddComponent(/datum/component/reskinable_item, /datum/atom_skin/det_revolver)
/obj/item/gun/ballistic/revolver/badass
name = "\improper Badass Revolver"
@@ -285,6 +285,35 @@
/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
pin = /obj/item/firing_pin
// Double barrel shotgun skins
/datum/atom_skin/bar_shotgun
abstract_type = /datum/atom_skin/bar_shotgun
change_base_icon_state = TRUE
/datum/atom_skin/bar_shotgun/default
preview_name = "Standard Finish"
new_icon_state = "dshotgun"
/datum/atom_skin/bar_shotgun/dark_red
preview_name = "Dark Red Finish"
new_icon_state = "dshotgun_d"
/datum/atom_skin/bar_shotgun/ash
preview_name = "Ash"
new_icon_state = "dshotgun_f"
/datum/atom_skin/bar_shotgun/faded_grey
preview_name = "Faded Grey"
new_icon_state = "dshotgun_g"
/datum/atom_skin/bar_shotgun/maple
preview_name = "Maple"
new_icon_state = "dshotgun_l"
/datum/atom_skin/bar_shotgun/rosewood
preview_name = "Rosewood"
new_icon_state = "dshotgun_p"
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
@@ -304,18 +333,15 @@
sawn_desc = "Omar's coming!"
obj_flags = UNIQUE_RENAME
rack_sound_volume = 0
unique_reskin = list("Default" = "dshotgun",
"Dark Red Finish" = "dshotgun_d",
"Ash" = "dshotgun_f",
"Faded Grey" = "dshotgun_g",
"Maple" = "dshotgun_l",
"Rosewood" = "dshotgun_p"
)
semi_auto = TRUE
bolt_type = BOLT_TYPE_NO_BOLT
can_be_sawn_off = TRUE
pb_knockback = 3 // it's a super shotgun!
/obj/item/gun/ballistic/shotgun/doublebarrel/Initialize(mapload)
. = ..()
AddComponent(/datum/component/reskinable_item, /datum/atom_skin/bar_shotgun)
/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user)
. = ..()
if(.)