Files
2020-02-19 19:48:29 -08:00

738 lines
26 KiB
Plaintext

/*
CONTAINS:
RCD
Broken RCD + Effects
*/
#define RCD_MODE_FLOORSWALLS 1
#define RCD_MODE_AIRLOCK 2
#define RCD_MODE_DECONSTRUCT 3
#define RCD_MODE_WINDOWS 4
#define RCD_MODE_PODDOORCONTROL 5
#define RCD_MODE_PODDOOR 6
/*
@TODO Fix the description stuff so it isn't manually updated constantly
(get_desc is a thing!)
Also maybe better handling; use on walls to reinforce?, that sort of thing
maybe deconstructing an rwall turns into a normal wall first, etc
hm hm
also maybe an assoc list instead of matter_shit_fuck
*/
/obj/item/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build walls/floor."
icon = 'icons/obj/items.dmi'
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
anchored = 0.0
var/matter = 0
var/max_matter = 50
var/working = 0
var/mode = 1
flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
force = 10.0
throwforce = 10.0
throw_speed = 1
throw_range = 5
w_class = 3.0
m_amt = 50000
var/datum/effects/system/spark_spread/spark_system
mats = 12
stamina_damage = 15
stamina_cost = 15
stamina_crit_chance = 5
module_research = list("tools" = 8, "engineering" = 8, "devices" = 3, "efficiency" = 5)
module_research_type = /obj/item/rcd
var/matter_create_floor = 1
var/matter_create_wall = 2
var/matter_create_wall_girder = 1
var/matter_create_door = 5
var/matter_create_window = 2
var/matter_remove_door = 15
var/matter_remove_floor = 8
var/matter_remove_wall = 8
var/matter_remove_girder = 8
var/matter_remove_window = 8
var/material_name = "steel"
cyborg
material_name = "electrum"
/obj/item/rcd/construction
name = "rapid-construction-device (RCD) deluxe"
desc = "A device used to rapidly construct."
max_matter = 15000
matter_remove_door = 3
matter_remove_wall = 2
matter_remove_floor = 2
var/static/hangar_id_number = 1
var/hangar_id = null
var/door_name = null
var/door_access = 0
var/door_access_name_cache = null
var/static/list/access_names = list()
var/door_type = null
/obj/item/rcd_fake
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build walls/floor."
icon = 'icons/obj/items.dmi'
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
anchored = 0.0
flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
force = 10.0
throwforce = 10.0
throw_speed = 1
throw_range = 5
w_class = 3.0
// Doesn't shit out sparks everywhere, that's it. Doesn't even have any different vars
// Used for ghostdrones to prevent explode
/obj/item/rcd/rcd_safe
shitSparks()
return
/obj/item/rcd/construction/safe
shitSparks()
return
/obj/item/rcd_ammo
name = "Compressed matter cartridge"
desc = "Highly compressed matter for a rapid construction device."
icon = 'icons/obj/ammo.dmi'
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
icon_state = "rcd"
item_state = "rcdammo"
opacity = 0
density = 0
anchored = 0.0
m_amt = 30000
g_amt = 15000
var/matter = 10
examine()
..()
boutput(usr, "It contains [matter] units of ammo.")
/obj/item/rcd_ammo/medium
name = "Medium compressed matter cartridge"
matter = 50
/obj/item/rcd_ammo/big
name = "Large compressed matter cartridge"
matter = 100
/obj/item/rcd/New()
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
src.spark_system = unpool(/datum/effects/system/spark_spread)
spark_system.set_up(5, 0, src)
spark_system.attach(src)
return
/obj/item/rcd/proc/shitSparks()
spark_system.set_up(5, 0, src)
src.spark_system.start()
/obj/item/rcd/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/rcd_ammo))
if (!W:matter)
return
if (matter == max_matter)
boutput(user, "\the [src] can't hold any more matter.")
return
if (matter + W:matter > max_matter)
W:matter -= (max_matter - matter)
boutput(user, "The cartridge now contains [W:matter] units of matter.")
matter = max_matter
else
matter += W:matter
W:matter = 0
qdel(W)
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
boutput(user, "\the [src] now holds [matter]/[max_matter] matter-units.")
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
return
/obj/item/rcd/attack_self(mob/user as mob)
playsound(get_turf(src), "sound/effects/pop.ogg", 50, 0)
switch (mode)
if (RCD_MODE_FLOORSWALLS)
mode = RCD_MODE_AIRLOCK
boutput(user, "Changed mode to 'Airlock'")
if (RCD_MODE_AIRLOCK)
mode = RCD_MODE_DECONSTRUCT
boutput(user, "Changed mode to 'Deconstruct'")
if (RCD_MODE_DECONSTRUCT)
mode = RCD_MODE_WINDOWS
boutput(user, "Changed mode to 'Windows'")
else // RCD_MODE_WINDOWS or RCD_MODE_PODDOOR
mode = RCD_MODE_FLOORSWALLS
boutput(user, "Changed mode to 'Floors and Walls'")
src.shitSparks()
return
/obj/item/rcd/construction/attack_self(mob/user as mob)
// Swap to extra mode instead of wrapping around
if (mode != RCD_MODE_WINDOWS)
..()
else
mode = RCD_MODE_PODDOORCONTROL
boutput(user, "Changed mode to 'Pod Door Control'")
boutput(user, "<span style=\"color:blue\">Place a door control on a wall, then place any amount of pod doors on floors.</span>")
boutput(user, "<span style=\"color:blue\">You can also select an existing door control by whacking it with \the [src].</span>")
return
/obj/item/rcd/proc/create_door(var/turf/A, mob/user as mob)
boutput(user, "Building Airlock ([matter_create_door])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_create_door))
src.shitSparks()
var/interim = fetchAirlock()
var/obj/machinery/door/airlock/T = new interim(A)
logTheThing("station", user, null, "builds an airlock ([T]) using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
rcd_ammoconsume(user, matter_create_door)
if(map_setting == "COG2") T.dir = user.dir
T.autoclose = 1
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
playsound(get_turf(src), "sound/effects/sparks2.ogg", 50, 1)
/obj/item/rcd/construction/create_door(var/turf/A, mob/user as mob)
var/turf/L = get_turf(user)
var/set_data = 0
if (door_name)
if (alert("Use saved data?",,"Yes","No") == "No")
set_data = 1
else
set_data = 1
if (set_data)
door_name = copytext(adminscrub(input("Door name", "RCD", door_name) as text), 1, 512)
if (!access_names.len)
for (var/access in get_all_accesses())
var/access_name = get_access_desc(access)
access_names[access_name] = access
door_access_name_cache = input("Required access", "RCD", door_access_name_cache) in access_names
door_access = access_names[door_access_name_cache]
door_type = alert("Select airlock variant","RCD","Standard","Glass","Alternate")
if (user.loc != L)
boutput(user, "<span style=\"color:red\">Stand still you oaf.</span>")
return
boutput(user, "Building Airlock ([matter_create_door])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_create_door))
src.shitSparks()
var/interim = fetchAirlock(door_access,door_type)
var/obj/machinery/door/airlock/T = new interim(A)
logTheThing("station", user, null, "builds an airlock ([T], name: [door_name], access: [door_access]) using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
rcd_ammoconsume(user, matter_create_door)
if(map_setting == "COG2") T.dir = user.dir
T.autoclose = 1
T.name = door_name
T.req_access = list(door_access)
T.req_access_txt = "[door_access]"
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
playsound(get_turf(src), "sound/effects/sparks2.ogg", 50, 1)
/obj/item/rcd/construction/afterattack(atom/A, mob/user as mob)
..()
if (mode == RCD_MODE_DECONSTRUCT)
if (istype(A, /obj/machinery/door/poddoor/blast) && rcd_ammocheck(user, matter_remove_door, 500))
var /obj/machinery/door/poddoor/blast/B = A
if (findtext(B.id, "rcd_built") != 0)
boutput(user, "Deconstructing \the [B] ([matter_remove_door])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_door))
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
src.shitSparks()
rcd_ammoconsume(user, matter_remove_door)
logTheThing("station", user, null, "removes a pod door ([B]) using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
else
boutput(user, "<span style=\"color:red\">You cannot deconstruct that!</span>")
return
else if (istype(A, /obj/machinery/r_door_control) && rcd_ammocheck(user, matter_remove_door, 500))
var/obj/machinery/r_door_control/R = A
if (findtext(R.id, "rcd_built") != 0)
boutput(user, "Deconstructing \the [R] ([matter_remove_door])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_door))
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
src.shitSparks()
rcd_ammoconsume(user, matter_remove_door)
logTheThing("station", user, null, "removes a Door Control ([A]) using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
else
boutput(user, "<span style=\"color:red\">You cannot deconstruct that!</span>")
return
else if (mode == RCD_MODE_PODDOORCONTROL)
if (istype(A, /obj/machinery/r_door_control))
var/obj/machinery/r_door_control/R = A
if (findtext(R.id, "rcd_built") != 0)
boutput(user, "<span style=\"color:blue\">Selected.</span>")
hangar_id = R.id
mode = RCD_MODE_PODDOOR
else
boutput(user, "<span style=\"color:red\">You cannot modify that!</span>")
else if (istype(A, /turf/simulated/wall) && rcd_ammocheck(user, matter_create_door, 500))
boutput(user, "Creating Door Control ([matter_create_door])")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_create_door))
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
src.shitSparks()
var/idn = hangar_id_number
hangar_id_number++
hangar_id = "rcd_built_[idn]"
mode = RCD_MODE_PODDOOR
var/obj/machinery/r_door_control/R = new /obj/machinery/r_door_control(A)
R.id="[hangar_id]"
R.pass="[hangar_id]"
R.name="Access code: [hangar_id]"
rcd_ammoconsume(user, matter_create_door)
logTheThing("station", user, null, "creates Door Control [hangar_id] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
boutput(user, "Now creating pod bay blast doors linked to the new door control.")
else if (mode == RCD_MODE_PODDOOR)
if (istype(A, /turf/simulated/floor) && rcd_ammocheck(user, matter_create_door, 500))
boutput(user, "Creating Pod Bay Door ([matter_create_door])")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_create_door))
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
src.shitSparks()
var/stepdir = get_dir(src, A)
var/poddir = turn(stepdir, 90)
var/obj/machinery/door/poddoor/blast/B = new /obj/machinery/door/poddoor/blast(A)
B.id = "[hangar_id]"
B.dir = poddir
B.autoclose = 1
rcd_ammoconsume(user, matter_create_door)
logTheThing("station", user, null, "creates Blast Door [hangar_id] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
/obj/item/rcd/afterattack(atom/A, mob/user as mob)
if (get_dist(get_turf(src), get_turf(A)) > 1)
return
if (mode == RCD_MODE_FLOORSWALLS)
if ((istype(A, /obj/lattice) || istype(A, /turf/space)) && rcd_ammocheck(user, matter_create_floor, 50))
if (istype(A, /obj/lattice))
var/turf/L = get_turf(A)
if (!istype(L, /turf/space)) return
A = L
boutput(user, "Building a floor ([matter_create_floor])...")
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
src.shitSparks()
var/turf/simulated/floor/T = A:ReplaceWithFloor()
T.inherit_area()
T.setMaterial(getMaterial(material_name))
rcd_ammoconsume(user, matter_create_floor)
return
if (istype(A, /turf/simulated/floor) && rcd_ammocheck(user, matter_create_wall, 150))
boutput(user, "Building a wall ([matter_create_wall])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 20))
if (rcd_ammocheck(user, matter_create_wall))
src.shitSparks()
var/datum/material/M = A:material
var/turf/simulated/wall/T = A:ReplaceWithWall()
T.inherit_area()
if (M)
T.setMaterial(M)
else
T.setMaterial(getMaterial(material_name))
logTheThing("station", user, null, "builds \a [T] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
rcd_ammoconsume(user, matter_create_wall)
return
if (istype(A, /obj/structure/girder) && !istype(A, /obj/structure/girder/displaced) && rcd_ammocheck(user, matter_create_wall_girder, 50))
boutput(user, "Building a wall on \the [A] ([matter_create_wall_girder])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 20))
if (rcd_ammocheck(user, matter_create_wall_girder))
src.shitSparks()
var/datum/material/M = A:material
var/turf/wallTurf = get_turf(A)
var/turf/simulated/wall/T
if (istype(A, /obj/structure/girder/reinforced))
T = wallTurf:ReplaceWithRWall()
else
T = wallTurf:ReplaceWithWall()
if (M)
T.setMaterial(M)
else
T.setMaterial(getMaterial(material_name))
logTheThing("station", user, null, "builds \a [T] on \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
rcd_ammoconsume(user, matter_create_wall_girder)
return
else if (mode == RCD_MODE_AIRLOCK && rcd_ammocheck(user, matter_create_door, 1000) && istype(A, /turf/simulated/floor))
create_door(A, user)
return
else if (mode == RCD_MODE_DECONSTRUCT)
if (istype(A, /turf/simulated/wall) && rcd_ammocheck(user, matter_remove_wall, 500))
boutput(user, "Deconstructing \the [A] ([matter_remove_wall])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_wall))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_wall)
var/datum/material/M = A:material
var/turf/simulated/floor/T = A:ReplaceWithFloor()
if (M)
T.setMaterial(M)
else
T.setMaterial(getMaterial(material_name))
logTheThing("station", user, null, "removes \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if ((istype(A, /turf/simulated/wall/r_wall) || istype(A, /turf/simulated/wall/auto/reinforced)) && rcd_ammocheck(user, matter_remove_wall, 500))
boutput(user, "Deconstructing \the [A] ([matter_remove_wall])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_door))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_wall)
var/datum/material/M = A:material
var/turf/simulated/wall/T = A:ReplaceWithWall()
if (M)
T.setMaterial(M)
else
T.setMaterial(getMaterial(material_name))
logTheThing("station", user, null, "removes \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if (istype(A, /turf/simulated/floor) && rcd_ammocheck(user, matter_remove_floor, 500))
boutput(user, "Deconstructing Floor ([matter_remove_floor])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_floor))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_floor)
logTheThing("station", user, null, "removes the floor ([A]) using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
A:ReplaceWithSpace()
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if (istype(A, /obj/machinery/door/airlock) && rcd_ammocheck(user, matter_remove_door, 500))
var/obj/machinery/door/airlock/AL = A
if (AL.hardened == 1)
boutput(user, "<span style=\"color:red\">\The [AL] is reinforced against rapid deconstruction!</span>")
return
boutput(user, "Deconstructing \the [AL] ([matter_remove_door])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_door))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_door)
logTheThing("station", user, null, "removes an airlock ([AL]) using \the [src] at [log_loc(user)].")
qdel(AL)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if (istype(A, /obj/structure/girder) && rcd_ammocheck(user, matter_remove_girder, 500))
boutput(user, "Deconstructing \the [A] ([matter_remove_girder])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_girder))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_girder)
logTheThing("station", user, null, "removes \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if (istype(A, /obj/window) && rcd_ammocheck(user, matter_remove_window, 500))
boutput(user, "Deconstructing \the [A] ([matter_remove_window])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_window))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_window)
logTheThing("station", user, null, "removes \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
if (istype(A, /obj/lattice) && rcd_ammocheck(user, matter_remove_floor, 500))
boutput(user, "Deconstructing \the [A] ([matter_remove_floor])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 50))
if (rcd_ammocheck(user, matter_remove_floor))
src.shitSparks()
rcd_ammoconsume(user, matter_remove_floor)
logTheThing("station", user, null, "removes \a [A] using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
qdel(A)
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
return
else if (mode == 4)
if (istype(A, /turf/simulated/floor) && rcd_ammocheck(user, matter_create_window, 150))
boutput(user, "Building window ([matter_create_window])...")
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 20))
if (rcd_ammocheck(user, matter_create_window))
src.shitSparks()
// @TODO check if theres a better way to pick
//if (ismap("COGMAP2"))
new/obj/window/auto(get_turf(A))
//else
// new/obj/window(get_turf(A))
logTheThing("station", user, null, "builds a window using \the [src] in [user.loc.loc] ([showCoords(user.x, user.y, user.z)])")
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
rcd_ammoconsume(user, matter_create_window)
return
/*
// holy jesus christ
/obj/item/rcd/attack(mob/M as mob, mob/user as mob, def_zone)
if (ishuman(M) && matter >= 3)
var/mob/living/carbon/human/H = M
if(!isdead(H) && H.health > 0)
boutput(user, "<span style=\"color:red\">You poke [H] with \the [src].</span>")
boutput(H, "<span style=\"color:red\">[user] pokes you with \the [src].</span>")
return
boutput(user, "<span style=\"color:red\"><B>You shove \the [src] down [H]'s mouth and pull the trigger!</B></span>")
H.show_message("<span style=\"color:red\"><B>[user] is shoving an RCD down your throat!</B></span>", 1)
for(var/mob/N in viewers(user, 3))
if(N.client && N != user && N != H)
N.show_message(text("<span style=\"color:red\"><B>[] shoves \the [src] down []'s throat!</B></span>", user, H), 1)
playsound(get_turf(src), "sound/machines/click.ogg", 50, 1)
if(do_after(user, 20))
spark_system.set_up(5, 0, src)
src.spark_system.start()
var/mob/living/carbon/wall/W = new(H.loc)
W.real_name = H.real_name
playsound(get_turf(src), "sound/items/Deconstruct.ogg", 50, 1)
playsound(get_turf(src), "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
if(H.mind)
H.mind.transfer_to(W)
H.gib()
matter -= 3
boutput(user, "\the [src] now holds [matter]/30 matter-units.")
desc = "A RCD. It currently holds [matter]/30 matter-units."
return
else
return ..(M, user, def_zone)
*/
/obj/item/rcd/proc/rcd_ammocheck(mob/user as mob, var/checkamt = 0)
if (isrobot(user))
var/mob/living/silicon/robot/R = user
if (R.cell.charge >= checkamt * 5) return 1
else return 0
else if (isghostdrone(user))
var/mob/living/silicon/ghostdrone/R = user
if (R.cell.charge >= checkamt * 5) return 1
else return 0
else
if (src.matter >= checkamt) return 1
else return 0
/obj/item/rcd/proc/rcd_ammoconsume(mob/user as mob, var/checkamt = 0)
if (isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.charge -= checkamt * 125
else if (isghostdrone(user))
var/mob/living/silicon/ghostdrone/R = user
R.cell.charge -= checkamt * 125
else
src.matter -= checkamt
boutput(user, "\the [src] now holds [src.matter]/[src.max_matter] matter-units.")
src.desc = "A RCD. It currently holds [src.matter]/[src.max_matter] matter-units."
//Broken RCDs. Attempting to use them is...ill advised.
/obj/item/broken_rcd
name = "prototype rapid-construction-device (RCD)"
desc = "A device used to rapidly build walls/floor."
icon = 'icons/obj/items.dmi'
icon_state = "bad_rcd0"
inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi'
item_state = "rcd"
flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
force = 10.0
throwforce = 10.0
throw_speed = 1
throw_range = 5
w_class = 3.0
m_amt = 50000
var/mode = 1
var/broken = 0 //Fully broken, that is.
var/datum/effects/system/spark_spread/spark_system
New()
..()
src.icon_state = "bad_rcd[rand(0,2)]"
src.spark_system = unpool(/datum/effects/system/spark_spread)
spark_system.set_up(5, 0, src)
spark_system.attach(src)
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/rcd_ammo))
boutput(user, "\the [src] slot is not compatible with this cartridge.")
return
attack_self(mob/user as mob)
if (src.broken)
boutput(user, "<span style=\"color:red\">It's broken!</span>")
return
playsound(src.loc, "sound/effects/pop.ogg", 50, 0)
if (mode)
mode = 0
boutput(user, "Changed mode to 'Deconstruct'")
src.spark_system.start()
return
else
mode = 1
boutput(user, "Changed mode to 'Floor & Walls'")
src.spark_system.start()
return
afterattack(atom/A, mob/user as mob)
if (src.broken > 1)
boutput(user, "<span style=\"color:red\">It's broken!</span>")
return
if (!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock)))
return
if ((istype(A, /turf/space) || istype(A, /turf/simulated/floor)) && mode)
if (src.broken)
boutput(user, "<span style=\"color:red\">Insufficient charge.</span>")
return
boutput(user, "Building [istype(A, /turf/space) ? "Floor (1)" : "Wall (3)"]...")
playsound(src.loc, "sound/machines/click.ogg", 50, 1)
if(do_after(user, 20))
if (src.broken)
return
src.broken++
spark_system.set_up(5, 0, src)
src.spark_system.start()
playsound(src.loc, "sound/items/Deconstruct.ogg", 50, 1)
for (var/turf/T in orange(1,user))
T.ReplaceWithWall()
boutput(user, "<span style=\"color:red\">\the [src] shorts out!</span>")
return
else if (!mode)
boutput(user, "Deconstructing ??? ([rand(1,8)])...")
playsound(src.loc, "sound/machines/click.ogg", 50, 1)
if(do_after(user,50))
if (src.broken)
return
src.broken++
spark_system.set_up(5,0,src)
src.spark_system.start()
playsound(src.loc, "sound/items/Deconstruct.ogg", 100, 1)
boutput(user, "<span class='combat'>\the [src] shorts out!</span>")
logTheThing("combat", user, null, "manages to vaporize \[[showCoords(A.x, A.y, A.z)]] with a halloween RCD.")
new /obj/effects/void_break(A)
if (user)
user.gib()
/obj/effects/void_break
invisibility = 101
anchored = 1
var/lifespan = 4
var/rangeout = 0
New()
..()
lifespan = rand(2,4)
rangeout = lifespan
SPAWN_DBG(5 DECI SECONDS)
void_shatter()
void_loop()
proc/void_shatter()
playsound(src.loc, "sound/impact_sounds/Generic_Hit_Heavy_1.ogg", 80, 1)
for (var/atom/A in range(lifespan, src))
if (istype(A, /turf/simulated))
A.pixel_x = rand(-4,4)
A.pixel_y = rand(-4,4)
else if (isliving(A))
shake_camera(A, 8, 3)
A.ex_act( get_dist(src, A) > 1 ? 3 : 1 )
else if (istype(A, /obj) && (A != src))
if ((get_dist(src, A) <= 2) || prob(10))
A.ex_act(1)
else if (prob(5))
A.ex_act(3)
continue
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
s.set_up(3, 1, src)
s.start()
proc/void_loop()
if (lifespan-- < 0)
qdel(src)
return
for (var/turf/simulated/T in range(src, (rangeout-lifespan)))
if (prob(5 + lifespan) && limiter.canISpawn(/obj/effects/sparks))
var/obj/sparks = unpool(/obj/effects/sparks)
sparks.set_loc(T)
SPAWN_DBG(2 SECONDS) if (sparks) pool(sparks)
T.ex_act((rangeout-lifespan) < 2 ? 1 : 2)
SPAWN_DBG(1.5 SECONDS)
void_loop()
return