Files
VOREStation/code/game/objects/items/weapons/RCD.dm
T
Cameron Lennox d5849910e5 Begin clickcode attack_self fix (#18797)
* Begin clickcode attack_self fix

Begins the work to make everything call back to parent for attack_self so that signals are sacred.

* Makes MORE things call the attack_self() parent

Yes, I could make special_handling a var on obj/item HOWEVER i want it to be specific so it can be tracked down later and ONLY the objects that use it can be refactored instead of sitting there literally forever and it just becoming 'a thing'.

* Finishes making the rest of attack_self call parent.

As mentioned, things such as 'specialty_goggles' 'special_handling' and the such are only there to help with attack_self until the attack_self is recoded for those items.

* begone foul demon

* some more cleanup

* These

* GOD this was annoying

* yeh

* Fix this

* fLARES

* Thesee too

* toys!

* Even more!

* More fixes

* Even more

* rest of em

* these too

* Update syndie.dm

* hardref clear

* Update code/game/gamemodes/nuclear/pinpointer.dm

* Update code/game/objects/effects/mines.dm

* Update code/game/objects/items/blueprints_vr.dm

* Update code/game/objects/items/blueprints_vr.dm

* Update code/game/objects/items/contraband_vr.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/gunbox.dm

* Update code/game/objects/items/gunbox.dm

* Update code/game/objects/items/gunbox_vr.dm

* Update code/game/objects/items/gunbox_vr.dm

* Update code/game/objects/items/weapons/gift_wrappaper.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/gunbox.dm

* these too

* Update maintpanel_stack.dm

* angry warning

* Fixes packaged snacks.

Fixes improper var default.

* Special handling for these

* proper poly types

* Fixes magclaws

Makes the 'features' it had just part  of base magboots that can be adjusted via varswap.

* Fixes jackets

Fixes https://github.com/VOREStation/VOREStation/issues/18941

* Small bugfix

Makes p_Theyre properly capitialize
Makes examine show proper wording

* Update gift_wrappaper.dm
2025-12-29 13:21:10 -05:00

322 lines
11 KiB
Plaintext

// Contains the rapid construction device.
/obj/item/rcd
name = "rapid construction device"
desc = "A device used to rapidly build and deconstruct. Reload with compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
item_state = "rcd"
drop_sound = 'sound/items/drop/gun.ogg'
pickup_sound = 'sound/items/pickup/gun.ogg'
flags = NOBLUDGEON
force = 10
throwforce = 10
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 50000)
preserve_item = TRUE // RCDs are pretty important.
var/datum/effect/effect/system/spark_spread/spark_system
var/stored_matter = 0
var/max_stored_matter = RCD_MAX_CAPACITY
var/ranged = FALSE
var/busy = FALSE
var/allow_concurrent_building = FALSE // If true, allows for multiple RCD builds at the same time.
var/mode_index = 1
var/list/modes = list(RCD_FLOORWALL, RCD_AIRLOCK, RCD_WINDOWGRILLE, RCD_DECONSTRUCT)
var/can_remove_rwalls = FALSE
var/airlock_type = /obj/machinery/door/airlock
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/make_rwalls = FALSE // If true, when building walls, they will be reinforced.
/* VOREStation Removal - Unused
/obj/item/rcd/Initialize(mapload)
src.spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
return ..()
*/
/obj/item/rcd/Destroy()
QDEL_NULL(spark_system)
spark_system = null
return ..()
/obj/item/rcd/examine(mob/user)
. = ..()
. += display_resources()
// Used to show how much stuff (matter units, cell charge, etc) is left inside.
/obj/item/rcd/proc/display_resources()
return "It currently holds [stored_matter]/[max_stored_matter] matter-units."
// Used to add new cartridges.
/* VOREStation Tweak - Wow this is annoying, moved to _vr file for overhaul
/obj/item/rcd/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/rcd_ammo))
var/obj/item/rcd_ammo/cartridge = W
if((stored_matter + cartridge.remaining) > max_stored_matter)
to_chat(user, span_warning("The RCD can't hold that many additional matter-units."))
return FALSE
stored_matter += cartridge.remaining
user.drop_from_inventory(W)
qdel(W)
playsound(src, 'sound/machines/click.ogg', 50, 1)
to_chat(user, span_notice("The RCD now holds [stored_matter]/[max_stored_matter] matter-units."))
return TRUE
return ..()
*/
// Changes which mode it is on.
/*/obj/item/rcd/attack_self(mob/living/user)
. = ..(user)
if(.)
return TRUE
//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.
mode_index = 1
else
mode_index++
to_chat(user, span_notice("Changed mode to '[modes[mode_index]]'."))
playsound(src, 'sound/effects/pop.ogg', 50, 0)
if(prob(20))
src.spark_system.start()
*/
// Removes resources if the RCD can afford it.
/obj/item/rcd/proc/consume_resources(amount)
if(!can_afford(amount))
return FALSE
stored_matter -= amount
return TRUE
// Useful for testing before actually paying (e.g. before a do_after() ).
/obj/item/rcd/proc/can_afford(amount)
return stored_matter >= amount
/obj/item/rcd/afterattack(atom/A, mob/living/user, proximity)
if(!ranged && !proximity)
return FALSE
use_rcd(A, user)
// Used to call rcd_act() on the atom hit.
/obj/item/rcd/proc/use_rcd(atom/A, mob/living/user)
if(busy && !allow_concurrent_building)
to_chat(user, span_warning("\The [src] is busy finishing its current operation, be patient."))
return FALSE
var/list/rcd_results = A.rcd_values(user, src, modes[mode_index])
if(!rcd_results)
to_chat(user, span_warning("\The [src] blinks a red light as you point it towards \the [A], indicating \
that it won't work. Try changing the mode, or use it on something else."))
return FALSE
if(!can_afford(rcd_results[RCD_VALUE_COST]))
to_chat(user, span_warning("\The [src] lacks the required material to start."))
return FALSE
playsound(src, 'sound/machines/click.ogg', 50, 1)
var/true_delay = rcd_results[RCD_VALUE_DELAY] * toolspeed
var/datum/beam/rcd_beam = null
if(ranged)
var/atom/movable/beam_origin = user // This is needed because mecha pilots are inside an object and the beam won't be made if it tries to attach to them..
if(!isturf(beam_origin.loc))
beam_origin = user.loc
rcd_beam = beam_origin.Beam(A, icon_state = "rped_upgrade", time = max(true_delay, 5))
busy = TRUE
perform_effect(A, true_delay) //VOREStation Add
if(do_after(user, true_delay, target = A))
busy = FALSE
// Doing another check in case we lost matter during the delay for whatever reason.
if(!can_afford(rcd_results[RCD_VALUE_COST]))
to_chat(user, span_warning("\The [src] lacks the required material to finish the operation."))
return FALSE
if(A.rcd_act(user, src, rcd_results[RCD_VALUE_MODE]))
consume_resources(rcd_results[RCD_VALUE_COST])
playsound(A, 'sound/items/deconstruct.ogg', 50, 1)
return TRUE
// If they moved, kill the beam immediately.
qdel(rcd_beam)
busy = FALSE
return FALSE
// RCD variants.
// This one starts full.
/obj/item/rcd/loaded/Initialize(mapload)
stored_matter = max_stored_matter
return ..()
// This one makes cooler walls by using an alternative material.
/obj/item/rcd/shipwright
name = "shipwright's rapid construction device"
desc = "A device used to rapidly build and deconstruct. This version creates a stronger variant of wall, often \
used in the construction of hulls for starships. Reload with compressed matter cartridges."
material_to_use = MAT_STEELHULL
/obj/item/rcd/shipwright/loaded/Initialize(mapload)
stored_matter = max_stored_matter
return ..()
/obj/item/rcd/advanced
name = "advanced rapid construction device"
desc = "A device used to rapidly build and deconstruct. This version works at a range, builds faster, and has a much larger capacity. \
Reload with compressed matter cartridges."
icon_state = "adv_rcd"
ranged = TRUE
toolspeed = 0.5 // Twice as fast.
max_stored_matter = RCD_MAX_CAPACITY * 3 // Three times capacity.
/obj/item/rcd/advanced/loaded/Initialize(mapload)
stored_matter = max_stored_matter
return ..()
// Electric RCDs.
// Currently just a base for the mounted RCDs.
// Currently there isn't a way to swap out the cells.
// One could be added if there is demand to do so.
/obj/item/rcd/electric
name = "electric rapid construction device"
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity, no matter cartridges needed."
icon_state = "electric_rcd"
var/obj/item/cell/cell = null
var/make_cell = TRUE // If false, initialize() won't spawn a cell for this.
var/electric_cost_coefficent = 83.33 // Higher numbers make it less efficent. 86.3... means it should matche the standard RCD capacity on a 10k cell.
/obj/item/rcd/electric/Initialize(mapload)
if(make_cell)
cell = new /obj/item/cell/high(src)
return ..()
/obj/item/rcd/electric/Destroy()
if(cell)
QDEL_NULL(cell)
return ..()
/obj/item/rcd/electric/get_cell()
return cell
/obj/item/rcd/electric/can_afford(amount) // This makes it so borgs won't drain their last sliver of charge by mistake, as a bonus.
var/obj/item/cell/cell = get_cell()
if(cell)
return cell.check_charge(amount * electric_cost_coefficent)
return FALSE
/obj/item/rcd/electric/consume_resources(amount)
if(!can_afford(amount))
return FALSE
var/obj/item/cell/cell = get_cell()
return cell.checked_use(amount * electric_cost_coefficent)
/obj/item/rcd/electric/display_resources()
var/obj/item/cell/cell = get_cell()
if(cell)
return "The power source connected to \the [src] has a charge of [cell.percent()]%."
return "It lacks a source of power, and cannot function."
// 'Mounted' RCDs, used for borgs/RIGs/Mechas, all of which use their cells to drive the RCD.
/obj/item/rcd/electric/mounted
name = "mounted electric rapid construction device"
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity from an external power source."
make_cell = FALSE
/obj/item/rcd/electric/mounted/get_cell()
return get_external_power_supply()
/obj/item/rcd/electric/mounted/proc/get_external_power_supply()
if(isrobot(loc)) // In a borg.
var/mob/living/silicon/robot/R = loc
return R.cell
if(istype(loc, /obj/item/rig_module)) // In a RIG.
var/obj/item/rig_module/module = loc
if(module.holder) // Is it attached to a RIG?
return module.holder.cell
if(istype(loc, /obj/item/mecha_parts/mecha_equipment)) // In a mech.
var/obj/item/mecha_parts/mecha_equipment/ME = loc
if(ME.chassis) // Is the part attached to a mech?
return ME.chassis.cell
return null
// RCDs for borgs.
/obj/item/rcd/electric/mounted/borg
can_remove_rwalls = TRUE
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity, drawing directly from your cell."
electric_cost_coefficent = 41.66 // Twice as efficent, out of pity.
toolspeed = 0.5 // Twice as fast, since borg versions typically have this.
/obj/item/rcd/electric/mounted/borg/swarm
can_remove_rwalls = FALSE
name = "Rapid Assimilation Device"
ranged = TRUE
toolspeed = 0.7
material_to_use = MAT_STEELHULL
/obj/item/rcd/electric/mounted/borg/lesser
can_remove_rwalls = FALSE
// RCDs for RIGs.
/obj/item/rcd/electric/mounted/rig
// RCDs for Mechs.
/obj/item/rcd/electric/mounted/mecha
ranged = TRUE
toolspeed = 0.5
// Infinite use RCD for debugging/adminbuse.
/obj/item/rcd/debug
name = "self-repleshing rapid construction device"
desc = "An RCD that appears to be plated with gold. For some reason it also seems to just \
be vastly superior to all other RCDs ever created, possibly due to it being colored gold."
icon_state = "debug_rcd"
ranged = TRUE
can_remove_rwalls = TRUE
allow_concurrent_building = TRUE
toolspeed = 0.25 // Four times as fast.
/obj/item/rcd/debug/can_afford(amount)
return TRUE
/obj/item/rcd/debug/consume_resources(amount)
return TRUE
/obj/item/rcd/debug/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/rcd_ammo))
to_chat(user, span_notice("\The [src] makes its own material, no need to add more."))
return FALSE
return ..()
/obj/item/rcd/debug/display_resources()
return "It has UNLIMITED POWER!"
// Ammo for the (non-electric) RCDs.
/obj/item/rcd_ammo
name = "compressed matter cartridge"
desc = "Highly compressed matter for the RCD."
icon = 'icons/obj/ammo.dmi'
icon_state = "rcd"
item_state = "rcdammo"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30000,MAT_GLASS = 15000)
var/remaining = RCD_MAX_CAPACITY / 3
/obj/item/rcd_ammo/large
name = "high-capacity matter cartridge"
desc = "Do not ingest."
matter = list(DEFAULT_WALL_MATERIAL = 45000,MAT_GLASS = 22500)
origin_tech = list(TECH_MATERIAL = 4)
remaining = RCD_MAX_CAPACITY