Merge pull request #7401 from VOREStation/aro-rcdind
Port /tg/ RCDs, Inducers
@@ -27,13 +27,14 @@
|
|||||||
var/window_type = /obj/structure/window/reinforced/full
|
var/window_type = /obj/structure/window/reinforced/full
|
||||||
var/material_to_use = DEFAULT_WALL_MATERIAL // So badmins can make RCDs that print diamond walls.
|
var/material_to_use = DEFAULT_WALL_MATERIAL // So badmins can make RCDs that print diamond walls.
|
||||||
var/make_rwalls = FALSE // If true, when building walls, they will be reinforced.
|
var/make_rwalls = FALSE // If true, when building walls, they will be reinforced.
|
||||||
|
/* VOREStation Removal - Unused
|
||||||
/obj/item/weapon/rcd/Initialize()
|
/obj/item/weapon/rcd/Initialize()
|
||||||
|
|
||||||
src.spark_system = new /datum/effect/effect/system/spark_spread
|
src.spark_system = new /datum/effect/effect/system/spark_spread
|
||||||
spark_system.set_up(5, 0, src)
|
spark_system.set_up(5, 0, src)
|
||||||
spark_system.attach(src)
|
spark_system.attach(src)
|
||||||
return ..()
|
return ..()
|
||||||
|
*/
|
||||||
/obj/item/weapon/rcd/Destroy()
|
/obj/item/weapon/rcd/Destroy()
|
||||||
QDEL_NULL(spark_system)
|
QDEL_NULL(spark_system)
|
||||||
spark_system = null
|
spark_system = null
|
||||||
@@ -48,6 +49,7 @@
|
|||||||
return "It currently holds [stored_matter]/[max_stored_matter] matter-units."
|
return "It currently holds [stored_matter]/[max_stored_matter] matter-units."
|
||||||
|
|
||||||
// Used to add new cartridges.
|
// Used to add new cartridges.
|
||||||
|
/* VOREStation Tweak - Wow this is annoying, moved to _vr file for overhaul
|
||||||
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
|
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
|
||||||
if(istype(W, /obj/item/weapon/rcd_ammo))
|
if(istype(W, /obj/item/weapon/rcd_ammo))
|
||||||
var/obj/item/weapon/rcd_ammo/cartridge = W
|
var/obj/item/weapon/rcd_ammo/cartridge = W
|
||||||
@@ -61,9 +63,10 @@
|
|||||||
to_chat(user, span("notice", "The RCD now holds [stored_matter]/[max_stored_matter] matter-units."))
|
to_chat(user, span("notice", "The RCD now holds [stored_matter]/[max_stored_matter] matter-units."))
|
||||||
return TRUE
|
return TRUE
|
||||||
return ..()
|
return ..()
|
||||||
|
*/
|
||||||
// Changes which mode it is on.
|
// Changes which mode it is on.
|
||||||
/obj/item/weapon/rcd/attack_self(mob/living/user)
|
/obj/item/weapon/rcd/attack_self(mob/living/user)
|
||||||
|
/* VOREStation Removal - Moved to VR
|
||||||
if(mode_index >= modes.len) // Shouldn't overflow unless someone messes with it in VV poorly but better safe than sorry.
|
if(mode_index >= modes.len) // Shouldn't overflow unless someone messes with it in VV poorly but better safe than sorry.
|
||||||
mode_index = 1
|
mode_index = 1
|
||||||
else
|
else
|
||||||
@@ -74,7 +77,7 @@
|
|||||||
|
|
||||||
if(prob(20))
|
if(prob(20))
|
||||||
src.spark_system.start()
|
src.spark_system.start()
|
||||||
|
*/
|
||||||
// Removes resources if the RCD can afford it.
|
// Removes resources if the RCD can afford it.
|
||||||
/obj/item/weapon/rcd/proc/consume_resources(amount)
|
/obj/item/weapon/rcd/proc/consume_resources(amount)
|
||||||
if(!can_afford(amount))
|
if(!can_afford(amount))
|
||||||
@@ -118,6 +121,7 @@
|
|||||||
rcd_beam = beam_origin.Beam(A, icon_state = "rped_upgrade", time = max(true_delay, 5))
|
rcd_beam = beam_origin.Beam(A, icon_state = "rped_upgrade", time = max(true_delay, 5))
|
||||||
busy = TRUE
|
busy = TRUE
|
||||||
|
|
||||||
|
perform_effect(A, true_delay) //VOREStation Add
|
||||||
if(do_after(user, true_delay, target = A))
|
if(do_after(user, true_delay, target = A))
|
||||||
busy = FALSE
|
busy = FALSE
|
||||||
// Doing another check in case we lost matter during the delay for whatever reason.
|
// Doing another check in case we lost matter during the delay for whatever reason.
|
||||||
|
|||||||
218
code/game/objects/items/weapons/RCD_vr.dm
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
/obj/item/weapon/rcd
|
||||||
|
icon = 'icons/obj/tools_vr.dmi'
|
||||||
|
icon_state = "rcd"
|
||||||
|
item_state = "rcd"
|
||||||
|
item_icons = list(
|
||||||
|
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
|
||||||
|
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
|
||||||
|
)
|
||||||
|
var/ammostate
|
||||||
|
var/list/effects = list()
|
||||||
|
|
||||||
|
var/static/image/radial_image_airlock = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"),
|
||||||
|
var/static/image/radial_image_decon = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
|
||||||
|
var/static/image/radial_image_grillewind = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"),
|
||||||
|
var/static/image/radial_image_floorwall = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor")
|
||||||
|
|
||||||
|
// Ammo for the (non-electric) RCDs.
|
||||||
|
/obj/item/weapon/rcd_ammo
|
||||||
|
name = "compressed matter cartridge"
|
||||||
|
desc = "Highly compressed matter for the RCD."
|
||||||
|
icon = 'icons/obj/tools_vr.dmi'
|
||||||
|
icon_state = "rcdammo"
|
||||||
|
item_state = "rcdammo"
|
||||||
|
item_icons = list(
|
||||||
|
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
|
||||||
|
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
|
||||||
|
)
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/Initialize()
|
||||||
|
. = ..()
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/consume_resources(amount)
|
||||||
|
. = ..()
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/update_icon()
|
||||||
|
var/nearest_ten = round((stored_matter/max_stored_matter)*10, 1)
|
||||||
|
|
||||||
|
//Just to prevent updates every use
|
||||||
|
if(ammostate == nearest_ten)
|
||||||
|
return //No change
|
||||||
|
ammostate = nearest_ten
|
||||||
|
|
||||||
|
cut_overlays()
|
||||||
|
|
||||||
|
//Main sprite update
|
||||||
|
if(!nearest_ten)
|
||||||
|
icon_state = "[initial(icon_state)]_empty"
|
||||||
|
else
|
||||||
|
icon_state = "[initial(icon_state)]"
|
||||||
|
|
||||||
|
add_overlay("[initial(icon_state)]_charge[nearest_ten]")
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/proc/perform_effect(var/atom/A, var/time_taken)
|
||||||
|
effects[A] = new /obj/effect/constructing_effect(get_turf(A), time_taken, modes[mode_index])
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/use_rcd(atom/A, mob/living/user)
|
||||||
|
. = ..()
|
||||||
|
cleanup_effect(A)
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/proc/cleanup_effect(var/atom/A)
|
||||||
|
if(A in effects)
|
||||||
|
qdel(effects[A])
|
||||||
|
effects -= A
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
|
||||||
|
if(istype(W, /obj/item/weapon/rcd_ammo))
|
||||||
|
var/obj/item/weapon/rcd_ammo/cartridge = W
|
||||||
|
var/can_store = min(max_stored_matter - stored_matter, cartridge.remaining)
|
||||||
|
if(can_store <= 0)
|
||||||
|
to_chat(user, span("warning", "There's either no space or \the [cartridge] is empty!"))
|
||||||
|
return FALSE
|
||||||
|
stored_matter += can_store
|
||||||
|
cartridge.remaining -= can_store
|
||||||
|
if(!cartridge.remaining)
|
||||||
|
to_chat(user, span("warning", "\The [cartridge] dissolves as it empties of compressed matter."))
|
||||||
|
user.drop_from_inventory(W)
|
||||||
|
qdel(W)
|
||||||
|
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||||
|
to_chat(user, span("notice", "The RCD now holds [stored_matter]/[max_stored_matter] matter-units."))
|
||||||
|
update_icon()
|
||||||
|
return TRUE
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/proc/check_menu(mob/living/user)
|
||||||
|
if(!istype(user))
|
||||||
|
return FALSE
|
||||||
|
if(user.incapacitated() || !user.Adjacent(src))
|
||||||
|
return FALSE
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/attack_self(mob/living/user)
|
||||||
|
..()
|
||||||
|
var/list/choices = list(
|
||||||
|
"Airlock" = radial_image_airlock,
|
||||||
|
"Deconstruct" = radial_image_decon,
|
||||||
|
"Grilles & Windows" = radial_image_grillewind,
|
||||||
|
"Floors & Walls" = radial_image_floorwall
|
||||||
|
)
|
||||||
|
/* We don't have these features yet
|
||||||
|
if(upgrade & RCD_UPGRADE_FRAMES)
|
||||||
|
choices += list(
|
||||||
|
"Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"),
|
||||||
|
"Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"),
|
||||||
|
)
|
||||||
|
if(upgrade & RCD_UPGRADE_SILO_LINK)
|
||||||
|
choices += list(
|
||||||
|
"Silo Link" = image(icon = 'icons/obj/mining.dmi', icon_state = "silo"),
|
||||||
|
)
|
||||||
|
if(mode == RCD_AIRLOCK)
|
||||||
|
choices += list(
|
||||||
|
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
|
||||||
|
"Change Airlock Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocktype")
|
||||||
|
)
|
||||||
|
else if(mode == RCD_WINDOWGRILLE)
|
||||||
|
choices += list(
|
||||||
|
"Change Window Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype")
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||||
|
if(!check_menu(user))
|
||||||
|
return
|
||||||
|
switch(choice)
|
||||||
|
if("Floors & Walls")
|
||||||
|
mode_index = modes.Find(RCD_FLOORWALL)
|
||||||
|
if("Airlock")
|
||||||
|
mode_index = modes.Find(RCD_AIRLOCK)
|
||||||
|
if("Deconstruct")
|
||||||
|
mode_index = modes.Find(RCD_DECONSTRUCT)
|
||||||
|
if("Grilles & Windows")
|
||||||
|
mode_index = modes.Find(RCD_WINDOWGRILLE)
|
||||||
|
/* We don't have these features yet
|
||||||
|
if("Machine Frames")
|
||||||
|
mode = RCD_MACHINE
|
||||||
|
if("Computer Frames")
|
||||||
|
mode = RCD_COMPUTER
|
||||||
|
change_computer_dir(user)
|
||||||
|
return
|
||||||
|
if("Change Access")
|
||||||
|
change_airlock_access(user)
|
||||||
|
return
|
||||||
|
if("Change Airlock Type")
|
||||||
|
change_airlock_setting(user)
|
||||||
|
return
|
||||||
|
if("Change Window Type")
|
||||||
|
toggle_window_type(user)
|
||||||
|
return
|
||||||
|
if("Silo Link")
|
||||||
|
toggle_silo_link(user)
|
||||||
|
return
|
||||||
|
*/
|
||||||
|
else
|
||||||
|
return
|
||||||
|
playsound(src, 'sound/effects/pop.ogg', 50, FALSE)
|
||||||
|
to_chat(user, "<span class='notice'>You change RCD's mode to '[choice]'.</span>")
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
/obj/item/weapon/rcd/electric/update_icon()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/rcd/shipwright
|
||||||
|
icon_state = "swrcd"
|
||||||
|
item_state = "ircd"
|
||||||
|
can_remove_rwalls = TRUE
|
||||||
|
make_rwalls = TRUE
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
/obj/item/weapon/rcd_ammo/examine(mob/user)
|
||||||
|
..()
|
||||||
|
to_chat(user, display_resources())
|
||||||
|
|
||||||
|
// Used to show how much stuff (matter units, cell charge, etc) is left inside.
|
||||||
|
/obj/item/weapon/rcd_ammo/proc/display_resources()
|
||||||
|
return "It currently holds [remaining]/[initial(remaining)] matter-units."
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
/obj/effect/constructing_effect
|
||||||
|
icon = 'icons/effects/effects_rcd.dmi'
|
||||||
|
icon_state = ""
|
||||||
|
plane = TURF_PLANE
|
||||||
|
layer = ABOVE_TURF_LAYER
|
||||||
|
anchored = TRUE
|
||||||
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||||
|
var/status = 0
|
||||||
|
var/delay = 0
|
||||||
|
|
||||||
|
/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status)
|
||||||
|
. = ..()
|
||||||
|
status = rcd_status
|
||||||
|
delay = rcd_delay
|
||||||
|
if (status == RCD_DECONSTRUCT)
|
||||||
|
addtimer(CALLBACK(src, /atom/.proc/update_icon), 11)
|
||||||
|
delay -= 11
|
||||||
|
icon_state = "rcd_end_reverse"
|
||||||
|
else
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/effect/constructing_effect/update_icon()
|
||||||
|
icon_state = "rcd"
|
||||||
|
if (delay < 10)
|
||||||
|
icon_state += "_shortest"
|
||||||
|
else if (delay < 20)
|
||||||
|
icon_state += "_shorter"
|
||||||
|
else if (delay < 37)
|
||||||
|
icon_state += "_short"
|
||||||
|
if (status == RCD_DECONSTRUCT)
|
||||||
|
icon_state += "_reverse"
|
||||||
|
|
||||||
|
/obj/effect/constructing_effect/proc/end_animation()
|
||||||
|
if (status == RCD_DECONSTRUCT)
|
||||||
|
qdel(src)
|
||||||
|
else
|
||||||
|
icon_state = "rcd_end"
|
||||||
|
addtimer(CALLBACK(src, .proc/end), 15)
|
||||||
|
|
||||||
|
/obj/effect/constructing_effect/proc/end()
|
||||||
|
qdel(src)
|
||||||
@@ -8,8 +8,8 @@ RSF
|
|||||||
name = "\improper Rapid-Service-Fabricator"
|
name = "\improper Rapid-Service-Fabricator"
|
||||||
desc = "A device used to rapidly deploy service items."
|
desc = "A device used to rapidly deploy service items."
|
||||||
description_info = "Control Clicking on the device will allow you to choose the glass it dispenses when in the proper mode."
|
description_info = "Control Clicking on the device will allow you to choose the glass it dispenses when in the proper mode."
|
||||||
icon = 'icons/obj/tools.dmi'
|
icon = 'icons/obj/tools_vr.dmi' //VOREStation Edit
|
||||||
icon_state = "rcd"
|
icon_state = "rsf" //VOREStation Edit
|
||||||
opacity = 0
|
opacity = 0
|
||||||
density = 0
|
density = 0
|
||||||
anchored = 0.0
|
anchored = 0.0
|
||||||
|
|||||||
270
code/game/objects/items/weapons/inducer_vr.dm
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
/obj/item/weapon/inducer
|
||||||
|
name = "industrial inducer"
|
||||||
|
desc = "A tool for inductively charging internal power cells."
|
||||||
|
icon = 'icons/obj/tools_vr.dmi'
|
||||||
|
icon_state = "inducer-engi"
|
||||||
|
item_state = "inducer-engi"
|
||||||
|
item_icons = list(
|
||||||
|
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
|
||||||
|
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
|
||||||
|
)
|
||||||
|
force = 7
|
||||||
|
|
||||||
|
var/powertransfer = 1000 //Transfer per time when charging something
|
||||||
|
var/cell_type = /obj/item/weapon/cell/high //Type of cell to spawn in it
|
||||||
|
var/charge_guns = FALSE //Can it charge guns?
|
||||||
|
|
||||||
|
var/datum/effect/effect/system/spark_spread/spark_system
|
||||||
|
var/obj/item/weapon/cell/cell
|
||||||
|
var/recharging = FALSE
|
||||||
|
var/opened = FALSE
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/unloaded
|
||||||
|
cell_type = null
|
||||||
|
opened = TRUE
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/Initialize()
|
||||||
|
. = ..()
|
||||||
|
if(!cell && cell_type)
|
||||||
|
cell = new cell_type
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/proc/induce(var/obj/item/weapon/cell/target, coefficient)
|
||||||
|
var/totransfer = min(cell.charge,(powertransfer * coefficient))
|
||||||
|
var/transferred = target.give(totransfer)
|
||||||
|
cell.use(transferred)
|
||||||
|
cell.update_icon()
|
||||||
|
target.update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/get_cell()
|
||||||
|
return cell
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/emp_act(severity)
|
||||||
|
. = ..()
|
||||||
|
if(cell)
|
||||||
|
cell.emp_act(severity)
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/afterattack(atom/A, mob/living/carbon/user, proximity)
|
||||||
|
if(user.a_intent == I_HURT)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(cantbeused(user))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(recharge(A, user))
|
||||||
|
return
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/proc/cantbeused(mob/user)
|
||||||
|
if(!user.IsAdvancedToolUser())
|
||||||
|
to_chat(user, "<span class='warning'>You don't have the dexterity to use [src]!</span>")
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
if(!cell)
|
||||||
|
to_chat(user, "<span class='warning'>[src] doesn't have a power cell installed!</span>")
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
if(!cell.charge)
|
||||||
|
to_chat(user, "<span class='warning'>[src]'s battery is dead!</span>")
|
||||||
|
return TRUE
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/attackby(obj/item/W, mob/user)
|
||||||
|
if(W.is_screwdriver())
|
||||||
|
playsound(src, W.usesound, 50, 1)
|
||||||
|
if(!opened)
|
||||||
|
to_chat(user, "<span class='notice'>You open the battery compartment.</span>")
|
||||||
|
opened = TRUE
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='notice'>You close the battery compartment.</span>")
|
||||||
|
opened = FALSE
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
if(istype(W, /obj/item/weapon/cell))
|
||||||
|
if(opened)
|
||||||
|
if(!cell)
|
||||||
|
user.drop_from_inventory(W)
|
||||||
|
W.forceMove(src)
|
||||||
|
to_chat(user, "<span class='notice'>You insert [W] into [src].</span>")
|
||||||
|
cell = W
|
||||||
|
update_icon()
|
||||||
|
return
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='warning'>[src] already has \a [cell] installed!</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(cantbeused(user))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(recharge(W, user))
|
||||||
|
return
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/proc/recharge(atom/movable/A, mob/user)
|
||||||
|
if(!isturf(A) && user.loc == A)
|
||||||
|
return FALSE
|
||||||
|
if(recharging)
|
||||||
|
return TRUE
|
||||||
|
else
|
||||||
|
recharging = TRUE
|
||||||
|
|
||||||
|
if(istype(A, /obj/item/weapon/gun/energy) && !charge_guns)
|
||||||
|
to_chat(user, "<span class='alert'>Error unable to interface with device.</span>")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
//The cell we hopefully eventually find
|
||||||
|
var/obj/item/weapon/cell/C
|
||||||
|
|
||||||
|
//Synthetic humanoids
|
||||||
|
if(ishuman(A))
|
||||||
|
var/mob/living/carbon/human/H = A
|
||||||
|
if(H.isSynthetic())
|
||||||
|
C = new /obj/item/weapon/cell/standin(null, H) // o o f
|
||||||
|
|
||||||
|
//Borg frienbs
|
||||||
|
else if(isrobot(A))
|
||||||
|
var/mob/living/silicon/robot/R = A
|
||||||
|
C = R.cell
|
||||||
|
|
||||||
|
//Can set different coefficients per item if you want
|
||||||
|
var/coefficient = 1
|
||||||
|
|
||||||
|
//Last ditch effort
|
||||||
|
var/obj/O //For updating icons, just in case they have a battery meter icon
|
||||||
|
if(!C && isobj(A))
|
||||||
|
O = A
|
||||||
|
C = O.get_cell()
|
||||||
|
|
||||||
|
if(C)
|
||||||
|
var/done_any = FALSE
|
||||||
|
|
||||||
|
if(C.charge >= C.maxcharge)
|
||||||
|
to_chat(user, "<span class='notice'>[A] is fully charged ([round(C.charge)] / [C.maxcharge])!</span>")
|
||||||
|
recharging = FALSE
|
||||||
|
return TRUE
|
||||||
|
user.visible_message("<span class='notice'>[user] starts recharging [A] with [src].</span>", "<span class='notice'>You start recharging [A] with [src].</span>")
|
||||||
|
|
||||||
|
var/datum/beam/charge_beam = user.Beam(A, icon_state = "rped_upgrade", time = 20 SECONDS)
|
||||||
|
var/filter = filter(type = "outline", size = 1, color = "#22AAFF")
|
||||||
|
A.filters += filter
|
||||||
|
|
||||||
|
spark_system = new /datum/effect/effect/system/spark_spread
|
||||||
|
spark_system.set_up(5, 0, get_turf(A))
|
||||||
|
spark_system.attach(A)
|
||||||
|
|
||||||
|
while(C.charge < C.maxcharge)
|
||||||
|
if(do_after(user, 2 SECONDS, target = user) && cell.charge)
|
||||||
|
done_any = TRUE
|
||||||
|
induce(C, coefficient)
|
||||||
|
spark_system.start()
|
||||||
|
if(O)
|
||||||
|
O.update_icon()
|
||||||
|
else
|
||||||
|
break
|
||||||
|
|
||||||
|
QDEL_NULL(charge_beam)
|
||||||
|
QDEL_NULL(spark_system)
|
||||||
|
if(A)
|
||||||
|
A.filters -= filter
|
||||||
|
|
||||||
|
if(done_any) // Only show a message if we succeeded at least once
|
||||||
|
user.visible_message("<span class='notice'>[user] recharged [A]!</span>", "<span class='notice'>You recharged [A]!</span>")
|
||||||
|
|
||||||
|
recharging = FALSE
|
||||||
|
return TRUE
|
||||||
|
else //Couldn't find a cell
|
||||||
|
to_chat(user, "<span class='alert'>Error unable to interface with device.</span>")
|
||||||
|
|
||||||
|
recharging = FALSE
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/attack_self(mob/user)
|
||||||
|
if(opened && cell)
|
||||||
|
user.visible_message("<span class='notice'>[user] removes [cell] from [src]!</span>", "<span class='notice'>You remove [cell].</span>")
|
||||||
|
cell.update_icon()
|
||||||
|
user.put_in_hands(cell)
|
||||||
|
cell = null
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/examine(mob/living/M)
|
||||||
|
. = ..()
|
||||||
|
var/dat = ""
|
||||||
|
if(cell)
|
||||||
|
dat += "<br><span class='notice'>Its display shows: [round(cell.charge)] / [cell.maxcharge].</span>"
|
||||||
|
else
|
||||||
|
dat += "<br><span class='notice'>Its display is dark.</span>"
|
||||||
|
if(opened)
|
||||||
|
dat += "<br><span class='notice'>Its battery compartment is open.</span>"
|
||||||
|
to_chat(M, dat)
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/update_icon()
|
||||||
|
..()
|
||||||
|
cut_overlays()
|
||||||
|
if(opened)
|
||||||
|
if(!cell)
|
||||||
|
add_overlay("inducer-nobat")
|
||||||
|
else
|
||||||
|
add_overlay("inducer-bat")
|
||||||
|
|
||||||
|
//////// Variants
|
||||||
|
/obj/item/weapon/inducer/sci
|
||||||
|
name = "inducer"
|
||||||
|
desc = "A tool for inductively charging internal power cells. This one has a science color scheme, and is less potent than its engineering counterpart."
|
||||||
|
icon_state = "inducer-sci"
|
||||||
|
item_state = "inducer-sci"
|
||||||
|
cell_type = null
|
||||||
|
powertransfer = 500
|
||||||
|
opened = TRUE
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/sci/Initialize()
|
||||||
|
. = ..()
|
||||||
|
update_icon() //To get the 'open' state applied
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/syndicate
|
||||||
|
name = "suspicious inducer"
|
||||||
|
desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate."
|
||||||
|
icon_state = "inducer-syndi"
|
||||||
|
item_state = "inducer-syndi"
|
||||||
|
powertransfer = 2000
|
||||||
|
cell_type = /obj/item/weapon/cell/super
|
||||||
|
charge_guns = TRUE
|
||||||
|
|
||||||
|
/obj/item/weapon/inducer/hybrid
|
||||||
|
name = "hybrid-tech inducer"
|
||||||
|
desc = "A tool for inductively charging internal power cells. This one has some flashy bits and recharges devices slower, but seems to recharge itself between uses."
|
||||||
|
icon_state = "inducer-hybrid"
|
||||||
|
item_state = "inducer-hybrid"
|
||||||
|
powertransfer = 250
|
||||||
|
cell_type = /obj/item/weapon/cell/void
|
||||||
|
charge_guns = TRUE
|
||||||
|
|
||||||
|
// A 'human stand-in' cell for recharging 'nutrition' on synthetic humans (wow this is terrible! \o/)
|
||||||
|
/obj/item/weapon/cell/standin
|
||||||
|
name = "don't spawn this"
|
||||||
|
desc = "this is for weird code use, don't spawn it!!!"
|
||||||
|
|
||||||
|
charge = 100
|
||||||
|
maxcharge = 100
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/hume
|
||||||
|
|
||||||
|
/obj/item/weapon/cell/standin/New(newloc, var/mob/living/carbon/human/H)
|
||||||
|
..()
|
||||||
|
hume = H
|
||||||
|
charge = H.nutrition
|
||||||
|
maxcharge = initial(H.nutrition)
|
||||||
|
|
||||||
|
QDEL_IN(src, 20 SECONDS)
|
||||||
|
|
||||||
|
/obj/item/weapon/cell/standin/give(var/amount)
|
||||||
|
amount *= 0.05 // So 1000 becomes 50
|
||||||
|
..(amount)
|
||||||
|
hume.nutrition += amount
|
||||||
|
|
||||||
|
// Various sideways-defined get_cells
|
||||||
|
/obj/mecha/get_cell()
|
||||||
|
return cell
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
name = "Bluespace jumpsuit"
|
name = "Bluespace jumpsuit"
|
||||||
id = "bsjumpsuit"
|
id = "bsjumpsuit"
|
||||||
req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2)
|
req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2)
|
||||||
materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
|
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 4000)
|
||||||
build_path = /obj/item/clothing/under/bluespace
|
build_path = /obj/item/clothing/under/bluespace
|
||||||
sort_string = "TAVAA"
|
sort_string = "TAVAA"
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
name = "Size gun"
|
name = "Size gun"
|
||||||
id = "sizegun"
|
id = "sizegun"
|
||||||
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
||||||
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000)
|
materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_URANIUM = 2000)
|
||||||
build_path = /obj/item/weapon/gun/energy/sizegun
|
build_path = /obj/item/weapon/gun/energy/sizegun
|
||||||
sort_string = "TAVAB"
|
sort_string = "TAVAB"
|
||||||
|
|
||||||
@@ -18,6 +18,22 @@
|
|||||||
name = "Body Snatcher"
|
name = "Body Snatcher"
|
||||||
id = "bodysnatcher"
|
id = "bodysnatcher"
|
||||||
req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2)
|
req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2)
|
||||||
materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
|
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 4000)
|
||||||
build_path = /obj/item/device/bodysnatcher
|
build_path = /obj/item/device/bodysnatcher
|
||||||
sort_string = "TBVAA"
|
sort_string = "TBVAA"
|
||||||
|
|
||||||
|
/datum/design/item/general/inducer_sci
|
||||||
|
name = "Inducer (Scientific)"
|
||||||
|
id = "inducersci"
|
||||||
|
req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 5, TECH_POWER = 6)
|
||||||
|
materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GLASS = 2000, MAT_URANIUM = 4000, MAT_PHORON = 4000)
|
||||||
|
build_path = /obj/item/weapon/inducer/sci
|
||||||
|
sort_string = "TAVAB"
|
||||||
|
|
||||||
|
/datum/design/item/general/inducer_eng
|
||||||
|
name = "Inducer (Industrial)"
|
||||||
|
id = "inducerind"
|
||||||
|
req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 7, TECH_POWER = 7)
|
||||||
|
materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 2000)
|
||||||
|
build_path = /obj/item/weapon/inducer/unloaded
|
||||||
|
sort_string = "TAVAC"
|
||||||
|
|||||||
@@ -15,7 +15,26 @@
|
|||||||
var/mat_efficiency = 1
|
var/mat_efficiency = 1
|
||||||
var/speed = 1
|
var/speed = 1
|
||||||
|
|
||||||
materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, MAT_PLASTEEL = 0, "plastic" = 0, MAT_GRAPHITE = 0, "gold" = 0, "silver" = 0, "osmium" = 0, MAT_LEAD = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0)
|
//VOREStation Edit - Broke this into lines
|
||||||
|
materials = list(
|
||||||
|
DEFAULT_WALL_MATERIAL = 0,
|
||||||
|
"glass" = 0,
|
||||||
|
MAT_PLASTEEL = 0,
|
||||||
|
"plastic" = 0,
|
||||||
|
MAT_GRAPHITE = 0,
|
||||||
|
"gold" = 0,
|
||||||
|
"silver" = 0,
|
||||||
|
"osmium" = 0,
|
||||||
|
MAT_LEAD = 0,
|
||||||
|
"phoron" = 0,
|
||||||
|
"uranium" = 0,
|
||||||
|
"diamond" = 0,
|
||||||
|
MAT_DURASTEEL = 0,
|
||||||
|
MAT_VERDANTIUM = 0,
|
||||||
|
MAT_MORPHIUM = 0,
|
||||||
|
MAT_METALHYDROGEN = 0,
|
||||||
|
MAT_SUPERMATTER = 0,
|
||||||
|
MAT_TITANIUM = 0)
|
||||||
|
|
||||||
hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
|
hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
|
||||||
|
|
||||||
|
|||||||
BIN
icons/effects/effects_rcd.dmi
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 14 KiB |
@@ -1378,10 +1378,7 @@
|
|||||||
/area/aro2/storage)
|
/area/aro2/storage)
|
||||||
"cO" = (
|
"cO" = (
|
||||||
/obj/structure/table/rack/shelf/steel,
|
/obj/structure/table/rack/shelf/steel,
|
||||||
/obj/item/device/sleevemate,
|
|
||||||
/obj/item/device/universal_translator,
|
/obj/item/device/universal_translator,
|
||||||
/obj/item/weapon/cell/device/weapon/recharge/alien,
|
|
||||||
/obj/item/device/perfect_tele/alien,
|
|
||||||
/turf/simulated/floor/tiled/techmaint,
|
/turf/simulated/floor/tiled/techmaint,
|
||||||
/area/aro2/storage)
|
/area/aro2/storage)
|
||||||
"cP" = (
|
"cP" = (
|
||||||
@@ -1596,6 +1593,8 @@
|
|||||||
pixel_y = 0;
|
pixel_y = 0;
|
||||||
report_danger_level = 0
|
report_danger_level = 0
|
||||||
},
|
},
|
||||||
|
/obj/structure/table/rack/shelf/steel,
|
||||||
|
/obj/item/device/sleevemate,
|
||||||
/turf/simulated/floor/tiled/techmaint,
|
/turf/simulated/floor/tiled/techmaint,
|
||||||
/area/aro2/storage)
|
/area/aro2/storage)
|
||||||
"dp" = (
|
"dp" = (
|
||||||
@@ -2065,6 +2064,9 @@
|
|||||||
name = "east bump";
|
name = "east bump";
|
||||||
pixel_x = 24
|
pixel_x = 24
|
||||||
},
|
},
|
||||||
|
/obj/structure/table/rack/shelf/steel,
|
||||||
|
/obj/item/device/perfect_tele/alien,
|
||||||
|
/obj/item/weapon/inducer/hybrid,
|
||||||
/turf/simulated/floor/tiled/techmaint,
|
/turf/simulated/floor/tiled/techmaint,
|
||||||
/area/aro2/storage)
|
/area/aro2/storage)
|
||||||
"ef" = (
|
"ef" = (
|
||||||
|
|||||||
@@ -1166,6 +1166,7 @@
|
|||||||
#include "code\game\objects\items\weapons\handcuffs.dm"
|
#include "code\game\objects\items\weapons\handcuffs.dm"
|
||||||
#include "code\game\objects\items\weapons\handcuffs_vr.dm"
|
#include "code\game\objects\items\weapons\handcuffs_vr.dm"
|
||||||
#include "code\game\objects\items\weapons\improvised_components.dm"
|
#include "code\game\objects\items\weapons\improvised_components.dm"
|
||||||
|
#include "code\game\objects\items\weapons\inducer_vr.dm"
|
||||||
#include "code\game\objects\items\weapons\manuals.dm"
|
#include "code\game\objects\items\weapons\manuals.dm"
|
||||||
#include "code\game\objects\items\weapons\manuals_vr.dm"
|
#include "code\game\objects\items\weapons\manuals_vr.dm"
|
||||||
#include "code\game\objects\items\weapons\mop.dm"
|
#include "code\game\objects\items\weapons\mop.dm"
|
||||||
@@ -1174,6 +1175,7 @@
|
|||||||
#include "code\game\objects\items\weapons\paiwire.dm"
|
#include "code\game\objects\items\weapons\paiwire.dm"
|
||||||
#include "code\game\objects\items\weapons\policetape.dm"
|
#include "code\game\objects\items\weapons\policetape.dm"
|
||||||
#include "code\game\objects\items\weapons\RCD.dm"
|
#include "code\game\objects\items\weapons\RCD.dm"
|
||||||
|
#include "code\game\objects\items\weapons\RCD_vr.dm"
|
||||||
#include "code\game\objects\items\weapons\RSF.dm"
|
#include "code\game\objects\items\weapons\RSF.dm"
|
||||||
#include "code\game\objects\items\weapons\scrolls.dm"
|
#include "code\game\objects\items\weapons\scrolls.dm"
|
||||||
#include "code\game\objects\items\weapons\shields.dm"
|
#include "code\game\objects\items\weapons\shields.dm"
|
||||||
|
|||||||