diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 9a99649fa5c..69dd7e6ceca 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -36,36 +36,123 @@
var/from_suit = /obj/item/clothing/suit/space/void
var/to_helmet = /obj/item/clothing/head/cardborg
var/to_suit = /obj/item/clothing/suit/cardborg
-
+
+ //conversion costs. refunds all parts by default, but can be tweaked per-kit
+ var/from_helmet_cost = 1
+ var/from_suit_cost = 2
+ var/to_helmet_cost = -1
+ var/to_suit_cost = -2
+
+ var/owner_ckey = null //ckey of the kit owner as a string
+ var/skip_content_check = FALSE //can we skip the contents check? we generally shouldn't, but this is necessary for rigs/coats with hoods/etc.
+ var/transfer_contents = FALSE //should we transfer the contents across before deleting? we generally shouldn't, esp. in the case of rigs/coats with hoods/etc. note this does nothing if skip is FALSE.
+ var/can_repair = FALSE //can we be used to repair damaged voidsuits when converting them?
+ var/can_revert = TRUE //can we revert items, or is it a one-way trip?
+ var/delete_on_empty = FALSE //do we self-delete when emptied?
+
//Conversion proc
/obj/item/device/modkit_conversion/afterattack(obj/O, mob/user as mob)
- var/flag
+ var/cost
var/to_type
- if(istype(O,from_helmet))
- flag = 1
+ var/keycheck
+
+ if(isturf(O)) //silently fail if you click on a turf. shouldn't work anyway because turfs aren't objects but if I don't do this it spits runtimes.
+ return
+ if(istype(O,/obj/item/clothing/suit/space/void/) && !can_repair) //check if we're a voidsuit and if we're allowed to repair
+ var/obj/item/clothing/suit/space/void/SS = O
+ if(LAZYLEN(SS.breaches))
+ to_chat(user, "You should probably repair that before you start tinkering with it.")
+ return
+ if(O.blood_DNA || O.contaminated) //check if we're bloody or gooey or whatever, so modkits can't be used to hide crimes easily.
+ to_chat(user, "You should probably clean that up before you start tinkering with it.")
+ return
+ //we have to check that it's not the original type first, because otherwise it might convert wrong based on pathing; the subtype can still count as the basetype
+ if(istype(O,to_helmet) && can_revert)
+ cost = to_helmet_cost
+ to_type = from_helmet
+ else if(istype(O,to_suit) && can_revert)
+ cost = to_suit_cost
+ to_type = from_suit
+ else if(!can_revert && (istype(O,to_helmet) || istype (O,to_suit)))
+ to_chat(user, "This kit doesn't seem to have the tools necessary to revert changes to modified items.")
+ return
+ else if(istype(O,from_helmet))
+ cost = from_helmet_cost
to_type = to_helmet
+ keycheck = TRUE
else if(istype(O,from_suit))
- flag = 2
+ cost = from_suit_cost
to_type = to_suit
+ keycheck = TRUE
else
return
- if(!(parts & flag))
- to_chat(user, "This kit has no parts for this modification left.")
- return
- if(istype(O,to_type))
- to_chat(user, "[O] is already modified.")
- return
if(!isturf(O.loc))
- to_chat(user, "[O] must be safely placed on the ground for modification.")
+ to_chat(user, "You need to put \the [O] on the ground, a table, or other worksurface before modifying it.")
return
+ if(!skip_content_check && O.contents.len) //check if we're loaded/modified, in the event of gun/suit kits, to avoid purging stuff like ammo, badges, armbands, or suit helmets
+ to_chat(user, "You should probably remove any attached items or loaded ammunition before trying to modify that!")
+ return
+ if(cost > parts)
+ to_chat(user, "The kit doesn't have enough parts left to modify that.")
+ if(can_revert && ((to_helmet_cost || to_suit_cost) < 0))
+ to_chat(user, " You can recover parts by using the kit on an already-modified item.")
+ return
+ if(keycheck && owner_ckey) //check if we're supposed to care
+ if(user.ckey != owner_ckey) //ERROR: UNAUTHORIZED USER
+ to_chat(user, "You probably shouldn't mess with all these strange tools and parts...") //give them a slightly fluffy explanation as to why it didn't work
+ return
playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- var/N = new to_type(O.loc)
- user.visible_message("[user] opens \the [src] and modifies \the [O] into \the [N].","You open \the [src] and modify \the [O] into \the [N].")
+ var/obj/N = new to_type(O.loc)
+ user.visible_message("[user] opens \the [src] and modifies \the [O] into \the [N].","You open \the [src] and modify \the [O] into \the [N].")
+
+ //crude, but transfer prints and fibers to avoid forensics abuse, same as the bloody/gooey check above
+ N.fingerprints = O.fingerprints
+ N.fingerprintshidden = O.fingerprintshidden
+ N.fingerprintslast = O.fingerprintslast
+ N.suit_fibers = O.suit_fibers
+
+ //transfer logic could technically be made more thorough and handle stuff like helmet/boots/tank vars for suits, but in those cases you should be removing the items first anyway
+ if(skip_content_check && transfer_contents)
+ N.contents = O.contents
+ if(istype(N,/obj/item/weapon/gun/projectile/))
+ var/obj/item/weapon/gun/projectile/NN = N
+ var/obj/item/weapon/gun/projectile/OO = O
+ NN.magazine_type = OO.magazine_type
+ NN.ammo_magazine = OO.ammo_magazine
+ if(istype(N,/obj/item/weapon/gun/energy/))
+ var/obj/item/weapon/gun/energy/NE = N
+ var/obj/item/weapon/gun/energy/OE = O
+ NE.cell_type = OE.cell_type
+ else
+ if(istype(N,/obj/item/weapon/gun/projectile/))
+ var/obj/item/weapon/gun/projectile/NM = N
+ NM.contents = list()
+ NM.magazine_type = null
+ NM.ammo_magazine = null
+ if(istype(N,/obj/item/weapon/gun/energy/))
+ var/obj/item/weapon/gun/energy/NO = N
+ NO.contents = list()
+ NO.cell_type = null
+
qdel(O)
- parts &= ~flag
- if(!parts)
+ parts -= cost
+ if(!parts && delete_on_empty)
qdel(src)
+//DEBUG ITEM
+/obj/item/device/modkit_conversion/fluff/debug_gunkit
+ name = "Gun Transformation Kit"
+ desc = "A kit containing all the needed tools and fabric to modify one sidearm to another."
+ skip_content_check = FALSE
+ transfer_contents = FALSE
+
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "harmony_kit"
+
+ from_helmet = /obj/item/weapon/gun/energy/laser
+ to_helmet = /obj/item/weapon/gun/energy/retro
+//DEBUG ITEM ENDS
+
//JoanRisu:Joan Risu
/obj/item/weapon/flame/lighter/zippo/fluff/joan
name = "Federation Zippo Lighter"