Files
kiwistation/code/game/machinery/embedded_controller/access_controller.dm
T
Qustinnus 74755a5a3a Audio falloff re-work, and increased audio range. (#54362)
imo; the ss13 audio-scape is quite barren, you can only hear most things if you can see them, which in my opinion doesn't make much sense. This changes that so you can hear further away, but falloff is much higher, so in reality you will only hear things relatively quietly when they're out of sight.

This PR increases the hearing distance of most sound by 9, excluding sounds such as antag items that are meant to be used stealthily

This PR also replaces Byond's inbuilt falloff system with something I made, (And thanks to potato for helping me throw together a formula for it). This fall-off system makes sound fall off more naturally, with sounds being full volume within a certain range, and then softly falling off until they are completely quiet. This makes for a smoother transition between "This sound is full volume" and "I dont hear this sound".

Co-authored-by: ff <ff>
2020-10-20 17:14:16 -07:00

311 lines
8.9 KiB
Plaintext

#define CLOSING 1
#define OPENING 2
#define CYCLE 3
#define CYCLE_EXTERIOR 4
#define CYCLE_INTERIOR 5
/obj/machinery/door_buttons
power_channel = AREA_USAGE_ENVIRON
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 4
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/idSelf
/obj/machinery/door_buttons/attackby(obj/O, mob/user)
return attack_hand(user)
/obj/machinery/door_buttons/proc/findObjsByTag()
return
/obj/machinery/door_buttons/Initialize()
..()
return INITIALIZE_HINT_LATELOAD
/obj/machinery/door_buttons/LateInitialize()
findObjsByTag()
/obj/machinery/door_buttons/emag_act(mob/user)
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
req_access = list()
req_one_access = list()
playsound(src, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
/obj/machinery/door_buttons/proc/removeMe()
/obj/machinery/door_buttons/access_button
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_button_standby"
name = "access button"
desc = "A button used for the explicit purpose of opening an airlock."
var/idDoor
var/obj/machinery/door/airlock/door
var/obj/machinery/door_buttons/airlock_controller/controller
var/busy
/obj/machinery/door_buttons/access_button/findObjsByTag()
for(var/obj/machinery/door_buttons/airlock_controller/A in GLOB.machines)
if(A.idSelf == idSelf)
controller = A
break
for(var/obj/machinery/door/airlock/I in GLOB.machines)
if(I.id_tag == idDoor)
door = I
break
/obj/machinery/door_buttons/access_button/interact(mob/user)
if(busy)
return
if(!allowed(user))
to_chat(user, "<span class='warning'>Access denied.</span>")
return
if(controller && !controller.busy && door)
if(controller.machine_stat & NOPOWER)
return
busy = TRUE
update_icon()
if(door.density)
if(!controller.exteriorAirlock || !controller.interiorAirlock)
controller.onlyOpen(door)
else
if(controller.exteriorAirlock.density && controller.interiorAirlock.density)
controller.onlyOpen(door)
else
controller.cycleClose(door)
else
controller.onlyClose(door)
addtimer(CALLBACK(src, .proc/not_busy), 2 SECONDS)
/obj/machinery/door_buttons/access_button/proc/not_busy()
busy = FALSE
update_icon()
/obj/machinery/door_buttons/access_button/update_icon_state()
if(machine_stat & NOPOWER)
icon_state = "access_button_off"
else
if(busy)
icon_state = "access_button_cycle"
else
icon_state = "access_button_standby"
/obj/machinery/door_buttons/access_button/removeMe(obj/O)
if(O == door)
door = null
/obj/machinery/door_buttons/airlock_controller
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_control_standby"
name = "access console"
desc = "A small console that can cycle opening between two airlocks."
var/obj/machinery/door/airlock/interiorAirlock
var/obj/machinery/door/airlock/exteriorAirlock
var/idInterior
var/idExterior
var/busy
var/lostPower
/obj/machinery/door_buttons/airlock_controller/removeMe(obj/O)
if(O == interiorAirlock)
interiorAirlock = null
else if(O == exteriorAirlock)
exteriorAirlock = null
/obj/machinery/door_buttons/airlock_controller/Destroy()
for(var/obj/machinery/door_buttons/access_button/A in GLOB.machines)
if(A.controller == src)
A.controller = null
return ..()
/obj/machinery/door_buttons/airlock_controller/Topic(href, href_list)
if(..())
return
if(busy)
return
if(!allowed(usr))
to_chat(usr, "<span class='warning'>Access denied.</span>")
return
switch(href_list["command"])
if("close_exterior")
onlyClose(exteriorAirlock)
if("close_interior")
onlyClose(interiorAirlock)
if("cycle_exterior")
cycleClose(exteriorAirlock)
if("cycle_interior")
cycleClose(interiorAirlock)
if("open_exterior")
onlyOpen(exteriorAirlock)
if("open_interior")
onlyOpen(interiorAirlock)
/obj/machinery/door_buttons/airlock_controller/proc/onlyOpen(obj/machinery/door/airlock/A)
if(A)
busy = CLOSING
update_icon()
openDoor(A)
/obj/machinery/door_buttons/airlock_controller/proc/onlyClose(obj/machinery/door/airlock/A)
if(A)
busy = CLOSING
closeDoor(A)
/obj/machinery/door_buttons/airlock_controller/proc/closeDoor(obj/machinery/door/airlock/A)
if(A.density)
goIdle()
return FALSE
update_icon()
A.safe = FALSE //Door crushies, manual door after all. Set every time in case someone changed it, safe doors can end up waiting forever.
A.unbolt()
if(A.close())
if(machine_stat & NOPOWER || lostPower || !A || QDELETED(A))
goIdle(TRUE)
return FALSE
A.bolt()
goIdle(TRUE)
return TRUE
goIdle(TRUE)
return FALSE
/obj/machinery/door_buttons/airlock_controller/proc/cycleClose(obj/machinery/door/airlock/A)
if(!A || !exteriorAirlock || !interiorAirlock)
return
if(exteriorAirlock.density == interiorAirlock.density || !A.density)
return
busy = CYCLE
update_icon()
if(A == interiorAirlock)
if(closeDoor(exteriorAirlock))
busy = CYCLE_INTERIOR
else
if(closeDoor(interiorAirlock))
busy = CYCLE_EXTERIOR
/obj/machinery/door_buttons/airlock_controller/proc/cycleOpen(obj/machinery/door/airlock/A)
if(!A)
goIdle(TRUE)
if(A == exteriorAirlock)
if(interiorAirlock)
if(!interiorAirlock.density || !interiorAirlock.locked)
return
else
if(exteriorAirlock)
if(!exteriorAirlock.density || !exteriorAirlock.locked)
return
if(busy != OPENING)
busy = OPENING
openDoor(A)
/obj/machinery/door_buttons/airlock_controller/proc/openDoor(obj/machinery/door/airlock/A)
if(exteriorAirlock && interiorAirlock && (!exteriorAirlock.density || !interiorAirlock.density))
goIdle(TRUE)
return
A.unbolt()
INVOKE_ASYNC(src, .proc/do_openDoor, A)
/obj/machinery/door_buttons/airlock_controller/proc/do_openDoor(obj/machinery/door/airlock/A)
if(A?.open())
if(machine_stat | (NOPOWER) && !lostPower && A && !QDELETED(A))
A.bolt()
goIdle(TRUE)
/obj/machinery/door_buttons/airlock_controller/proc/goIdle(update)
lostPower = FALSE
busy = FALSE
if(update)
update_icon()
updateUsrDialog()
/obj/machinery/door_buttons/airlock_controller/process()
if(machine_stat & NOPOWER)
return
if(busy == CYCLE_EXTERIOR)
cycleOpen(exteriorAirlock)
else if(busy == CYCLE_INTERIOR)
cycleOpen(interiorAirlock)
/obj/machinery/door_buttons/airlock_controller/power_change()
. = ..()
if(machine_stat & NOPOWER)
lostPower = TRUE
else
if(!busy)
lostPower = FALSE
/obj/machinery/door_buttons/airlock_controller/findObjsByTag()
for(var/obj/machinery/door/airlock/A in GLOB.machines)
if(A.id_tag == idInterior)
interiorAirlock = A
else if(A.id_tag == idExterior)
exteriorAirlock = A
/obj/machinery/door_buttons/airlock_controller/update_icon_state()
if(machine_stat & NOPOWER)
icon_state = "access_control_off"
return
if(busy || lostPower)
icon_state = "access_control_process"
else
icon_state = "access_control_standby"
/obj/machinery/door_buttons/airlock_controller/ui_interact(mob/user)
var/datum/browser/popup = new(user, "computer", name)
popup.set_content(returnText())
popup.open()
/obj/machinery/door_buttons/airlock_controller/proc/returnText()
var/output
if(!exteriorAirlock && !interiorAirlock)
return "ERROR ERROR ERROR ERROR"
if(lostPower)
output = "Initializing..."
else
if(!exteriorAirlock || !interiorAirlock)
if(!exteriorAirlock)
if(interiorAirlock.density)
output = "<A href='?src=[REF(src)];command=open_interior'>Open Interior Airlock</A><BR>"
else
output = "<A href='?src=[REF(src)];command=close_interior'>Close Interior Airlock</A><BR>"
else
if(exteriorAirlock.density)
output = "<A href='?src=[REF(src)];command=open_exterior'>Open Exterior Airlock</A><BR>"
else
output = "<A href='?src=[REF(src)];command=close_exterior'>Close Exterior Airlock</A><BR>"
else
if(exteriorAirlock.density)
if(interiorAirlock.density)
output = {"<A href='?src=[REF(src)];command=open_exterior'>Open Exterior Airlock</A><BR>
<A href='?src=[REF(src)];command=open_interior'>Open Interior Airlock</A><BR>"}
else
output = {"<A href='?src=[REF(src)];command=cycle_exterior'>Cycle to Exterior Airlock</A><BR>
<A href='?src=[REF(src)];command=close_interior'>Close Interior Airlock</A><BR>"}
else
if(interiorAirlock.density)
output = {"<A href='?src=[REF(src)];command=close_exterior'>Close Exterior Airlock</A><BR>
<A href='?src=[REF(src)];command=cycle_interior'>Cycle to Interior Airlock</A><BR>"}
else
output = {"<A href='?src=[REF(src)];command=close_exterior'>Close Exterior Airlock</A><BR>
<A href='?src=[REF(src)];command=close_interior'>Close Interior Airlock</A><BR>"}
output = {"<B>Access Control Console</B><HR>
[output]<HR>"}
if(exteriorAirlock)
output += "<B>Exterior Door: </B> [exteriorAirlock.density ? "closed" : "open"]<BR>"
if(interiorAirlock)
output += "<B>Interior Door: </B> [interiorAirlock.density ? "closed" : "open"]<BR>"
return output
#undef CLOSING
#undef OPENING
#undef CYCLE
#undef CYCLE_EXTERIOR
#undef CYCLE_INTERIOR