Files
Polaris/code/game/objects/items/weapons/RCD.dm

315 lines
11 KiB
Plaintext

// Contains the rapid construction device.
/obj/item/weapon/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.
/obj/item/weapon/rcd/Initialize()
src.spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
return ..()
/obj/item/weapon/rcd/Destroy()
QDEL_NULL(spark_system)
spark_system = null
return ..()
/obj/item/weapon/rcd/examine(mob/user)
. = ..()
. += display_resources()
// Used to show how much stuff (matter units, cell charge, etc) is left inside.
/obj/item/weapon/rcd/proc/display_resources()
return "It currently holds [stored_matter]/[max_stored_matter] matter-units."
// Used to add new cartridges.
/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
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/weapon/rcd/attack_self(mob/living/user)
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/weapon/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/weapon/rcd/proc/can_afford(amount)
return stored_matter >= amount
/obj/item/weapon/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/weapon/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
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/weapon/rcd/loaded/Initialize()
stored_matter = max_stored_matter
return ..()
// This one makes cooler walls by using an alternative material.
/obj/item/weapon/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/weapon/rcd/shipwright/loaded/Initialize()
stored_matter = max_stored_matter
return ..()
/obj/item/weapon/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/weapon/rcd/advanced/loaded/Initialize()
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/weapon/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/weapon/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/weapon/rcd/electric/Initialize()
if(make_cell)
cell = new /obj/item/weapon/cell/high(src)
return ..()
/obj/item/weapon/rcd/electric/Destroy()
if(cell)
QDEL_NULL(cell)
return ..()
/obj/item/weapon/rcd/electric/get_cell()
return cell
/obj/item/weapon/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/weapon/cell/cell = get_cell()
if(cell)
return cell.check_charge(amount * electric_cost_coefficent)
return FALSE
/obj/item/weapon/rcd/electric/consume_resources(amount)
if(!can_afford(amount))
return FALSE
var/obj/item/weapon/cell/cell = get_cell()
return cell.checked_use(amount * electric_cost_coefficent)
/obj/item/weapon/rcd/electric/display_resources()
var/obj/item/weapon/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/weapon/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/weapon/rcd/electric/mounted/get_cell()
return get_external_power_supply()
/obj/item/weapon/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/weapon/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/weapon/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/weapon/rcd/electric/mounted/borg/lesser
can_remove_rwalls = FALSE
// RCDs for RIGs.
/obj/item/weapon/rcd/electric/mounted/rig
// RCDs for Mechs.
/obj/item/weapon/rcd/electric/mounted/mecha
ranged = TRUE
toolspeed = 0.5
// Infinite use RCD for debugging/adminbuse.
/obj/item/weapon/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/weapon/rcd/debug/can_afford(amount)
return TRUE
/obj/item/weapon/rcd/debug/consume_resources(amount)
return TRUE
/obj/item/weapon/rcd/debug/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/rcd_ammo))
to_chat(user, span("notice", "\The [src] makes its own material, no need to add more."))
return FALSE
return ..()
/obj/item/weapon/rcd/debug/display_resources()
return "It has UNLIMITED POWER!"
// 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/ammo.dmi'
icon_state = "rcd"
item_state = "rcdammo"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000)
var/remaining = RCD_MAX_CAPACITY / 3
/obj/item/weapon/rcd_ammo/large
name = "high-capacity matter cartridge"
desc = "Do not ingest."
matter = list(DEFAULT_WALL_MATERIAL = 45000,"glass" = 22500)
origin_tech = list(TECH_MATERIAL = 4)
remaining = RCD_MAX_CAPACITY