/* CONTAINS: RCD */ /obj/item/weapon/rcd name = "rapid-construction-device (RCD)" desc = "A device used to rapidly build and deconstruct walls and floors." icon = 'icons/obj/tools.dmi' icon_state = "rcd" opacity = 0 density = 0 anchored = 0 flags = CONDUCT | NOBLUDGEON force = 0 throwforce = 10 throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=100000) origin_tech = "engineering=4;materials=2" req_access_txt = "11" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/matter = 0 var/max_matter = 160 var/working = 0 var/mode = 1 var/canRturf = 0 var/airlock_type = /obj/machinery/door/airlock var/window_type = /obj/structure/window/fulltile var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal var/list/conf_access = null var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses. var/delay_mod = 1 var/no_ammo_message = "The \'Low Ammo\' light on \ the RCD blinks yellow." /obj/item/weapon/rcd/suicide_act(mob/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return (BRUTELOSS) /obj/item/weapon/rcd/verb/toggle_window_type() set name = "Toggle Window Type" set category = "Object" set src in usr // What does this do? var window_type_name if (window_type == /obj/structure/window/fulltile) window_type = /obj/structure/window/reinforced/fulltile window_type_name = "reinforced glass" else window_type = /obj/structure/window/fulltile window_type_name = "glass" to_chat(usr, "You change \the [src]'s window mode to [window_type_name].") /obj/item/weapon/rcd/verb/change_airlock_access() set name = "Change Airlock Access" set category = "Object" set src in usr if (!ishuman(usr) && !usr.has_unlimited_silicon_privilege) return ..(usr) var/mob/living/carbon/human/H = usr if(H.getBrainLoss() >= 60) return var/t1 = text("") if(use_one_access) t1 += "Restriction Type: At least one access required
" else t1 += "Restriction Type: All accesses required
" t1 += "Remove All
" var/accesses = "" accesses += "
Access
" accesses += "" accesses += "" for(var/i = 1; i <= 7; i++) accesses += "" accesses += "" for(var/i = 1; i <= 7; i++) accesses += "" accesses += "
[get_region_accesses_name(i)]:
" for(var/A in get_region_accesses(i)) if(A in conf_access) accesses += "[replacetext(get_access_desc(A), " ", " ")] " else accesses += "[replacetext(get_access_desc(A), " ", " ")] " accesses += "
" accesses += "
" t1 += "[accesses]" t1 += text("

Close

\n", src) var/datum/browser/popup = new(usr, "airlock_electronics", "Access Control", 900, 500) popup.set_content(t1) popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) popup.open() onclose(usr, "airlock") /obj/item/weapon/rcd/Topic(href, href_list) ..() if (usr.stat || usr.restrained()) return if (href_list["close"]) usr << browse(null, "window=airlock") return if (href_list["access"]) toggle_access(href_list["access"]) change_airlock_access() /obj/item/weapon/rcd/proc/toggle_access(acc) if (acc == "all") conf_access = null else if(acc == "one") use_one_access = !use_one_access else var/req = text2num(acc) if (conf_access == null) conf_access = list() if (!(req in conf_access)) conf_access += req else conf_access -= req if (!conf_access.len) conf_access = null /obj/item/weapon/rcd/verb/change_airlock_setting() set name = "Change Airlock Setting" set category = "Object" set src in usr var airlockcat = input(usr, "Select whether the airlock is solid or glass.") in list("Solid", "Glass") switch(airlockcat) if("Solid") if(advanced_airlock_setting == 1) var airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security") switch(airlockpaint) if("Default") airlock_type = /obj/machinery/door/airlock if("Engineering") airlock_type = /obj/machinery/door/airlock/engineering if("Atmospherics") airlock_type = /obj/machinery/door/airlock/atmos if("Security") airlock_type = /obj/machinery/door/airlock/security if("Command") airlock_type = /obj/machinery/door/airlock/command if("Medical") airlock_type = /obj/machinery/door/airlock/medical if("Research") airlock_type = /obj/machinery/door/airlock/research if("Mining") airlock_type = /obj/machinery/door/airlock/mining if("Maintenance") airlock_type = /obj/machinery/door/airlock/maintenance if("External") airlock_type = /obj/machinery/door/airlock/external if("High Security") airlock_type = /obj/machinery/door/airlock/highsecurity else airlock_type = /obj/machinery/door/airlock if("Glass") if(advanced_airlock_setting == 1) var airlockpaint = input(usr, "Select the paintjob of the airlock.") in list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining") switch(airlockpaint) if("Default") airlock_type = /obj/machinery/door/airlock/glass if("Engineering") airlock_type = /obj/machinery/door/airlock/glass_engineering if("Atmospherics") airlock_type = /obj/machinery/door/airlock/glass_atmos if("Security") airlock_type = /obj/machinery/door/airlock/glass_security if("Command") airlock_type = /obj/machinery/door/airlock/glass_command if("Medical") airlock_type = /obj/machinery/door/airlock/glass_medical if("Research") airlock_type = /obj/machinery/door/airlock/glass_research if("Mining") airlock_type = /obj/machinery/door/airlock/glass_mining else airlock_type = /obj/machinery/door/airlock/glass else airlock_type = /obj/machinery/door/airlock /obj/item/weapon/rcd/New() ..() desc = "An RCD. It currently holds [matter]/[max_matter] matter-units." src.spark_system = new /datum/effect_system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) GLOB.rcd_list += src /obj/item/weapon/rcd/Destroy() qdel(spark_system) spark_system = null GLOB.rcd_list -= src . = ..() /obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params) if(iscyborg(user)) //Make sure cyborgs can't load their RCDs return var/loaded = 0 if(istype(W, /obj/item/weapon/rcd_ammo)) var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) to_chat(user, "The RCD can't hold any more matter-units!") return qdel(W) matter += R.ammoamt playsound(src.loc, 'sound/machines/click.ogg', 50, 1) loaded = 1 else if(istype(W, /obj/item/stack/sheet/metal) || istype(W, /obj/item/stack/sheet/glass)) loaded = loadwithsheets(W, sheetmultiplier, user) else if(istype(W, /obj/item/stack/sheet/plasteel)) loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //Plasteel is worth 3 times more than glass or metal if(loaded) to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." else return ..() /obj/item/weapon/rcd/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user) var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD if(maxsheets > 0) var/amount_to_use = min(S.amount, maxsheets) S.use(amount_to_use) matter += value*amount_to_use playsound(src.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "You insert [amount_to_use] [S.name] sheets into the RCD. ") return 1 to_chat(user, "You can't insert any more [S.name] sheets into the RCD!") return 0 /obj/item/weapon/rcd/attack_self(mob/user) //Change the mode playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) switch(mode) if(1) mode = 2 to_chat(user, "You change RCD's mode to 'Airlock'.") if(2) mode = 3 to_chat(user, "You change RCD's mode to 'Deconstruct'.") if(3) mode = 4 to_chat(user, "You change RCD's mode to 'Grilles & Windows'.") if(4) mode = 1 to_chat(user, "You change RCD's mode to 'Floor & Walls'.") if(prob(20)) src.spark_system.start() /obj/item/weapon/rcd/proc/activate() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) /obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity) if(!proximity) return FALSE var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE if(do_after(user, rcd_results["delay"] * delay_mod, target = A)) if(checkResource(rcd_results["cost"], user)) if(A.rcd_act(user, src, rcd_results["mode"])) useResource(rcd_results["cost"], user) activate() playsound(src.loc, 'sound/machines/click.ogg', 50, 1) return TRUE /obj/item/weapon/rcd/proc/useResource(amount, mob/user) if(matter < amount) if(user) to_chat(user, no_ammo_message) return 0 matter -= amount desc = "An RCD. It currently holds [matter]/[max_matter] matter-units." return 1 /obj/item/weapon/rcd/proc/checkResource(amount, mob/user) . = matter >= amount if(!. && user) to_chat(user, no_ammo_message) return . /obj/item/weapon/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ buzz loudly!","[src] begins \ vibrating violently!") // 5 seconds to get rid of it addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50) /obj/item/weapon/rcd/proc/detonate_pulse_explode() explosion(src, 0, 0, 3, 1, flame_range = 1) qdel(src) /obj/item/weapon/rcd/borg/New() ..() no_ammo_message = "Insufficient charge." desc = "A device used to rapidly build walls and floors." canRturf = 1 /obj/item/weapon/rcd/borg/useResource(amount, mob/user) if(!iscyborg(user)) return 0 var/mob/living/silicon/robot/borgy = user if(!borgy.cell) if(user) to_chat(user, no_ammo_message) return 0 . = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs if(!. && user) to_chat(user, no_ammo_message) return . /obj/item/weapon/rcd/borg/checkResource(amount, mob/user) if(!iscyborg(user)) return 0 var/mob/living/silicon/robot/borgy = user if(!borgy.cell) if(user) to_chat(user, no_ammo_message) return 0 . = borgy.cell.charge >= (amount * 72) if(!. && user) to_chat(user, no_ammo_message) return . /obj/item/weapon/rcd/loaded matter = 160 /obj/item/weapon/rcd/combat name = "industrial RCD" max_matter = 500 matter = 500 /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" origin_tech = "materials=3" materials = list(MAT_METAL=12000, MAT_GLASS=8000) var/ammoamt = 40 /obj/item/weapon/rcd_ammo/large origin_tech = "materials=4" materials = list(MAT_METAL=48000, MAT_GLASS=32000) ammoamt = 160 /obj/item/weapon/rcd/admin name = "admin RCD" max_matter = INFINITY matter = INFINITY