mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-20 23:21:20 +00:00
315 lines
11 KiB
Plaintext
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
|