mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-29 16:10:02 +01:00
Fleshes out wire panel skill behavior and signaler management. Electrical Engineering 4 was very OP for revealing all wire labels of all machines, and it was super fun while it lasted. Wire panels now have associated skills with their use, and increased skill ranks will increase the proportion of wires (chosen at random) that are easily recognizable on sight for certain types of wiring panels. **Professional:** 75% revealed **Trained:** 50% revealed **Familiar:** 30% revealed _(note: having both Electrical and Mechanical engineering at least Trained gives you that baseline 30%, reflecting how your knowledge can probably translate to decent guesswork.)_ The following wire panels are affected: **Electrical Engineering:** - APCs - Cameras - IFF Beacons - Radios - Smartfridges - SMES Units **Mechanical Engineering** - Airlocks - Disposal Units - Fabricators - Vending Machines **Atmospherics Systems** - Air Alarms **Reactor Systems** - Particle Accelerator Control Boxes (lol) **Robotics** - Hardsuits - Suit Storage Units (sharing the love is all) - Robots - Tag Scanners **Xenobiology** - Stasis Cages Also, I made it possible to blow out all the lights in an APC's area by snipping the power regulator cable and then pulsing the lights wire. Great for signalers. Speaking of signalers, new app deployed to all Engineering, Research, and Robotics personal modular computers: <img width="816" height="722" alt="Screenshot 2026-07-14 144049" src="https://github.com/user-attachments/assets/3d588712-ebfd-47ac-b699-7cdac2c04907" /> Self-explanatory. Please only use corporate-provided software for behavior within your contract regulations.
132 lines
3.6 KiB
Plaintext
132 lines
3.6 KiB
Plaintext
/obj/item/assembly
|
|
name = "assembly"
|
|
desc = "A small electronic device that should never exist."
|
|
icon = 'icons/obj/assemblies/new_assemblies.dmi'
|
|
icon_state = ""
|
|
obj_flags = OBJ_FLAG_CONDUCTABLE
|
|
w_class = WEIGHT_CLASS_TINY
|
|
matter = list(MATERIAL_STEEL = 100)
|
|
recyclable = TRUE
|
|
throwforce = 2
|
|
throw_speed = 3
|
|
throw_range = 10
|
|
drop_sound = 'sound/items/drop/component.ogg'
|
|
pickup_sound = 'sound/items/pickup/component.ogg'
|
|
origin_tech = list(TECH_MAGNET = 1)
|
|
|
|
var/secured = TRUE
|
|
var/list/attached_overlays = null
|
|
var/obj/item/assembly_holder/holder = null
|
|
var/cooldown = 0 //To prevent spam
|
|
|
|
/**
|
|
* Wires that the assembly has installed
|
|
*
|
|
* Refer to `code\__DEFINES\wires.dm` in the dedicated section for the supported wires, which _must_ be bitflags
|
|
*
|
|
* At the time of writing this, it supports:
|
|
* * WIRE_RECEIVE_ASSEMBLY
|
|
* * WIRE_PULSE_ASSEMBLY
|
|
* * WIRE_PULSE_SPECIAL
|
|
* * WIRE_RADIO_RECEIVE
|
|
* * WIRE_RADIO_PULSE
|
|
*/
|
|
var/wires = WIRE_RECEIVE_ASSEMBLY | WIRE_PULSE_ASSEMBLY
|
|
|
|
/obj/item/assembly/Destroy()
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
|
|
holder = null
|
|
ClearOverlays()
|
|
attached_overlays = null
|
|
|
|
. = ..()
|
|
|
|
/obj/item/assembly/proc/holder_movement()
|
|
return
|
|
|
|
//Called via spawn(10) to have it count down the cooldown var
|
|
/obj/item/assembly/proc/process_cooldown()
|
|
cooldown--
|
|
if(cooldown <= 0)
|
|
return FALSE
|
|
addtimer(CALLBACK(src, PROC_REF(process_cooldown)), 1 SECOND)
|
|
return TRUE
|
|
|
|
// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
|
|
/obj/item/assembly/proc/pulsed(var/radio = 0)
|
|
if(holder && (wires & WIRE_RECEIVE_ASSEMBLY))
|
|
activate()
|
|
if(radio && (wires & WIRE_RADIO_RECEIVE))
|
|
activate()
|
|
return TRUE
|
|
|
|
// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
|
|
/obj/item/assembly/proc/pulse(var/radio = 0)
|
|
if(holder && (wires & WIRE_PULSE_ASSEMBLY))
|
|
holder.process_activation(src, TRUE, FALSE)
|
|
if(holder && (wires & WIRE_PULSE_SPECIAL))
|
|
holder.process_activation(src, FALSE, TRUE)
|
|
return TRUE
|
|
|
|
/obj/item/assembly/proc/activate()
|
|
if(!secured || cooldown)
|
|
return FALSE
|
|
cooldown = 2
|
|
addtimer(CALLBACK(src, PROC_REF(process_cooldown)), 1 SECOND)
|
|
return TRUE
|
|
|
|
/obj/item/assembly/proc/toggle_secure()
|
|
secured = !secured
|
|
update_icon()
|
|
return secured
|
|
|
|
// Called when an assembly is attacked by another
|
|
/obj/item/assembly/proc/attach_assembly(var/obj/item/assembly/A, var/mob/user)
|
|
holder = new /obj/item/assembly_holder(get_turf(src))
|
|
if(holder.attach(A, src, user))
|
|
to_chat(user, SPAN_NOTICE("You attach \the [A] to \the [src]!"))
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/item/assembly/attackby(obj/item/attacking_item, mob/user)
|
|
if(isassembly(attacking_item))
|
|
var/obj/item/assembly/A = attacking_item
|
|
if(!A.secured && !secured)
|
|
attach_assembly(A, user)
|
|
return
|
|
if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER)
|
|
if(!toggle_secure())
|
|
to_chat(user, SPAN_NOTICE("\The [src] can now be attached!"))
|
|
return
|
|
return ..()
|
|
|
|
/obj/item/assembly/process()
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
return
|
|
|
|
/obj/item/assembly/feedback_hints(mob/user, distance, is_adjacent)
|
|
. += ..()
|
|
if((distance <= 1 || loc == user) && !secured)
|
|
. += SPAN_NOTICE("\The [src] can be attached!")
|
|
|
|
/obj/item/assembly/attack_self(mob/user)
|
|
if(!user)
|
|
return FALSE
|
|
interact(user)
|
|
return TRUE
|
|
|
|
/obj/item/assembly/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
|
|
SIGNAL_HANDLER
|
|
|
|
/obj/item/assembly/interact(mob/user)
|
|
return
|
|
|
|
/obj/item/assembly/ui_host(mob/user)
|
|
. = ..()
|
|
// Sets the UI host to the transfer valve if its mounted on a transfer_valve
|
|
if(istype(loc,/obj/item/transfer_valve))
|
|
return loc
|
|
|
|
return holder || .
|