mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
More PR fixes I guess
This commit is contained in:
@@ -33,6 +33,8 @@ datum/controller/game_controller
|
||||
|
||||
var/last_thing_processed
|
||||
|
||||
var/list/shuttle_list //for debugging and VV
|
||||
|
||||
datum/controller/game_controller/New()
|
||||
//There can be only one master_controller. Out with the old and in with the new.
|
||||
if(master_controller != src)
|
||||
@@ -69,6 +71,9 @@ datum/controller/game_controller/proc/setup()
|
||||
if(!garbage)
|
||||
garbage = new /datum/controller/garbage_collector()
|
||||
|
||||
if(!shuttles) setup_shuttles()
|
||||
shuttle_list = shuttles
|
||||
|
||||
setup_objects()
|
||||
setupgenetics()
|
||||
setupfactions()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
|
||||
|
||||
datum/shuttle_controller
|
||||
datum/shuttle_controller/emergency_shuttle
|
||||
var/alert = 0 //0 = emergency, 1 = crew cycle
|
||||
|
||||
var/location = 0 //0 = somewhere far away (in spess), 1 = at SS13, 2 = returned from SS13
|
||||
@@ -52,10 +52,10 @@ datum/shuttle_controller
|
||||
|
||||
return SHUTTLEARRIVETIME
|
||||
|
||||
datum/shuttle_controller/proc/shuttlealert(var/X)
|
||||
datum/shuttle_controller/emergency_shuttle/proc/shuttlealert(var/X)
|
||||
alert = X
|
||||
|
||||
datum/shuttle_controller/proc/recall()
|
||||
datum/shuttle_controller/emergency_shuttle/proc/recall()
|
||||
if(direction == 1)
|
||||
var/timeleft = timeleft()
|
||||
if(alert == 0)
|
||||
@@ -78,7 +78,7 @@ datum/shuttle_controller/proc/recall()
|
||||
|
||||
// returns the time (in seconds) before shuttle arrival
|
||||
// note if direction = -1, gives a count-up to SHUTTLEARRIVETIME
|
||||
datum/shuttle_controller/proc/timeleft()
|
||||
datum/shuttle_controller/emergency_shuttle/proc/timeleft()
|
||||
if(online)
|
||||
var/timeleft = round((endtime - world.timeofday)/10 ,1)
|
||||
if(direction == 1 || direction == 2)
|
||||
@@ -89,13 +89,13 @@ datum/shuttle_controller/proc/timeleft()
|
||||
return get_shuttle_arrive_time()
|
||||
|
||||
// sets the time left to a given delay (in seconds)
|
||||
datum/shuttle_controller/proc/settimeleft(var/delay)
|
||||
datum/shuttle_controller/emergency_shuttle/proc/settimeleft(var/delay)
|
||||
endtime = world.timeofday + delay * 10
|
||||
timelimit = delay
|
||||
|
||||
// sets the shuttle direction
|
||||
// 1 = towards SS13, -1 = back to centcom
|
||||
datum/shuttle_controller/proc/setdirection(var/dirn)
|
||||
datum/shuttle_controller/emergency_shuttle/proc/setdirection(var/dirn)
|
||||
if(direction == dirn)
|
||||
return
|
||||
direction = dirn
|
||||
@@ -104,7 +104,7 @@ datum/shuttle_controller/proc/setdirection(var/dirn)
|
||||
endtime = world.timeofday + (get_shuttle_arrive_time()*10 - ticksleft)
|
||||
return
|
||||
|
||||
datum/shuttle_controller/proc/process()
|
||||
datum/shuttle_controller/emergency_shuttle/proc/process()
|
||||
|
||||
datum/shuttle_controller/emergency_shuttle/process()
|
||||
if(!online)
|
||||
|
||||
@@ -17,6 +17,6 @@
|
||||
if(istype(door,/obj/machinery/door/airlock/hatch/gamma))
|
||||
return
|
||||
if(istype(door,/obj/machinery/door/airlock))
|
||||
door:locked = 0
|
||||
door:unlock(1) //forced because it's magic!
|
||||
door.open()
|
||||
return
|
||||
@@ -585,7 +585,7 @@
|
||||
icon_state = "RPED"
|
||||
item_state = "RPED"
|
||||
w_class = 5
|
||||
can_hold = list(/obj/item/weapon/stock_parts)
|
||||
can_hold = list("/obj/item/weapon/stock_parts")
|
||||
storage_slots = 14
|
||||
use_to_pickup = 1
|
||||
allow_quick_gather = 1
|
||||
|
||||
@@ -133,6 +133,8 @@ var/global/datum/controller/gameticker/ticker
|
||||
|
||||
//here to initialize the random events nicely at round start
|
||||
setup_economy()
|
||||
|
||||
setup_shuttle_docks()
|
||||
|
||||
spawn(0)//Forking here so we dont have to wait for this to finish
|
||||
mode.post_setup()
|
||||
|
||||
@@ -159,7 +159,7 @@ datum/game_mode/mutiny
|
||||
|
||||
proc/unbolt_vault_door()
|
||||
var/obj/machinery/door/airlock/vault = locate(/obj/machinery/door/airlock/vault)
|
||||
vault.locked = 0
|
||||
vault.lock()
|
||||
|
||||
proc/make_secret_transcript()
|
||||
var/obj/machinery/computer/telecomms/server/S = locate(/obj/machinery/computer/telecomms/server)
|
||||
|
||||
@@ -389,7 +389,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
|
||||
|
||||
if(ticker)
|
||||
if(ticker.mode && ticker.mode.name == "nuclear emergency")
|
||||
var/obj/machinery/computer/syndicate_station/syndie_location = locate(/obj/machinery/computer/syndicate_station)
|
||||
var/obj/machinery/computer/shuttle_control/multi/syndicate/syndie_location = locate(/obj/machinery/computer/shuttle_control/multi/syndicate)
|
||||
if(syndie_location)
|
||||
ticker.mode:syndies_didnt_escape = (syndie_location.z > 1 ? 0 : 1) //muskets will make me change this, but it will do for now
|
||||
ticker.mode:nuke_off_station = off_station
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
|
||||
/obj/item/weapon/pinpointer/nukeop
|
||||
var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle
|
||||
var/obj/machinery/computer/syndicate_station/home = null
|
||||
var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null
|
||||
slot_flags = SLOT_PDA | SLOT_BELT
|
||||
|
||||
/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
|
||||
|
||||
@@ -254,8 +254,9 @@ datum/game_mode/proc/auto_declare_completion_heist()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/vox/heist/check_finished()
|
||||
if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
|
||||
return 1
|
||||
// DO NOT FORGET TO FIX THIS.
|
||||
//if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
|
||||
// return 1
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/vox/heist/proc/is_vox_crew_alive()
|
||||
|
||||
@@ -229,8 +229,8 @@ datum/game_mode/proc/auto_declare_completion_trade()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/vox/trade/check_finished()
|
||||
if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
|
||||
return 1
|
||||
// if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
|
||||
// return 1
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/vox/trade/proc/is_vox_crew_alive()
|
||||
|
||||
@@ -173,10 +173,7 @@
|
||||
build_path = "/obj/machinery/computer/supplycomp"
|
||||
origin_tech = "programming=3"
|
||||
var/contraband_enabled = 0
|
||||
/obj/item/weapon/circuitboard/research_shuttle
|
||||
name = "Circuit board (Research Shuttle)"
|
||||
build_path = "/obj/machinery/computer/research_shuttle"
|
||||
origin_tech = "programming=2"
|
||||
|
||||
/obj/item/weapon/circuitboard/operating
|
||||
name = "Circuit board (Operating Computer)"
|
||||
build_path = "/obj/machinery/computer/operating"
|
||||
@@ -200,20 +197,17 @@
|
||||
/obj/item/weapon/circuitboard/splicer
|
||||
name = "Circuit board (Disease Splicer)"
|
||||
build_path = "/obj/machinery/computer/diseasesplicer"
|
||||
|
||||
/obj/item/weapon/circuitboard/mining_shuttle
|
||||
name = "Circuit board (Mining Shuttle)"
|
||||
build_path = "/obj/machinery/computer/mining_shuttle"
|
||||
build_path = "/obj/machinery/computer/shuttle_control/mining"
|
||||
origin_tech = "programming=2"
|
||||
|
||||
/obj/item/weapon/circuitboard/engineering_shuttle
|
||||
name = "Circuit board (Engineering Shuttle)"
|
||||
build_path = "/obj/machinery/computer/engineering_shuttle"
|
||||
build_path = "/obj/machinery/computer/shuttle_control/engineering"
|
||||
origin_tech = "programming=2"
|
||||
|
||||
/obj/item/weapon/circuitboard/research_shuttle
|
||||
name = "Circuit board (Research Shuttle)"
|
||||
build_path = "/obj/machinery/computer/research_shuttle"
|
||||
build_path = "/obj/machinery/computer/shuttle_control/research"
|
||||
origin_tech = "programming=2"
|
||||
/obj/item/weapon/circuitboard/HolodeckControl // Not going to let people get this, but it's just here for future
|
||||
name = "Circuit board (Holodeck Control)"
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
#define SYNDICATE_SHUTTLE_MOVE_TIME 240
|
||||
#define SYNDICATE_SHUTTLE_COOLDOWN 200
|
||||
|
||||
/obj/machinery/computer/syndicate_station
|
||||
name = "syndicate shuttle terminal"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
req_access = list(access_syndicate)
|
||||
var/area/curr_location
|
||||
var/moving = 0
|
||||
var/lastMove = 0
|
||||
|
||||
|
||||
/obj/machinery/computer/syndicate_station/New()
|
||||
curr_location= locate(/area/syndicate_station/start)
|
||||
|
||||
|
||||
/obj/machinery/computer/syndicate_station/proc/syndicate_move_to(area/destination as area)
|
||||
if(moving) return
|
||||
if(lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return
|
||||
var/area/dest_location = locate(destination)
|
||||
if(curr_location == dest_location) return
|
||||
|
||||
moving = 1
|
||||
lastMove = world.time
|
||||
|
||||
if(curr_location.z != dest_location.z)
|
||||
var/area/transit_location = locate(/area/syndicate_station/transit)
|
||||
curr_location.move_contents_to(transit_location)
|
||||
curr_location = transit_location
|
||||
sleep(SYNDICATE_SHUTTLE_MOVE_TIME)
|
||||
|
||||
curr_location.move_contents_to(dest_location)
|
||||
curr_location = dest_location
|
||||
moving = 0
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/syndicate_station/attackby(obj/item/I as obj, mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/syndicate_station/attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/syndicate_station/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/syndicate_station/attack_hand(mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = {"Location: [curr_location]<br>
|
||||
Ready to move[max(lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]<br>
|
||||
<a href='?src=\ref[src];syndicate=1'>Syndicate Space</a><br>
|
||||
<a href='?src=\ref[src];station_nw=1'>North West of SS13</a> |
|
||||
<a href='?src=\ref[src];station_n=1'>North of SS13</a> |
|
||||
<a href='?src=\ref[src];station_ne=1'>North East of SS13</a><br>
|
||||
<a href='?src=\ref[src];station_sw=1'>South West of SS13</a> |
|
||||
<a href='?src=\ref[src];station_s=1'>South of SS13</a> |
|
||||
<a href='?src=\ref[src];station_se=1'>South East of SS13</a><br>
|
||||
<a href='?src=\ref[src];commssat=1'>South of the Communication Satellite</a> |
|
||||
<a href='?src=\ref[src];mining=1'>North East of the Mining Asteroid</a><br>
|
||||
<a href='?src=\ref[user];mach_close=computer'>Close</a>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/syndicate_station/Topic(href, href_list)
|
||||
if(!isliving(usr)) return
|
||||
var/mob/living/user = usr
|
||||
|
||||
if(in_range(src, user) || istype(user, /mob/living/silicon))
|
||||
user.set_machine(src)
|
||||
|
||||
if(href_list["syndicate"])
|
||||
syndicate_move_to(/area/syndicate_station/start)
|
||||
else if(href_list["station_nw"])
|
||||
syndicate_move_to(/area/syndicate_station/northwest)
|
||||
else if(href_list["station_n"])
|
||||
syndicate_move_to(/area/syndicate_station/north)
|
||||
else if(href_list["station_ne"])
|
||||
syndicate_move_to(/area/syndicate_station/northeast)
|
||||
else if(href_list["station_sw"])
|
||||
syndicate_move_to(/area/syndicate_station/southwest)
|
||||
else if(href_list["station_s"])
|
||||
syndicate_move_to(/area/syndicate_station/south)
|
||||
else if(href_list["station_se"])
|
||||
syndicate_move_to(/area/syndicate_station/southeast)
|
||||
else if(href_list["commssat"])
|
||||
syndicate_move_to(/area/syndicate_station/commssat)
|
||||
else if(href_list["mining"])
|
||||
syndicate_move_to(/area/syndicate_station/mining)
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/syndicate_station/bullet_act(var/obj/item/projectile/Proj)
|
||||
visible_message("[Proj] ricochets off [src]!") //let's not let them fuck themselves in the rear
|
||||
@@ -1,129 +0,0 @@
|
||||
#define VOX_SHUTTLE_MOVE_TIME 400
|
||||
#define VOX_SHUTTLE_COOLDOWN 1200
|
||||
|
||||
//Copied from Syndicate shuttle.
|
||||
var/global/vox_shuttle_location
|
||||
var/global/announce_vox_departure = 1 //Stealth systems - give an announcement or not.
|
||||
|
||||
/obj/machinery/computer/vox_stealth
|
||||
name = "skipjack cloaking field terminal"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
/obj/machinery/computer/vox_stealth/attackby(obj/item/I as obj, mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_stealth/attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_stealth/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_stealth/attack_hand(mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
|
||||
if(announce_vox_departure)
|
||||
user << "\red Shuttle stealth systems have been activated. The Exodus will not be warned of our arrival."
|
||||
announce_vox_departure = 0
|
||||
else
|
||||
user << "\red Shuttle stealth systems have been deactivated. The Exodus will be warned of our arrival."
|
||||
announce_vox_departure = 1
|
||||
|
||||
|
||||
/obj/machinery/computer/vox_station
|
||||
name = "vox skipjack terminal"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "syndishuttle"
|
||||
req_access = list(access_syndicate)
|
||||
var/area/curr_location
|
||||
var/moving = 0
|
||||
var/lastMove = 0
|
||||
var/warning //Warning about the end of the round.
|
||||
|
||||
/obj/machinery/computer/vox_station/New()
|
||||
curr_location= locate(/area/shuttle/vox/station)
|
||||
|
||||
|
||||
/obj/machinery/computer/vox_station/proc/vox_move_to(area/destination as area)
|
||||
if(moving) return
|
||||
if(lastMove + VOX_SHUTTLE_COOLDOWN > world.time) return
|
||||
var/area/dest_location = locate(destination)
|
||||
if(curr_location == dest_location) return
|
||||
|
||||
if(announce_vox_departure)
|
||||
if(curr_location == locate(/area/shuttle/vox/station))
|
||||
command_alert("Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not.", "NSV Icarus")
|
||||
else if(dest_location == locate(/area/shuttle/vox/station))
|
||||
command_alert("Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of Tau Ceti at a rapid clip.", "NSV Icarus")
|
||||
|
||||
moving = 1
|
||||
lastMove = world.time
|
||||
|
||||
if(curr_location.z != dest_location.z)
|
||||
var/area/transit_location = locate(/area/vox_station/transit)
|
||||
curr_location.move_contents_to(transit_location)
|
||||
curr_location = transit_location
|
||||
sleep(VOX_SHUTTLE_MOVE_TIME)
|
||||
|
||||
curr_location.move_contents_to(dest_location)
|
||||
curr_location = dest_location
|
||||
moving = 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/vox_station/attackby(obj/item/I as obj, mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_station/attack_ai(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_station/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/vox_station/attack_hand(mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = {"Location: [curr_location]<br>
|
||||
Ready to move[max(lastMove + VOX_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + VOX_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]<br>
|
||||
<a href='?src=\ref[src];start=1'>Return to dark space</a><br>
|
||||
<a href='?src=\ref[src];arrivals=1'>Cyberiad Arrivals Dock</a> |
|
||||
<a href='?src=\ref[user];mach_close=computer'>Close</a>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/vox_station/Topic(href, href_list)
|
||||
if(!isliving(usr)) return
|
||||
var/mob/living/user = usr
|
||||
|
||||
if(in_range(src, user) || istype(user, /mob/living/silicon))
|
||||
user.set_machine(src)
|
||||
|
||||
vox_shuttle_location = "station"
|
||||
if(href_list["start"])
|
||||
if(ticker && (istype(ticker.mode,/datum/game_mode/vox/heist) || istype(ticker.mode,/datum/game_mode/vox/trade)))
|
||||
if(!warning)
|
||||
user << "\red Returning to dark space will end your mission and report your success or failure. If you are sure, press the button again."
|
||||
warning = 1
|
||||
return
|
||||
vox_move_to(/area/shuttle/vox/station)
|
||||
vox_shuttle_location = "start"
|
||||
else if(href_list["arrivals"])
|
||||
vox_move_to(/area/vox_station/northwest_solars)
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/vox_station/bullet_act(var/obj/item/projectile/Proj)
|
||||
visible_message("[Proj] ricochets off [src]!")
|
||||
@@ -93,8 +93,7 @@
|
||||
if(specialfunctions & IDSCAN)
|
||||
D.aiDisabledIdScanner = 1
|
||||
if(specialfunctions & BOLTS)
|
||||
D.locked = 1
|
||||
D.update_icon()
|
||||
D.lock()
|
||||
if(specialfunctions & SHOCK)
|
||||
D.secondsElectrified = -1
|
||||
if(specialfunctions & SAFE)
|
||||
@@ -104,8 +103,7 @@
|
||||
D.aiDisabledIdScanner = 0
|
||||
if(specialfunctions & BOLTS)
|
||||
if(!D.isWireCut(4) && D.arePowerSystemsOn())
|
||||
D.locked = 0
|
||||
D.update_icon()
|
||||
D.unlock()
|
||||
if(specialfunctions & SHOCK)
|
||||
D.secondsElectrified = 0
|
||||
if(specialfunctions & SAFE)
|
||||
|
||||
@@ -325,6 +325,165 @@ About the new airlock wires panel:
|
||||
..(user)
|
||||
|
||||
|
||||
/*
|
||||
/obj/machinery/door/airlock/proc/pulse(var/wireColor)
|
||||
//var/wireFlag = airlockWireColorToFlag[wireColor] //not used in this function
|
||||
var/wireIndex = airlockWireColorToIndex[wireColor]
|
||||
switch(wireIndex)
|
||||
if(AIRLOCK_WIRE_IDSCAN)
|
||||
//Sending a pulse through this flashes the red light on the door (if the door has power).
|
||||
if((src.arePowerSystemsOn()) && (!(stat & NOPOWER)))
|
||||
do_animate("deny")
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
|
||||
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
|
||||
src.loseMainPower()
|
||||
if(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
//one wire for door bolts. Sending a pulse through this drops door bolts if they're not down (whether power's on or not),
|
||||
//raises them if they are down (only if power's on)
|
||||
if(!src.locked)
|
||||
src.lock()
|
||||
else
|
||||
src.unlock()
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
|
||||
src.loseBackupPower()
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
if(src.aiControlDisabled == 0)
|
||||
src.aiControlDisabled = 1
|
||||
else if(src.aiControlDisabled == -1)
|
||||
src.aiControlDisabled = 2
|
||||
src.updateDialog()
|
||||
spawn(10)
|
||||
if(src.aiControlDisabled == 1)
|
||||
src.aiControlDisabled = 0
|
||||
else if(src.aiControlDisabled == 2)
|
||||
src.aiControlDisabled = -1
|
||||
src.updateDialog()
|
||||
if(AIRLOCK_WIRE_ELECTRIFY)
|
||||
//one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds.
|
||||
if(src.secondsElectrified==0)
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
src.secondsElectrified = 30
|
||||
spawn(10)
|
||||
//TODO: Move this into process() and make pulsing reset secondsElectrified to 30
|
||||
while (src.secondsElectrified>0)
|
||||
src.secondsElectrified-=1
|
||||
if(src.secondsElectrified<0)
|
||||
src.secondsElectrified = 0
|
||||
// src.updateUsrDialog() //Commented this line out to keep the airlock from clusterfucking you with electricity. --NeoFite
|
||||
sleep(10)
|
||||
if(AIRLOCK_WIRE_OPEN_DOOR)
|
||||
//tries to open the door without ID
|
||||
//will succeed only if the ID wire is cut or the door requires no access
|
||||
if(!src.requiresID() || src.check_access(null))
|
||||
if(density) open()
|
||||
else close()
|
||||
if(AIRLOCK_WIRE_SAFETY)
|
||||
safe = !safe
|
||||
if(!src.density)
|
||||
close()
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_SPEED)
|
||||
normalspeed = !normalspeed
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_LIGHT)
|
||||
lights = !lights
|
||||
src.updateUsrDialog()
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/cut(var/wireColor)
|
||||
var/wireFlag = airlockWireColorToFlag[wireColor]
|
||||
var/wireIndex = airlockWireColorToIndex[wireColor]
|
||||
wires &= ~wireFlag
|
||||
switch(wireIndex)
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
|
||||
//Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be crowbarred open, but bolts-raising will not work. Cutting these wires may electocute the user.
|
||||
src.loseMainPower()
|
||||
src.shock(usr, 50)
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
//Cutting this wire also drops the door bolts, and mending it does not raise them. (This is what happens now, except there are a lot more wires going to door bolts at present)
|
||||
src.lock()
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
//Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user.
|
||||
src.loseBackupPower()
|
||||
src.shock(usr, 50)
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
//one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
|
||||
//aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
|
||||
if(src.aiControlDisabled == 0)
|
||||
src.aiControlDisabled = 1
|
||||
else if(src.aiControlDisabled == -1)
|
||||
src.aiControlDisabled = 2
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_ELECTRIFY)
|
||||
//Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted.
|
||||
if(src.secondsElectrified != -1)
|
||||
shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Electrified the [name] at [x] [y] [z]</font>")
|
||||
src.secondsElectrified = -1
|
||||
if (AIRLOCK_WIRE_SAFETY)
|
||||
safe = 0
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_SPEED)
|
||||
autoclose = 0
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_LIGHT)
|
||||
lights = 0
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/machinery/door/airlock/proc/mend(var/wireColor)
|
||||
var/wireFlag = airlockWireColorToFlag[wireColor]
|
||||
var/wireIndex = airlockWireColorToIndex[wireColor] //not used in this function
|
||||
wires |= wireFlag
|
||||
switch(wireIndex)
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
|
||||
if((!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)))
|
||||
src.regainMainPower()
|
||||
src.shock(usr, 50)
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
if((!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)))
|
||||
src.regainBackupPower()
|
||||
src.shock(usr, 50)
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
//one wire for AI control. Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
|
||||
//aiControlDisabled: If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
|
||||
if(src.aiControlDisabled == 1)
|
||||
src.aiControlDisabled = 0
|
||||
else if(src.aiControlDisabled == 2)
|
||||
src.aiControlDisabled = -1
|
||||
src.updateUsrDialog()
|
||||
if(AIRLOCK_WIRE_ELECTRIFY)
|
||||
if(src.secondsElectrified == -1)
|
||||
src.secondsElectrified = 0
|
||||
|
||||
if (AIRLOCK_WIRE_SAFETY)
|
||||
safe = 1
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_SPEED)
|
||||
autoclose = 1
|
||||
if(!src.density)
|
||||
close()
|
||||
src.updateUsrDialog()
|
||||
|
||||
if(AIRLOCK_WIRE_LIGHT)
|
||||
lights = 1
|
||||
src.updateUsrDialog()
|
||||
|
||||
*/
|
||||
|
||||
/obj/machinery/door/airlock/proc/isElectrified()
|
||||
if(src.secondsElectrified != 0)
|
||||
return 1
|
||||
@@ -507,7 +666,7 @@ About the new airlock wires panel:
|
||||
t1 += text("Backup Power Output wire is cut.<br>\n")
|
||||
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
t1 += text("Door bolt drop wire is cut.<br>\n")
|
||||
t1 += text("Door bolt control wire is cut.<br>\n")
|
||||
else if(!src.locked)
|
||||
t1 += text("Door bolts are up. <A href='?src=\ref[];aiDisable=4'>Drop them?</a><br>\n", src)
|
||||
else
|
||||
@@ -816,15 +975,11 @@ About the new airlock wires panel:
|
||||
if(4)
|
||||
//raise door bolts
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
usr << text("The door bolt drop wire is cut - you can't raise the door bolts.<br>\n")
|
||||
usr << text("The door bolt control wire is cut - you can't raise the door bolts.<br>\n")
|
||||
else if(!src.locked)
|
||||
usr << text("The door bolts are already up.<br>\n")
|
||||
else
|
||||
if(src.arePowerSystemsOn())
|
||||
src.locked = 0
|
||||
update_icon()
|
||||
else
|
||||
usr << text("Cannot raise door bolts due to power failure.<br>\n")
|
||||
src.unlock()
|
||||
|
||||
if(5)
|
||||
//electrify door for 30 seconds
|
||||
@@ -1089,6 +1244,23 @@ About the new airlock wires panel:
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/proc/lock(var/forced=0)
|
||||
if (src.locked) return
|
||||
|
||||
src.locked = 1
|
||||
for(var/mob/M in range(1,src))
|
||||
M.show_message("You hear a click from the bottom of the door.", 2)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/door/airlock/proc/unlock(var/forced=0)
|
||||
if (!src.locked) return
|
||||
|
||||
if(forced || src.arePowerSystemsOn()) //only can raise bolts if power's on
|
||||
src.locked = 0
|
||||
for(var/mob/M in range(1,src))
|
||||
M.show_message("You hear a click from the bottom of the door.", 2)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/door/airlock/New()
|
||||
..()
|
||||
wires = new(src)
|
||||
@@ -1104,7 +1276,7 @@ About the new airlock wires panel:
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/proc/prison_open()
|
||||
src.locked = 0
|
||||
src.unlock()
|
||||
src.open()
|
||||
src.locked = 1
|
||||
return
|
||||
@@ -1165,4 +1337,4 @@ About the new airlock wires panel:
|
||||
src.update_icon()
|
||||
return
|
||||
else
|
||||
return
|
||||
return
|
||||
+258
-241
@@ -1,242 +1,259 @@
|
||||
#define AIRLOCK_CONTROL_RANGE 5
|
||||
|
||||
// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access)
|
||||
obj/machinery/door/airlock
|
||||
var/id_tag
|
||||
var/frequency
|
||||
var/shockedby = list()
|
||||
var/datum/radio_frequency/radio_connection
|
||||
explosion_resistance = 15
|
||||
|
||||
|
||||
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
open(1)
|
||||
|
||||
if("close")
|
||||
close(1)
|
||||
|
||||
if("unlock")
|
||||
locked = 0
|
||||
update_icon()
|
||||
|
||||
if("lock")
|
||||
locked = 1
|
||||
update_icon()
|
||||
|
||||
if("secure_open")
|
||||
locked = 0
|
||||
update_icon()
|
||||
|
||||
sleep(2)
|
||||
open(1)
|
||||
|
||||
locked = 1
|
||||
update_icon()
|
||||
|
||||
if("secure_close")
|
||||
locked = 0
|
||||
close(1)
|
||||
|
||||
locked = 1
|
||||
sleep(2)
|
||||
update_icon()
|
||||
|
||||
send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/door/airlock/open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/Bumped(atom/AM)
|
||||
..(AM)
|
||||
if(istype(AM, /obj/mecha))
|
||||
var/obj/mecha/mecha = AM
|
||||
if(density && radio_connection && mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
signal.data["bumped_with_access"] = 1
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
return
|
||||
|
||||
obj/machinery/door/airlock/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/door/airlock/initialize()
|
||||
if(frequency)
|
||||
set_frequency(frequency)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
|
||||
|
||||
obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "airlock sensor"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/id_tag
|
||||
var/master_tag
|
||||
var/frequency = 1449
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = 1
|
||||
var/alert = 0
|
||||
var/previousPressure
|
||||
|
||||
obj/machinery/airlock_sensor/update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = "cycle"
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
|
||||
if(abs(pressure - previousPressure) > 0.001 || previousPressure == null)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
signal.data["pressure"] = num2text(pressure)
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
previousPressure = pressure
|
||||
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
update_icon()
|
||||
|
||||
obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
obj/machinery/airlock_sensor/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
obj/machinery/airlock_sensor/New()
|
||||
..()
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
|
||||
|
||||
obj/machinery/access_button
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_button_standby"
|
||||
name = "access button"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/master_tag
|
||||
var/frequency = 1449
|
||||
var/command = "cycle"
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = 1
|
||||
|
||||
|
||||
obj/machinery/access_button/update_icon()
|
||||
if(on)
|
||||
icon_state = "access_button_standby"
|
||||
else
|
||||
icon_state = "access_button_off"
|
||||
|
||||
|
||||
obj/machinery/access_button/attack_hand(mob/user)
|
||||
add_fingerprint(usr)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
|
||||
else if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = command
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("access_button_cycle", src)
|
||||
|
||||
|
||||
obj/machinery/access_button/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/access_button/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
obj/machinery/access_button/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
#define AIRLOCK_CONTROL_RANGE 5
|
||||
|
||||
// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access)
|
||||
obj/machinery/door/airlock
|
||||
var/id_tag
|
||||
var/frequency
|
||||
var/shockedby = list()
|
||||
var/datum/radio_frequency/radio_connection
|
||||
explosion_resistance = 15
|
||||
|
||||
obj/machinery/door/airlock/proc/can_radio()
|
||||
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_AI_CONTROL) )
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if (!can_radio()) return
|
||||
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
open()
|
||||
|
||||
if("close")
|
||||
close()
|
||||
|
||||
if("unlock")
|
||||
unlock()
|
||||
|
||||
if("lock")
|
||||
lock()
|
||||
|
||||
if("secure_open")
|
||||
unlock()
|
||||
|
||||
sleep(2)
|
||||
open()
|
||||
|
||||
lock()
|
||||
|
||||
if("secure_close")
|
||||
unlock()
|
||||
close()
|
||||
|
||||
lock()
|
||||
sleep(2)
|
||||
|
||||
send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/proc/send_status()
|
||||
if (!can_radio()) return
|
||||
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/door/airlock/open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/Bumped(atom/AM)
|
||||
..(AM)
|
||||
if(istype(AM, /obj/mecha))
|
||||
var/obj/mecha/mecha = AM
|
||||
if(density && radio_connection && mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access)))
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
signal.data["bumped_with_access"] = 1
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
return
|
||||
|
||||
obj/machinery/door/airlock/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/door/airlock/initialize()
|
||||
if(frequency)
|
||||
set_frequency(frequency)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
|
||||
|
||||
obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "airlock sensor"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/id_tag
|
||||
var/master_tag
|
||||
var/frequency = 1379
|
||||
var/command = "cycle"
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = 1
|
||||
var/alert = 0
|
||||
var/previousPressure
|
||||
|
||||
obj/machinery/airlock_sensor/update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = command
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
|
||||
if(abs(pressure - previousPressure) > 0.001 || previousPressure == null)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
signal.data["pressure"] = num2text(pressure)
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
previousPressure = pressure
|
||||
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
update_icon()
|
||||
|
||||
obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
obj/machinery/airlock_sensor/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
obj/machinery/airlock_sensor/New()
|
||||
..()
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
obj/machinery/airlock_sensor/airlock_interior
|
||||
command = "cycle_interior"
|
||||
|
||||
obj/machinery/airlock_sensor/airlock_exterior
|
||||
command = "cycle_exterior"
|
||||
|
||||
obj/machinery/access_button
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_button_standby"
|
||||
name = "access button"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
|
||||
var/master_tag
|
||||
var/frequency = 1449
|
||||
var/command = "cycle"
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
var/on = 1
|
||||
|
||||
|
||||
obj/machinery/access_button/update_icon()
|
||||
if(on)
|
||||
icon_state = "access_button_standby"
|
||||
else
|
||||
icon_state = "access_button_off"
|
||||
|
||||
|
||||
obj/machinery/access_button/attack_hand(mob/user)
|
||||
add_fingerprint(usr)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
|
||||
else if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = command
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("access_button_cycle", src)
|
||||
|
||||
|
||||
obj/machinery/access_button/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/access_button/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
obj/machinery/access_button/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
obj/machinery/access_button/airlock_interior
|
||||
frequency = 1379
|
||||
command = "cycle_interior"
|
||||
|
||||
obj/machinery/access_button/airlock_exterior
|
||||
frequency = 1379
|
||||
command = "cycle_exterior"
|
||||
@@ -1,214 +0,0 @@
|
||||
//States for airlock_control
|
||||
#define ACCESS_STATE_INTERNAL -1
|
||||
#define ACCESS_STATE_LOCKED 0
|
||||
#define ACCESS_STATE_EXTERNAL 1
|
||||
|
||||
datum/computer/file/embedded_program/access_controller
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
var/interior_door_tag
|
||||
|
||||
state = ACCESS_STATE_LOCKED
|
||||
var/target_state = ACCESS_STATE_LOCKED
|
||||
|
||||
receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
if(!receive_tag) return
|
||||
|
||||
if(receive_tag==exterior_door_tag)
|
||||
if(signal.data["door_status"] == "closed")
|
||||
if(signal.data["lock_status"] == "locked")
|
||||
memory["exterior_status"] = "locked"
|
||||
else
|
||||
memory["exterior_status"] = "closed"
|
||||
else
|
||||
memory["exterior_status"] = "open"
|
||||
|
||||
else if(receive_tag==interior_door_tag)
|
||||
if(signal.data["door_status"] == "closed")
|
||||
if(signal.data["lock_status"] == "locked")
|
||||
memory["interior_status"] = "locked"
|
||||
else
|
||||
memory["interior_status"] = "closed"
|
||||
else
|
||||
memory["interior_status"] = "open"
|
||||
|
||||
else if(receive_tag==id_tag)
|
||||
switch(signal.data["command"])
|
||||
if("cycle_interior")
|
||||
target_state = ACCESS_STATE_INTERNAL
|
||||
if("cycle_exterior")
|
||||
target_state = ACCESS_STATE_EXTERNAL
|
||||
if("cycle")
|
||||
if(state < ACCESS_STATE_LOCKED)
|
||||
target_state = ACCESS_STATE_EXTERNAL
|
||||
else
|
||||
target_state = ACCESS_STATE_INTERNAL
|
||||
|
||||
receive_user_command(command)
|
||||
switch(command)
|
||||
if("cycle_closed")
|
||||
target_state = ACCESS_STATE_LOCKED
|
||||
if("cycle_exterior")
|
||||
target_state = ACCESS_STATE_EXTERNAL
|
||||
if("cycle_interior")
|
||||
target_state = ACCESS_STATE_INTERNAL
|
||||
|
||||
process()
|
||||
var/process_again = 1
|
||||
while(process_again)
|
||||
process_again = 0
|
||||
switch(state)
|
||||
if(ACCESS_STATE_INTERNAL) // state -1
|
||||
if(target_state > state)
|
||||
if(memory["interior_status"] == "locked")
|
||||
state = ACCESS_STATE_LOCKED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
if(memory["interior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
|
||||
if(ACCESS_STATE_LOCKED)
|
||||
if(target_state < state)
|
||||
if(memory["exterior_status"] != "locked")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
if(memory["exterior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else
|
||||
if(memory["interior_status"] == "closed" || memory["interior_status"] == "open")
|
||||
state = ACCESS_STATE_INTERNAL
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else if(target_state > state)
|
||||
if(memory["interior_status"] != "locked")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
if(memory["interior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else
|
||||
if(memory["exterior_status"] == "closed" || memory["exterior_status"] == "open")
|
||||
state = ACCESS_STATE_EXTERNAL
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else
|
||||
if(memory["interior_status"] != "locked")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
if(memory["interior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else if(memory["exterior_status"] != "locked")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
if(memory["exterior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
|
||||
if(ACCESS_STATE_EXTERNAL) //state 1
|
||||
if(target_state < state)
|
||||
if(memory["exterior_status"] == "locked")
|
||||
state = ACCESS_STATE_LOCKED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
if(memory["exterior_status"] == "closed")
|
||||
signal.data["command"] = "lock"
|
||||
else
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
obj/machinery/embedded_controller/radio/access_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_control_standby"
|
||||
|
||||
name = "Access Console"
|
||||
density = 0
|
||||
power_channel = ENVIRON
|
||||
unacidable = 1
|
||||
|
||||
frequency = 1449
|
||||
|
||||
// Setup parameters only
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
var/interior_door_tag
|
||||
|
||||
initialize()
|
||||
..()
|
||||
|
||||
var/datum/computer/file/embedded_program/access_controller/new_prog = new
|
||||
|
||||
new_prog.id_tag = id_tag
|
||||
new_prog.exterior_door_tag = exterior_door_tag
|
||||
new_prog.interior_door_tag = interior_door_tag
|
||||
|
||||
new_prog.master = src
|
||||
program = new_prog
|
||||
|
||||
update_icon()
|
||||
if(on && program)
|
||||
if(program.memory["processing"])
|
||||
icon_state = "access_control_process"
|
||||
else
|
||||
icon_state = "access_control_standby"
|
||||
else
|
||||
icon_state = "access_control_off"
|
||||
|
||||
|
||||
return_text()
|
||||
var/state_options = null
|
||||
|
||||
var/state = 0
|
||||
var/exterior_status = "----"
|
||||
var/interior_status = "----"
|
||||
if(program)
|
||||
state = program.state
|
||||
exterior_status = program.memory["exterior_status"]
|
||||
interior_status = program.memory["interior_status"]
|
||||
|
||||
switch(state)
|
||||
if(ACCESS_STATE_INTERNAL)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_closed'>Lock Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_exterior'>Cycle to Exterior Airlock</A><BR>"}
|
||||
if(ACCESS_STATE_LOCKED)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_interior'>Unlock Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_exterior'>Unlock Exterior Airlock</A><BR>"}
|
||||
if(ACCESS_STATE_EXTERNAL)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_interior'>Cycle to Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_closed'>Lock Exterior Airlock</A><BR>"}
|
||||
|
||||
var/output = {"<B>Access Control Console</B><HR>
|
||||
[state_options]<HR>
|
||||
<B>Exterior Door: </B> [exterior_status]<BR>
|
||||
<B>Interior Door: </B> [interior_status]<BR>"}
|
||||
|
||||
return output
|
||||
@@ -1,352 +0,0 @@
|
||||
//States for airlock_control
|
||||
#define AIRLOCK_STATE_INOPEN -2
|
||||
#define AIRLOCK_STATE_PRESSURIZE -1
|
||||
#define AIRLOCK_STATE_CLOSED 0
|
||||
#define AIRLOCK_STATE_DEPRESSURIZE 1
|
||||
#define AIRLOCK_STATE_OUTOPEN 2
|
||||
#define AIRLOCK_STATE_BOTHOPEN 3
|
||||
|
||||
datum/computer/file/embedded_program/airlock_controller
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
var/interior_door_tag
|
||||
var/airpump_tag
|
||||
var/sensor_tag
|
||||
var/sensor_tag_int
|
||||
var/sanitize_external
|
||||
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
var/target_state = AIRLOCK_STATE_CLOSED
|
||||
var/sensor_pressure = null
|
||||
var/int_sensor_pressure = ONE_ATMOSPHERE
|
||||
|
||||
receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
if(!receive_tag) return
|
||||
|
||||
if(receive_tag==sensor_tag)
|
||||
if(signal.data["pressure"])
|
||||
sensor_pressure = text2num(signal.data["pressure"])
|
||||
else if(receive_tag==sensor_tag_int)
|
||||
if(signal.data["pressure"])
|
||||
int_sensor_pressure = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==exterior_door_tag)
|
||||
memory["exterior_status"] = signal.data["door_status"]
|
||||
if(signal.data["bumped_with_access"])
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
|
||||
else if(receive_tag==interior_door_tag)
|
||||
memory["interior_status"] = signal.data["door_status"]
|
||||
if(signal.data["bumped_with_access"])
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
|
||||
else if(receive_tag==airpump_tag)
|
||||
if(signal.data["power"])
|
||||
memory["pump_status"] = signal.data["direction"]
|
||||
else
|
||||
memory["pump_status"] = "off"
|
||||
|
||||
else if(receive_tag==id_tag)
|
||||
switch(signal.data["command"])
|
||||
if("cycle_exterior")
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
if("cycle_interior")
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
if("cycle")
|
||||
if(state < AIRLOCK_STATE_CLOSED)
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
else
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
if("cycle_interior")
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
if("cycle_exterior")
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
|
||||
receive_user_command(command)
|
||||
switch(command)
|
||||
if("cycle_closed")
|
||||
target_state = AIRLOCK_STATE_CLOSED
|
||||
if("cycle_exterior")
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
if("cycle_interior")
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
if("abort")
|
||||
target_state = AIRLOCK_STATE_CLOSED
|
||||
if("force_both")
|
||||
target_state = AIRLOCK_STATE_BOTHOPEN
|
||||
state = AIRLOCK_STATE_BOTHOPEN
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
if("force_exterior")
|
||||
target_state = AIRLOCK_STATE_OUTOPEN
|
||||
state = AIRLOCK_STATE_OUTOPEN
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
if("force_interior")
|
||||
target_state = AIRLOCK_STATE_INOPEN
|
||||
state = AIRLOCK_STATE_INOPEN
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
if("close")
|
||||
target_state = AIRLOCK_STATE_CLOSED
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
|
||||
process()
|
||||
var/process_again = 1
|
||||
while(process_again)
|
||||
process_again = 0
|
||||
switch(state)
|
||||
if(AIRLOCK_STATE_INOPEN) // state -2
|
||||
if(target_state > state)
|
||||
if(memory["interior_status"] == "closed")
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
if(AIRLOCK_STATE_PRESSURIZE)
|
||||
if(target_state < state)
|
||||
if(sensor_pressure >= int_sensor_pressure*0.95)
|
||||
if(memory["interior_status"] == "open")
|
||||
state = AIRLOCK_STATE_INOPEN
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
if(memory["pump_status"] == "siphon")
|
||||
signal.data["stabalize"] = 1
|
||||
else if(memory["pump_status"] != "release")
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
else if(target_state > state)
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
|
||||
if(AIRLOCK_STATE_CLOSED)
|
||||
if(target_state > state)
|
||||
if(memory["interior_status"] == "closed")
|
||||
state = AIRLOCK_STATE_DEPRESSURIZE
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else if(target_state < state)
|
||||
if(memory["exterior_status"] == "closed")
|
||||
state = AIRLOCK_STATE_PRESSURIZE
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
if(AIRLOCK_STATE_DEPRESSURIZE)
|
||||
var/target_pressure = ONE_ATMOSPHERE*0.04
|
||||
if(sanitize_external)
|
||||
target_pressure = ONE_ATMOSPHERE*0.01
|
||||
|
||||
if(sensor_pressure <= target_pressure)
|
||||
if(target_state > state)
|
||||
if(memory["exterior_status"] == "open")
|
||||
state = AIRLOCK_STATE_OUTOPEN
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else if(target_state < state)
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else if((target_state < state) && !sanitize_external)
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
if(memory["pump_status"] == "release")
|
||||
signal.data["purge"] = 1
|
||||
else if(memory["pump_status"] != "siphon")
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
|
||||
if(AIRLOCK_STATE_OUTOPEN) //state 2
|
||||
if(target_state < state)
|
||||
if(memory["exterior_status"] == "closed")
|
||||
if(sanitize_external)
|
||||
state = AIRLOCK_STATE_DEPRESSURIZE
|
||||
process_again = 1
|
||||
else
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
memory["sensor_pressure"] = sensor_pressure
|
||||
memory["int_sensor_pressure"] = int_sensor_pressure
|
||||
memory["processing"] = state != target_state
|
||||
//sensor_pressure = null //not sure if we can comment this out. Uncomment in case of problems -rastaf0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
obj/machinery/embedded_controller/radio/airlock_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_control_standby"
|
||||
|
||||
name = "Airlock Console"
|
||||
density = 0
|
||||
unacidable = 1
|
||||
|
||||
frequency = 1449
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
var/interior_door_tag
|
||||
var/airpump_tag
|
||||
var/sensor_tag
|
||||
var/sensor_tag_int
|
||||
var/sanitize_external
|
||||
|
||||
initialize()
|
||||
..()
|
||||
|
||||
var/datum/computer/file/embedded_program/airlock_controller/new_prog = new
|
||||
|
||||
new_prog.id_tag = id_tag
|
||||
new_prog.exterior_door_tag = exterior_door_tag
|
||||
new_prog.interior_door_tag = interior_door_tag
|
||||
new_prog.airpump_tag = airpump_tag
|
||||
new_prog.sensor_tag = sensor_tag
|
||||
new_prog.sensor_tag_int = sensor_tag_int
|
||||
new_prog.sanitize_external = sanitize_external
|
||||
|
||||
new_prog.master = src
|
||||
program = new_prog
|
||||
|
||||
update_icon()
|
||||
if(on && program)
|
||||
if(program.memory["processing"])
|
||||
icon_state = "airlock_control_process"
|
||||
else
|
||||
icon_state = "airlock_control_standby"
|
||||
else
|
||||
icon_state = "airlock_control_off"
|
||||
|
||||
|
||||
return_text()
|
||||
var/state_options = null
|
||||
|
||||
var/state = 0
|
||||
var/sensor_pressure = "----"
|
||||
var/int_sensor_pressure = "----"
|
||||
var/exterior_status = "----"
|
||||
var/interior_status = "----"
|
||||
var/pump_status = "----"
|
||||
if(program)
|
||||
state = program.state
|
||||
sensor_pressure = program.memory["sensor_pressure"]
|
||||
int_sensor_pressure = program.memory["int_sensor_pressure"]
|
||||
exterior_status = program.memory["exterior_status"]
|
||||
interior_status = program.memory["interior_status"]
|
||||
pump_status = program.memory["pump_status"]
|
||||
|
||||
switch(state)
|
||||
if(AIRLOCK_STATE_INOPEN)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_closed'>Close Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_exterior'>Cycle to Exterior Airlock</A><BR>"}
|
||||
if(AIRLOCK_STATE_PRESSURIZE)
|
||||
state_options = "<A href='?src=\ref[src];command=abort'>Abort Cycling</A><BR>"
|
||||
if(AIRLOCK_STATE_CLOSED)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_interior'>Open Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_exterior'>Open Exterior Airlock</A><BR>"}
|
||||
if(AIRLOCK_STATE_DEPRESSURIZE)
|
||||
state_options = "<A href='?src=\ref[src];command=abort'>Abort Cycling</A><BR>"
|
||||
if(AIRLOCK_STATE_OUTOPEN)
|
||||
state_options = {"<A href='?src=\ref[src];command=cycle_interior'>Cycle to Interior Airlock</A><BR>
|
||||
<A href='?src=\ref[src];command=cycle_closed'>Close Exterior Airlock</A><BR>"}
|
||||
if(AIRLOCK_STATE_BOTHOPEN)
|
||||
state_options = "<A href='?src=\ref[src];command=close'>Close Airlocks</A><BR>"
|
||||
|
||||
var/output = {"<B>Airlock Control Console</B><HR>
|
||||
[state_options]<HR>
|
||||
<B>Chamber Pressure:</B> [sensor_pressure] kPa<BR>
|
||||
<B>Internal Pressure:</B> [int_sensor_pressure] kPa<BR>
|
||||
<B>Exterior Door: </B> [exterior_status]<BR>
|
||||
<B>Interior Door: </B> [interior_status]<BR>
|
||||
<B>Control Pump: </B> [pump_status]<BR>"}
|
||||
|
||||
if(program && program.state == AIRLOCK_STATE_CLOSED)
|
||||
output += {"<A href='?src=\ref[src];command=force_both'>Force Both Airlocks</A><br>
|
||||
<A href='?src=\ref[src];command=force_interior'>Force Inner Airlock</A><br>
|
||||
<A href='?src=\ref[src];command=force_exterior'>Force Outer Airlock</A>"}
|
||||
|
||||
return output
|
||||
@@ -0,0 +1,186 @@
|
||||
//base type for controllers of two-door systems
|
||||
/obj/machinery/embedded_controller/radio/airlock
|
||||
// Setup parameters only
|
||||
var/tag_exterior_door
|
||||
var/tag_interior_door
|
||||
var/tag_airpump
|
||||
var/tag_chamber_sensor
|
||||
var/tag_exterior_sensor
|
||||
var/tag_interior_sensor
|
||||
var/tag_secure = 0
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/initialize()
|
||||
..()
|
||||
program = new/datum/computer/file/embedded_program/airlock(src)
|
||||
|
||||
//Advanced airlock controller for when you want a more versatile airlock controller - useful for turning simple access control rooms into airlocks
|
||||
/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller
|
||||
name = "Advanced Airlock Controller"
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
|
||||
data = list(
|
||||
"chamber_pressure" = round(program.memory["chamber_sensor_pressure"]),
|
||||
"external_pressure" = round(program.memory["external_sensor_pressure"]),
|
||||
"internal_pressure" = round(program.memory["internal_sensor_pressure"]),
|
||||
"processing" = program.memory["processing"],
|
||||
"purge" = program.memory["purge"],
|
||||
"secure" = program.memory["secure"]
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290)
|
||||
|
||||
ui.set_initial_data(data)
|
||||
|
||||
ui.open()
|
||||
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/clean = 0
|
||||
switch(href_list["command"]) //anti-HTML-hacking checks
|
||||
if("cycle_ext")
|
||||
clean = 1
|
||||
if("cycle_int")
|
||||
clean = 1
|
||||
if("force_ext")
|
||||
clean = 1
|
||||
if("force_int")
|
||||
clean = 1
|
||||
if("abort")
|
||||
clean = 1
|
||||
if("purge")
|
||||
clean = 1
|
||||
if("secure")
|
||||
clean = 1
|
||||
|
||||
if(clean)
|
||||
program.receive_user_command(href_list["command"])
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
//Airlock controller for airlock control - most airlocks on the station use this
|
||||
/obj/machinery/embedded_controller/radio/airlock/airlock_controller
|
||||
name = "Airlock Controller"
|
||||
tag_secure = 1
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
|
||||
data = list(
|
||||
"chamber_pressure" = round(program.memory["chamber_sensor_pressure"]),
|
||||
"exterior_status" = program.memory["exterior_status"],
|
||||
"interior_status" = program.memory["interior_status"],
|
||||
"processing" = program.memory["processing"],
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290)
|
||||
|
||||
ui.set_initial_data(data)
|
||||
|
||||
ui.open()
|
||||
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/airlock_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/clean = 0
|
||||
switch(href_list["command"]) //anti-HTML-hacking checks
|
||||
if("cycle_ext")
|
||||
clean = 1
|
||||
if("cycle_int")
|
||||
clean = 1
|
||||
if("force_ext")
|
||||
clean = 1
|
||||
if("force_int")
|
||||
clean = 1
|
||||
if("abort")
|
||||
clean = 1
|
||||
|
||||
if(clean)
|
||||
program.receive_user_command(href_list["command"])
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
//Access controller for door control - used in virology and the like
|
||||
/obj/machinery/embedded_controller/radio/airlock/access_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_control_standby"
|
||||
|
||||
name = "Access Controller"
|
||||
tag_secure = 1
|
||||
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/access_controller/update_icon()
|
||||
if(on && program)
|
||||
if(program.memory["processing"])
|
||||
icon_state = "access_control_process"
|
||||
else
|
||||
icon_state = "access_control_standby"
|
||||
else
|
||||
icon_state = "access_control_off"
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
|
||||
data = list(
|
||||
"exterior_status" = program.memory["exterior_status"],
|
||||
"interior_status" = program.memory["interior_status"],
|
||||
"processing" = program.memory["processing"]
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220)
|
||||
|
||||
ui.set_initial_data(data)
|
||||
|
||||
ui.open()
|
||||
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/access_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/clean = 0
|
||||
switch(href_list["command"]) //anti-HTML-hacking checks
|
||||
if("cycle_ext_door")
|
||||
clean = 1
|
||||
if("cycle_int_door")
|
||||
clean = 1
|
||||
if("force_ext")
|
||||
if(program.memory["interior_status"]["state"] == "closed")
|
||||
clean = 1
|
||||
if("force_int")
|
||||
if(program.memory["exterior_status"]["state"] == "closed")
|
||||
clean = 1
|
||||
|
||||
if(clean)
|
||||
program.receive_user_command(href_list["command"])
|
||||
|
||||
return 1
|
||||
@@ -0,0 +1,174 @@
|
||||
//a docking port based on an airlock
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port
|
||||
name = "docking port controller"
|
||||
var/datum/computer/file/embedded_program/airlock/docking/airlock_program
|
||||
var/datum/computer/file/embedded_program/docking/airlock/docking_program
|
||||
tag_secure = 1
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/initialize()
|
||||
..()
|
||||
airlock_program = new/datum/computer/file/embedded_program/airlock/docking(src)
|
||||
docking_program = new/datum/computer/file/embedded_program/docking/airlock(src, airlock_program)
|
||||
program = docking_program
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
|
||||
data = list(
|
||||
"chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]),
|
||||
"exterior_status" = airlock_program.memory["exterior_status"],
|
||||
"interior_status" = airlock_program.memory["interior_status"],
|
||||
"processing" = airlock_program.memory["processing"],
|
||||
"docking_status" = docking_program.get_docking_status(),
|
||||
"airlock_disabled" = !(docking_program.undocked() || docking_program.override_enabled),
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/clean = 0
|
||||
switch(href_list["command"]) //anti-HTML-hacking checks
|
||||
if("cycle_ext")
|
||||
clean = 1
|
||||
if("cycle_int")
|
||||
clean = 1
|
||||
if("force_ext")
|
||||
clean = 1
|
||||
if("force_int")
|
||||
clean = 1
|
||||
if("abort")
|
||||
clean = 1
|
||||
if("toggle_override")
|
||||
clean = 1
|
||||
|
||||
if(clean)
|
||||
program.receive_user_command(href_list["command"])
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
//A docking controller for an airlock based docking port
|
||||
/datum/computer/file/embedded_program/docking/airlock
|
||||
var/datum/computer/file/embedded_program/airlock/docking/airlock_program
|
||||
|
||||
/datum/computer/file/embedded_program/docking/airlock/New(var/obj/machinery/embedded_controller/M, var/datum/computer/file/embedded_program/airlock/docking/A)
|
||||
..(M)
|
||||
airlock_program = A
|
||||
airlock_program.master_prog = src
|
||||
|
||||
/datum/computer/file/embedded_program/docking/airlock/receive_user_command(command)
|
||||
if (command == "toggle_override")
|
||||
if (override_enabled)
|
||||
disable_override()
|
||||
else
|
||||
enable_override()
|
||||
return
|
||||
|
||||
..(command)
|
||||
airlock_program.receive_user_command(command) //pass along to subprograms
|
||||
|
||||
/datum/computer/file/embedded_program/docking/airlock/process()
|
||||
airlock_program.process()
|
||||
..()
|
||||
|
||||
/datum/computer/file/embedded_program/docking/airlock/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
airlock_program.receive_signal(signal, receive_method, receive_param) //pass along to subprograms
|
||||
..(signal, receive_method, receive_param)
|
||||
|
||||
//tell the docking port to start getting ready for docking - e.g. pressurize
|
||||
/datum/computer/file/embedded_program/docking/airlock/prepare_for_docking()
|
||||
airlock_program.begin_cycle_in()
|
||||
|
||||
//are we ready for docking?
|
||||
/datum/computer/file/embedded_program/docking/airlock/ready_for_docking()
|
||||
return airlock_program.done_cycling()
|
||||
|
||||
//we are docked, open the doors or whatever.
|
||||
/datum/computer/file/embedded_program/docking/airlock/finish_docking()
|
||||
airlock_program.open_doors()
|
||||
|
||||
//tell the docking port to start getting ready for undocking - e.g. close those doors.
|
||||
/datum/computer/file/embedded_program/docking/airlock/prepare_for_undocking()
|
||||
airlock_program.stop_cycling()
|
||||
airlock_program.close_doors()
|
||||
|
||||
//are we ready for undocking?
|
||||
/datum/computer/file/embedded_program/docking/airlock/ready_for_undocking()
|
||||
return airlock_program.check_doors_secured()
|
||||
|
||||
/datum/computer/file/embedded_program/docking/airlock/reset()
|
||||
airlock_program.stop_cycling()
|
||||
airlock_program.close_doors()
|
||||
..()
|
||||
|
||||
//An airlock controller to be used by the airlock-based docking port controller.
|
||||
//Same as a regular airlock controller but allows disabling of the regular airlock functions when docking
|
||||
/datum/computer/file/embedded_program/airlock/docking
|
||||
|
||||
var/datum/computer/file/embedded_program/docking/airlock/master_prog
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/docking/receive_user_command(command)
|
||||
if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
|
||||
..(command)
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/docking/proc/open_doors()
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open")
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/docking/cycleDoors(var/target)
|
||||
if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
|
||||
..(target)
|
||||
|
||||
/*** DEBUG VERBS ***
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/print_state()
|
||||
world << "id_tag: [id_tag]"
|
||||
world << "dock_state: [dock_state]"
|
||||
world << "control_mode: [control_mode]"
|
||||
world << "tag_target: [tag_target]"
|
||||
world << "response_sent: [response_sent]"
|
||||
|
||||
/datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line)
|
||||
world << "Program [id_tag] sent a message!"
|
||||
print_state()
|
||||
world << "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\""
|
||||
..(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/view_state()
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:print_state()
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/spoof_signal(var/command as text, var/sender as text)
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = sender
|
||||
signal.data["command"] = command
|
||||
signal.data["recipient"] = id_tag
|
||||
|
||||
src.program:receive_signal(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_dock(var/target as text)
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:initiate_docking(target)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_undock()
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:initiate_undocking()
|
||||
*/
|
||||
@@ -0,0 +1,347 @@
|
||||
//Handles the control of airlocks
|
||||
|
||||
#define STATE_WAIT 0
|
||||
#define STATE_DEPRESSURIZE 1
|
||||
#define STATE_PRESSURIZE 2
|
||||
|
||||
#define TARGET_NONE 0
|
||||
#define TARGET_INOPEN -1
|
||||
#define TARGET_OUTOPEN -2
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/airlock
|
||||
var/tag_exterior_door
|
||||
var/tag_interior_door
|
||||
var/tag_airpump
|
||||
var/tag_chamber_sensor
|
||||
var/tag_exterior_sensor
|
||||
var/tag_interior_sensor
|
||||
|
||||
var/state = STATE_WAIT
|
||||
var/target_state = TARGET_NONE
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/New(var/obj/machinery/embedded_controller/M)
|
||||
..(M)
|
||||
|
||||
memory["chamber_sensor_pressure"] = ONE_ATMOSPHERE
|
||||
memory["external_sensor_pressure"] = 0 //assume vacuum for simple airlock controller
|
||||
memory["internal_sensor_pressure"] = ONE_ATMOSPHERE
|
||||
memory["exterior_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in
|
||||
memory["interior_status"] = list(state = "closed", lock = "locked")
|
||||
memory["pump_status"] = "unknown"
|
||||
memory["target_pressure"] = ONE_ATMOSPHERE
|
||||
memory["purge"] = 0
|
||||
memory["secure"] = 0
|
||||
|
||||
if (istype(M, /obj/machinery/embedded_controller/radio/airlock)) //if our controller is an airlock controller than we can auto-init our tags
|
||||
var/obj/machinery/embedded_controller/radio/airlock/controller = M
|
||||
tag_exterior_door = controller.tag_exterior_door
|
||||
tag_interior_door = controller.tag_interior_door
|
||||
tag_airpump = controller.tag_airpump
|
||||
tag_chamber_sensor = controller.tag_chamber_sensor
|
||||
tag_exterior_sensor = controller.tag_exterior_sensor
|
||||
tag_interior_sensor = controller.tag_interior_sensor
|
||||
memory["secure"] = controller.tag_secure
|
||||
|
||||
spawn(10)
|
||||
signalDoor(tag_exterior_door, "update") //signals connected doors to update their status
|
||||
signalDoor(tag_interior_door, "update")
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
if(!receive_tag) return
|
||||
|
||||
if(receive_tag==tag_chamber_sensor)
|
||||
if(signal.data["pressure"])
|
||||
memory["chamber_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_exterior_sensor)
|
||||
memory["external_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_interior_sensor)
|
||||
memory["internal_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_exterior_door)
|
||||
memory["exterior_status"]["state"] = signal.data["door_status"]
|
||||
memory["exterior_status"]["lock"] = signal.data["lock_status"]
|
||||
|
||||
else if(receive_tag==tag_interior_door)
|
||||
memory["interior_status"]["state"] = signal.data["door_status"]
|
||||
memory["interior_status"]["lock"] = signal.data["lock_status"]
|
||||
|
||||
else if(receive_tag==tag_airpump)
|
||||
if(signal.data["power"])
|
||||
memory["pump_status"] = signal.data["direction"]
|
||||
else
|
||||
memory["pump_status"] = "off"
|
||||
|
||||
else if(receive_tag==id_tag)
|
||||
if(istype(master, /obj/machinery/embedded_controller/radio/airlock/access_controller))
|
||||
switch(signal.data["command"])
|
||||
if("cycle_exterior")
|
||||
receive_user_command("cycle_ext_door")
|
||||
if("cycle_interior")
|
||||
receive_user_command("cycle_int_door")
|
||||
if("cycle")
|
||||
if(memory["interior_status"]["state"] == "open") //handle backwards compatibility
|
||||
receive_user_command("cycle_ext")
|
||||
else
|
||||
receive_user_command("cycle_int")
|
||||
else
|
||||
switch(signal.data["command"])
|
||||
if("cycle_exterior")
|
||||
receive_user_command("cycle_ext")
|
||||
if("cycle_interior")
|
||||
receive_user_command("cycle_int")
|
||||
if("cycle")
|
||||
if(memory["interior_status"]["state"] == "open") //handle backwards compatibility
|
||||
receive_user_command("cycle_ext")
|
||||
else
|
||||
receive_user_command("cycle_int")
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/receive_user_command(command)
|
||||
var/shutdown_pump = 0
|
||||
switch(command)
|
||||
if("cycle_ext")
|
||||
begin_cycle_out()
|
||||
|
||||
if("cycle_int")
|
||||
begin_cycle_in()
|
||||
|
||||
if("cycle_ext_door")
|
||||
cycleDoors(TARGET_OUTOPEN)
|
||||
|
||||
if("cycle_int_door")
|
||||
cycleDoors(TARGET_INOPEN)
|
||||
|
||||
if("abort")
|
||||
state = STATE_PRESSURIZE
|
||||
target_state = TARGET_NONE
|
||||
memory["target_pressure"] = ONE_ATMOSPHERE
|
||||
signalPump(tag_airpump, 1, 1, memory["target_pressure"])
|
||||
process()
|
||||
|
||||
if("force_ext")
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "toggle")
|
||||
|
||||
if("force_int")
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "toggle")
|
||||
|
||||
if("purge")
|
||||
memory["purge"] = !memory["purge"]
|
||||
if(memory["purge"])
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, 1, "close")
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, 1, "close")
|
||||
state = STATE_DEPRESSURIZE
|
||||
target_state = TARGET_NONE
|
||||
signalPump(tag_airpump, 1, 0, 0)
|
||||
|
||||
if("secure")
|
||||
memory["secure"] = !memory["secure"]
|
||||
if(memory["secure"])
|
||||
signalDoor(tag_interior_door, "lock")
|
||||
signalDoor(tag_exterior_door, "lock")
|
||||
else
|
||||
signalDoor(tag_interior_door, "unlock")
|
||||
signalDoor(tag_exterior_door, "unlock")
|
||||
|
||||
if(shutdown_pump)
|
||||
signalPump(tag_airpump, 0) //send a signal to stop pressurizing
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/process()
|
||||
if(!state)
|
||||
if(target_state)
|
||||
switch(target_state)
|
||||
if(TARGET_INOPEN)
|
||||
memory["target_pressure"] = memory["internal_sensor_pressure"]
|
||||
if(TARGET_OUTOPEN)
|
||||
memory["target_pressure"] = memory["external_sensor_pressure"]
|
||||
|
||||
//lock down the airlock before activating pumps
|
||||
close_doors()
|
||||
|
||||
var/chamber_pressure = memory["chamber_sensor_pressure"]
|
||||
var/target_pressure = memory["target_pressure"]
|
||||
|
||||
if(memory["purge"])
|
||||
target_pressure = 0
|
||||
|
||||
if(chamber_pressure <= target_pressure)
|
||||
state = STATE_PRESSURIZE
|
||||
signalPump(tag_airpump, 1, 1, target_pressure) //send a signal to start pressurizing
|
||||
|
||||
else if(chamber_pressure > target_pressure)
|
||||
state = STATE_DEPRESSURIZE
|
||||
signalPump(tag_airpump, 1, 0, target_pressure) //send a signal to start depressurizing
|
||||
|
||||
//Check for vacuum - this is set after the pumps so the pumps are aiming for 0
|
||||
if(!memory["target_pressure"])
|
||||
memory["target_pressure"] = ONE_ATMOSPHERE * 0.05
|
||||
else
|
||||
//make sure to return to a sane idle state
|
||||
if(memory["pump_status"] != "off") //send a signal to stop pumping
|
||||
signalPump(tag_airpump, 0)
|
||||
|
||||
//the airlock will not allow itself to continue to cycle when any of the doors are forced open.
|
||||
if (state && !check_doors_secured())
|
||||
stop_cycling()
|
||||
|
||||
switch(state)
|
||||
if(STATE_PRESSURIZE)
|
||||
if(memory["chamber_sensor_pressure"] >= memory["target_pressure"] * 0.95)
|
||||
cycleDoors(target_state)
|
||||
|
||||
state = STATE_WAIT
|
||||
target_state = TARGET_NONE
|
||||
|
||||
if(memory["pump_status"] != "off")
|
||||
signalPump(tag_airpump, 0) //send a signal to stop pumping
|
||||
|
||||
|
||||
if(STATE_DEPRESSURIZE)
|
||||
if(memory["purge"])
|
||||
if(memory["chamber_sensor_pressure"] <= ONE_ATMOSPHERE * 0.05)
|
||||
state = STATE_PRESSURIZE
|
||||
signalPump(tag_airpump, 1, 1, memory["target_pressure"])
|
||||
|
||||
|
||||
else if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05)
|
||||
cycleDoors(target_state)
|
||||
|
||||
state = STATE_WAIT
|
||||
target_state = TARGET_NONE
|
||||
|
||||
//send a signal to stop pumping
|
||||
if(memory["pump_status"] != "off")
|
||||
signalPump(tag_airpump, 0)
|
||||
|
||||
|
||||
memory["processing"] = state != target_state
|
||||
|
||||
return 1
|
||||
|
||||
//these are here so that other types don't have to make so many assuptions about our implementation
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/begin_cycle_in()
|
||||
state = STATE_WAIT
|
||||
target_state = TARGET_INOPEN
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/begin_cycle_out()
|
||||
state = STATE_WAIT
|
||||
target_state = TARGET_OUTOPEN
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/close_doors()
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, 1, "close")
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, 1, "close")
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/stop_cycling()
|
||||
state = STATE_WAIT
|
||||
target_state = TARGET_NONE
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/done_cycling()
|
||||
return (state == STATE_WAIT && target_state == TARGET_NONE)
|
||||
|
||||
//are the doors closed and locked?
|
||||
/datum/computer/file/embedded_program/airlock/proc/check_doors_secured()
|
||||
var/ext_closed = (memory["exterior_status"]["state"] == "closed" && memory["exterior_status"]["lock"] == "locked")
|
||||
var/int_closed = (memory["interior_status"]["state"] == "closed" && memory["interior_status"]["lock"] == "locked")
|
||||
return (ext_closed && int_closed)
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/signalDoor(var/tag, var/command)
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag
|
||||
signal.data["command"] = command
|
||||
post_signal(signal)
|
||||
|
||||
/datum/computer/file/embedded_program/airlock/proc/signalPump(var/tag, var/power, var/direction, var/pressure)
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = tag,
|
||||
"sigtype" = "command",
|
||||
"power" = power,
|
||||
"direction" = direction,
|
||||
"set_external_pressure" = pressure
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
//this is called to set the appropriate door state at the end of a cycling process, or for the exterior buttons
|
||||
/datum/computer/file/embedded_program/airlock/proc/cycleDoors(var/target)
|
||||
switch(target)
|
||||
if(TARGET_OUTOPEN)
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "close")
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
|
||||
|
||||
if(TARGET_INOPEN)
|
||||
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "close")
|
||||
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open")
|
||||
if(TARGET_NONE)
|
||||
var/command = "unlock"
|
||||
if(memory["secure"])
|
||||
command = "lock"
|
||||
signalDoor(tag_exterior_door, command)
|
||||
signalDoor(tag_interior_door, command)
|
||||
|
||||
|
||||
/*----------------------------------------------------------
|
||||
toggleDoor()
|
||||
|
||||
Sends a radio command to a door to either open or close. If
|
||||
the command is 'toggle' the door will be sent a command that
|
||||
reverses it's current state.
|
||||
Can also toggle whether the door bolts are locked or not,
|
||||
depending on the state of the 'secure' flag.
|
||||
Only sends a command if it is needed, i.e. if the door is
|
||||
already open, passing an open command to this proc will not
|
||||
send an additional command to open the door again.
|
||||
----------------------------------------------------------*/
|
||||
/datum/computer/file/embedded_program/airlock/proc/toggleDoor(var/list/doorStatus, var/doorTag, var/secure, var/command)
|
||||
var/doorCommand = null
|
||||
|
||||
if(command == "toggle")
|
||||
if(doorStatus["state"] == "open")
|
||||
command = "close"
|
||||
else if(doorStatus["state"] == "closed")
|
||||
command = "open"
|
||||
|
||||
switch(command)
|
||||
if("close")
|
||||
if(secure)
|
||||
if(doorStatus["state"] == "open")
|
||||
doorCommand = "secure_close"
|
||||
else if(doorStatus["lock"] == "unlocked")
|
||||
doorCommand = "lock"
|
||||
else
|
||||
if(doorStatus["state"] == "open")
|
||||
if(doorStatus["lock"] == "locked")
|
||||
signalDoor(doorTag, "unlock")
|
||||
doorCommand = "close"
|
||||
else if(doorStatus["lock"] == "locked")
|
||||
doorCommand = "unlock"
|
||||
|
||||
if("open")
|
||||
if(secure)
|
||||
if(doorStatus["state"] == "closed")
|
||||
doorCommand = "secure_open"
|
||||
else if(doorStatus["lock"] == "unlocked")
|
||||
doorCommand = "lock"
|
||||
else
|
||||
if(doorStatus["state"] == "closed")
|
||||
if(doorStatus["lock"] == "locked")
|
||||
signalDoor(doorTag,"unlock")
|
||||
doorCommand = "open"
|
||||
else if(doorStatus["lock"] == "locked")
|
||||
doorCommand = "unlock"
|
||||
|
||||
if(doorCommand)
|
||||
signalDoor(doorTag, doorCommand)
|
||||
|
||||
|
||||
#undef STATE_WAIT
|
||||
#undef STATE_DEPRESSURIZE
|
||||
#undef STATE_PRESSURIZE
|
||||
|
||||
#undef TARGET_NONE
|
||||
#undef TARGET_INOPEN
|
||||
#undef TARGET_OUTOPEN
|
||||
@@ -0,0 +1,216 @@
|
||||
|
||||
#define STATE_UNDOCKED 0
|
||||
#define STATE_DOCKING 1
|
||||
#define STATE_UNDOCKING 2
|
||||
#define STATE_DOCKED 3
|
||||
|
||||
#define MODE_NONE 0
|
||||
#define MODE_SERVER 1
|
||||
#define MODE_CLIENT 2 //The one who initiated the docking, and who can initiate the undocking. The server cannot initiate undocking. (Think server == station, client == shuttle)
|
||||
|
||||
/*
|
||||
*** STATE TABLE ***
|
||||
|
||||
MODE_CLIENT|STATE_UNDOCKED sent a request for docking and now waiting for a reply.
|
||||
MODE_CLIENT|STATE_DOCKING server told us they are OK to dock, waiting for our docking port to be ready.
|
||||
MODE_CLIENT|STATE_DOCKED idle - docked as client.
|
||||
MODE_CLIENT|STATE_UNDOCKING we are either waiting for our docking port to be ready or for the server to give us the OK to undock.
|
||||
|
||||
MODE_SERVER|STATE_UNDOCKED should never happen.
|
||||
MODE_SERVER|STATE_DOCKING someone requested docking, we are waiting for our docking port to be ready.
|
||||
MODE_SERVER|STATE_DOCKED idle - docked as server
|
||||
MODE_SERVER|STATE_UNDOCKING client requested undocking, we are waiting for our docking port to be ready.
|
||||
|
||||
MODE_NONE|STATE_UNDOCKED idle - not docked.
|
||||
MODE_NONE|anything else should never happen.
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
|
||||
>>>>>>> ed4fb8d... Shuttles now dock on arrival and departure
|
||||
*/
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/docking
|
||||
var/tag_target //the tag of the docking controller that we are trying to dock with
|
||||
var/dock_state = STATE_UNDOCKED
|
||||
var/control_mode = MODE_NONE
|
||||
var/response_sent = 0 //so we don't spam confirmation messages
|
||||
|
||||
var/override_enabled = 0 //skips checks for the docking port being ready
|
||||
|
||||
/datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id
|
||||
var/command = signal.data["command"]
|
||||
var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
|
||||
|
||||
if (recipient != id_tag)
|
||||
return //this signal is not for us
|
||||
|
||||
switch (command)
|
||||
if ("confirm_dock")
|
||||
if (control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKED && receive_tag == tag_target)
|
||||
dock_state = STATE_DOCKING
|
||||
if (!override_enabled)
|
||||
prepare_for_docking()
|
||||
else if (control_mode == MODE_SERVER && dock_state == STATE_DOCKING && receive_tag == tag_target) //client just sent us the confirmation back, we're done with the docking process
|
||||
dock_state = STATE_DOCKED
|
||||
if (!override_enabled)
|
||||
finish_docking() //server done docking!
|
||||
response_sent = 0
|
||||
else
|
||||
send_docking_command(tag_target, "abort_dock") //not expecting confirmation for anything - tell the other guy.
|
||||
|
||||
if ("request_dock")
|
||||
if (control_mode == MODE_NONE && dock_state == STATE_UNDOCKED)
|
||||
control_mode = MODE_SERVER
|
||||
dock_state = STATE_DOCKING
|
||||
tag_target = receive_tag
|
||||
if (!override_enabled)
|
||||
prepare_for_docking()
|
||||
|
||||
if ("confirm_undock")
|
||||
if (control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
|
||||
send_docking_command(tag_target, "confirm_undock")
|
||||
reset() //client is done undocking!
|
||||
|
||||
if ("request_undock")
|
||||
if (control_mode == MODE_SERVER && dock_state == STATE_DOCKED && receive_tag == tag_target)
|
||||
dock_state = STATE_UNDOCKING
|
||||
prepare_for_undocking()
|
||||
|
||||
if ("dock_error")
|
||||
if (receive_tag == tag_target)
|
||||
reset()
|
||||
|
||||
/datum/computer/file/embedded_program/docking/process()
|
||||
switch(dock_state)
|
||||
if (STATE_DOCKING) //waiting for our docking port to be ready for docking
|
||||
if (ready_for_docking() || override_enabled)
|
||||
if (!response_sent)
|
||||
send_docking_command(tag_target, "confirm_dock") //tell the other guy we're ready
|
||||
response_sent = 1
|
||||
|
||||
if (control_mode == MODE_CLIENT) //client doesn't need to do anything further
|
||||
dock_state = STATE_DOCKED
|
||||
if (!override_enabled)
|
||||
finish_docking() //client done docking!
|
||||
response_sent = 0
|
||||
if (STATE_UNDOCKING)
|
||||
if (ready_for_undocking() || override_enabled)
|
||||
if (control_mode == MODE_CLIENT)
|
||||
if (!response_sent)
|
||||
send_docking_command(tag_target, "request_undock") //tell the server we want to undock now.
|
||||
response_sent = 1
|
||||
else if (control_mode == MODE_SERVER)
|
||||
send_docking_command(tag_target, "confirm_undock") //tell the client we are OK to undock.
|
||||
reset() //server is done undocking!
|
||||
|
||||
if (dock_state != STATE_DOCKING && dock_state != STATE_UNDOCKING)
|
||||
response_sent = 0
|
||||
|
||||
//handle invalid states
|
||||
if (control_mode == MODE_NONE && dock_state != STATE_UNDOCKED)
|
||||
if (tag_target)
|
||||
send_docking_command(tag_target, "dock_error")
|
||||
reset()
|
||||
if (control_mode == MODE_SERVER && dock_state == STATE_UNDOCKED)
|
||||
control_mode = MODE_NONE
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/initiate_docking(var/target)
|
||||
if (dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake
|
||||
return
|
||||
|
||||
tag_target = target
|
||||
control_mode = MODE_CLIENT
|
||||
|
||||
send_docking_command(tag_target, "request_dock")
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/initiate_undocking()
|
||||
if (dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking
|
||||
return
|
||||
|
||||
dock_state = STATE_UNDOCKING
|
||||
prepare_for_undocking()
|
||||
|
||||
send_docking_command(tag_target, "request_undock")
|
||||
|
||||
|
||||
//tell the docking port to start getting ready for docking - e.g. pressurize
|
||||
/datum/computer/file/embedded_program/docking/proc/prepare_for_docking()
|
||||
return
|
||||
|
||||
//are we ready for docking?
|
||||
/datum/computer/file/embedded_program/docking/proc/ready_for_docking()
|
||||
return 1
|
||||
|
||||
//we are docked, open the doors or whatever.
|
||||
/datum/computer/file/embedded_program/docking/proc/finish_docking()
|
||||
return
|
||||
|
||||
//tell the docking port to start getting ready for undocking - e.g. close those doors.
|
||||
/datum/computer/file/embedded_program/docking/proc/prepare_for_undocking()
|
||||
return
|
||||
|
||||
//are we ready for undocking?
|
||||
/datum/computer/file/embedded_program/docking/proc/ready_for_undocking()
|
||||
return 1
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/enable_override()
|
||||
override_enabled = 1
|
||||
//if (tag_target)
|
||||
// send_docking_command(tag_target, "enable_override")
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/disable_override()
|
||||
override_enabled = 0
|
||||
//if (tag_target)
|
||||
// send_docking_command(tag_target, "disable_override")
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/reset()
|
||||
dock_state = STATE_UNDOCKED
|
||||
control_mode = MODE_NONE
|
||||
tag_target = null
|
||||
response_sent = 0
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/force_undock()
|
||||
if (tag_target)
|
||||
send_docking_command(tag_target, "dock_error")
|
||||
reset()
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/docked()
|
||||
return (dock_state == STATE_DOCKED)
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/undocked()
|
||||
return (dock_state == STATE_UNDOCKED)
|
||||
|
||||
//returns 1 if we are saftely undocked (and the shuttle can leave)
|
||||
/datum/computer/file/embedded_program/docking/proc/can_launch()
|
||||
return undocked()
|
||||
|
||||
/datum/computer/file/embedded_program/docking/proc/send_docking_command(var/recipient, var/command)
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["command"] = command
|
||||
signal.data["recipient"] = recipient
|
||||
post_signal(signal)
|
||||
|
||||
//this is mostly for NanoUI
|
||||
/datum/computer/file/embedded_program/docking/proc/get_docking_status()
|
||||
switch (dock_state)
|
||||
if (STATE_UNDOCKED) return "undocked"
|
||||
if (STATE_DOCKING) return "docking"
|
||||
if (STATE_UNDOCKING) return "undocking"
|
||||
if (STATE_DOCKED) return "docked"
|
||||
|
||||
|
||||
|
||||
|
||||
#undef STATE_UNDOCKED
|
||||
#undef STATE_DOCKING
|
||||
#undef STATE_UNDOCKING
|
||||
#undef STATE_DOCKED
|
||||
|
||||
#undef MODE_NONE
|
||||
#undef MODE_SERVER
|
||||
#undef MODE_CLIENT
|
||||
@@ -1,84 +1,73 @@
|
||||
datum/computer/file/embedded_program
|
||||
var/list/memory = list()
|
||||
var/state
|
||||
var/obj/machinery/embedded_controller/master
|
||||
|
||||
proc
|
||||
post_signal(datum/signal/signal, comm_line)
|
||||
if(master)
|
||||
master.post_signal(signal, comm_line)
|
||||
else
|
||||
del(signal)
|
||||
|
||||
receive_user_command(command)
|
||||
|
||||
receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
return null
|
||||
|
||||
process()
|
||||
return 0
|
||||
|
||||
obj/machinery/embedded_controller
|
||||
/obj/machinery/embedded_controller
|
||||
var/datum/computer/file/embedded_program/program
|
||||
|
||||
name = "Embedded Controller"
|
||||
density = 0
|
||||
anchored = 1
|
||||
|
||||
var/on = 1
|
||||
|
||||
attack_hand(mob/user)
|
||||
user << browse(return_text(), "window=computer")
|
||||
user.set_machine(src)
|
||||
onclose(user, "computer")
|
||||
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
|
||||
return 0
|
||||
|
||||
update_icon()
|
||||
proc/return_text()
|
||||
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
proc/post_signal(datum/signal/signal, comm_line)
|
||||
return 0
|
||||
|
||||
receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
if(program)
|
||||
program.receive_signal(signal, receive_method, receive_param)
|
||||
if(program)
|
||||
program.receive_signal(signal, receive_method, receive_param)
|
||||
//spawn(5) program.process() //no, program.process sends some signals and machines respond and we here again and we lag -rastaf0
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return 0
|
||||
/obj/machinery/embedded_controller/process()
|
||||
if(program)
|
||||
program.process()
|
||||
|
||||
if(program)
|
||||
program.receive_user_command(href_list["command"])
|
||||
spawn(5) program.process()
|
||||
update_icon()
|
||||
src.updateDialog()
|
||||
|
||||
usr.set_machine(src)
|
||||
spawn(5) src.updateDialog()
|
||||
/obj/machinery/embedded_controller/attack_ai(mob/user as mob)
|
||||
src.ui_interact(user)
|
||||
|
||||
process()
|
||||
if(program)
|
||||
program.process()
|
||||
/obj/machinery/embedded_controller/attack_paw(mob/user as mob)
|
||||
user << "You do not have the dexterity to use this."
|
||||
return
|
||||
|
||||
update_icon()
|
||||
src.updateDialog()
|
||||
/obj/machinery/embedded_controller/attack_hand(mob/user as mob)
|
||||
src.ui_interact(user)
|
||||
|
||||
radio
|
||||
var/frequency
|
||||
var/datum/radio_frequency/radio_connection
|
||||
/obj/machinery/embedded_controller/ui_interact()
|
||||
return
|
||||
|
||||
initialize()
|
||||
set_frequency(frequency)
|
||||
/obj/machinery/embedded_controller/radio
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_control_standby"
|
||||
power_channel = ENVIRON
|
||||
density = 0
|
||||
|
||||
var/id_tag
|
||||
|
||||
post_signal(datum/signal/signal)
|
||||
signal.transmission_method = TRANSMISSION_RADIO
|
||||
if(radio_connection)
|
||||
return radio_connection.post_signal(src, signal)
|
||||
else
|
||||
del(signal)
|
||||
var/frequency = 1379
|
||||
var/datum/radio_frequency/radio_connection
|
||||
unacidable = 1
|
||||
|
||||
proc
|
||||
set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency)
|
||||
/obj/machinery/embedded_controller/radio/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/update_icon()
|
||||
if(on && program)
|
||||
if(program.memory["processing"])
|
||||
icon_state = "airlock_control_process"
|
||||
else
|
||||
icon_state = "airlock_control_standby"
|
||||
else
|
||||
icon_state = "airlock_control_off"
|
||||
|
||||
/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal)
|
||||
signal.transmission_method = TRANSMISSION_RADIO
|
||||
if(radio_connection)
|
||||
return radio_connection.post_signal(src, signal)
|
||||
else
|
||||
del(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency)
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
/datum/computer/file/embedded_program
|
||||
var/list/memory = list()
|
||||
var/obj/machinery/embedded_controller/master
|
||||
|
||||
var/id_tag
|
||||
|
||||
/datum/computer/file/embedded_program/New(var/obj/machinery/embedded_controller/M)
|
||||
master = M
|
||||
if (istype(M, /obj/machinery/embedded_controller/radio))
|
||||
var/obj/machinery/embedded_controller/radio/R = M
|
||||
id_tag = R.id_tag
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_user_command(command)
|
||||
return
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
return
|
||||
|
||||
/datum/computer/file/embedded_program/proc/process()
|
||||
return
|
||||
|
||||
/datum/computer/file/embedded_program/proc/post_signal(datum/signal/signal, comm_line)
|
||||
if(master)
|
||||
master.post_signal(signal, comm_line)
|
||||
else
|
||||
del(signal)
|
||||
@@ -0,0 +1,160 @@
|
||||
//a docking port that uses a single door
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller
|
||||
name = "docking hatch controller"
|
||||
var/tag_door
|
||||
var/datum/computer/file/embedded_program/docking/simple/docking_program
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/initialize()
|
||||
..()
|
||||
docking_program = new/datum/computer/file/embedded_program/docking/simple(src)
|
||||
program = docking_program
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
|
||||
data = list(
|
||||
"docking_status" = docking_program.get_docking_status(),
|
||||
"override_enabled" = docking_program.override_enabled,
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/clean = 0
|
||||
switch(href_list["command"]) //anti-HTML-hacking checks
|
||||
if("force_door")
|
||||
clean = 1
|
||||
if("toggle_override")
|
||||
clean = 1
|
||||
|
||||
if(clean)
|
||||
program.receive_user_command(href_list["command"])
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
//A docking controller program for a simple door based docking port
|
||||
/datum/computer/file/embedded_program/docking/simple
|
||||
var/tag_door
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/New(var/obj/machinery/embedded_controller/M)
|
||||
..(M)
|
||||
memory["door_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in
|
||||
memory["door_status"] = list(state = "closed", lock = "locked")
|
||||
|
||||
if (istype(M, /obj/machinery/embedded_controller/radio/simple_docking_controller))
|
||||
var/obj/machinery/embedded_controller/radio/simple_docking_controller/controller = M
|
||||
|
||||
tag_door = controller.tag_door
|
||||
|
||||
spawn(10)
|
||||
signal_door("update") //signals connected doors to update their status
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
|
||||
if(!receive_tag) return
|
||||
|
||||
if(receive_tag==tag_door)
|
||||
memory["door_status"]["state"] = signal.data["door_status"]
|
||||
memory["door_status"]["lock"] = signal.data["lock_status"]
|
||||
|
||||
..(signal, receive_method, receive_param)
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/receive_user_command(command)
|
||||
switch(command)
|
||||
if("force_door")
|
||||
if (override_enabled)
|
||||
if(memory["door_status"]["state"] == "open")
|
||||
close_door()
|
||||
else
|
||||
open_door()
|
||||
if("toggle_override")
|
||||
if (override_enabled)
|
||||
disable_override()
|
||||
else
|
||||
enable_override()
|
||||
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/proc/signal_door(var/command)
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_door
|
||||
signal.data["command"] = command
|
||||
post_signal(signal)
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/proc/open_door()
|
||||
if(memory["door_status"]["state"] == "closed")
|
||||
signal_door("secure_open")
|
||||
else if(memory["door_status"]["lock"] == "unlocked")
|
||||
signal_door("lock")
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/proc/close_door()
|
||||
if(memory["door_status"]["state"] == "open")
|
||||
signal_door("secure_close")
|
||||
else if(memory["door_status"]["lock"] == "unlocked")
|
||||
signal_door("lock")
|
||||
|
||||
//tell the docking port to start getting ready for docking - e.g. pressurize
|
||||
/datum/computer/file/embedded_program/docking/simple/prepare_for_docking()
|
||||
return //don't need to do anything
|
||||
|
||||
//are we ready for docking?
|
||||
/datum/computer/file/embedded_program/docking/simple/ready_for_docking()
|
||||
return 1 //don't need to do anything
|
||||
|
||||
//we are docked, open the doors or whatever.
|
||||
/datum/computer/file/embedded_program/docking/simple/finish_docking()
|
||||
open_door()
|
||||
|
||||
//tell the docking port to start getting ready for undocking - e.g. close those doors.
|
||||
/datum/computer/file/embedded_program/docking/simple/prepare_for_undocking()
|
||||
close_door()
|
||||
|
||||
//are we ready for undocking?
|
||||
/datum/computer/file/embedded_program/docking/simple/ready_for_undocking()
|
||||
return (memory["door_status"]["state"] == "closed" && memory["door_status"]["lock"] == "locked")
|
||||
|
||||
/datum/computer/file/embedded_program/docking/simple/reset()
|
||||
close_door()
|
||||
..()
|
||||
|
||||
/*** DEBUG VERBS ***
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/view_state()
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:print_state()
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/spoof_signal(var/command as text, var/sender as text)
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = sender
|
||||
signal.data["command"] = command
|
||||
signal.data["recipient"] = id_tag
|
||||
|
||||
src.program:receive_signal(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_dock(var/target as text)
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:initiate_docking(target)
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_undock()
|
||||
set category = "Debug"
|
||||
set src in view(1)
|
||||
src.program:initiate_undocking()
|
||||
*/
|
||||
@@ -1,79 +0,0 @@
|
||||
/datum/computer/file/embedded_program/simple_vent_controller
|
||||
|
||||
var/airpump_tag
|
||||
|
||||
receive_user_command(command)
|
||||
switch(command)
|
||||
if("vent_inactive")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["power"] = 0
|
||||
post_signal(signal)
|
||||
|
||||
if("vent_pump")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["stabalize"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
|
||||
if("vent_clear")
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["purge"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
|
||||
process()
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_vent_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_control_standby"
|
||||
|
||||
name = "Vent Controller"
|
||||
density = 0
|
||||
unacidable = 1
|
||||
|
||||
frequency = 1229
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
var/airpump_tag
|
||||
|
||||
initialize()
|
||||
..()
|
||||
|
||||
var/datum/computer/file/embedded_program/simple_vent_controller/new_prog = new
|
||||
|
||||
new_prog.airpump_tag = airpump_tag
|
||||
new_prog.master = src
|
||||
program = new_prog
|
||||
|
||||
update_icon()
|
||||
if(on && program)
|
||||
icon_state = "airlock_control_standby"
|
||||
else
|
||||
icon_state = "airlock_control_off"
|
||||
|
||||
|
||||
return_text()
|
||||
var/state_options = null
|
||||
state_options = {"<A href='?src=\ref[src];command=vent_inactive'>Deactivate Vent</A><BR>
|
||||
<A href='?src=\ref[src];command=vent_pump'>Activate Vent / Pump</A><BR>
|
||||
<A href='?src=\ref[src];command=vent_clear'>Activate Vent / Clear</A><BR>"}
|
||||
var/output = {"<B>Vent Control Console</B><HR>
|
||||
[state_options]<HR>"}
|
||||
|
||||
return output
|
||||
@@ -1,369 +0,0 @@
|
||||
//States for airlock_control
|
||||
#define AIRLOCK_STATE_WAIT 0
|
||||
#define AIRLOCK_STATE_DEPRESSURIZE 1
|
||||
#define AIRLOCK_STATE_PRESSURIZE 2
|
||||
|
||||
#define AIRLOCK_TARGET_INOPEN -1
|
||||
#define AIRLOCK_TARGET_NONE 0
|
||||
#define AIRLOCK_TARGET_OUTOPEN 1
|
||||
|
||||
datum/computer/file/embedded_program/smart_airlock_controller
|
||||
var/id_tag
|
||||
var/tag_exterior_door
|
||||
var/tag_interior_door
|
||||
var/tag_airpump
|
||||
var/tag_chamber_sensor
|
||||
var/tag_exterior_sensor
|
||||
var/tag_interior_sensor
|
||||
//var/sanitize_external
|
||||
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
var/target_state = AIRLOCK_TARGET_NONE
|
||||
|
||||
datum/computer/file/embedded_program/smart_airlock_controller/New()
|
||||
..()
|
||||
memory["chamber_sensor_pressure"] = ONE_ATMOSPHERE
|
||||
memory["external_sensor_pressure"] = ONE_ATMOSPHERE
|
||||
memory["internal_sensor_pressure"] = ONE_ATMOSPHERE
|
||||
memory["exterior_status"] = "unknown"
|
||||
memory["interior_status"] = "unknown"
|
||||
memory["pump_status"] = "unknown"
|
||||
memory["target_pressure"] = ONE_ATMOSPHERE
|
||||
|
||||
datum/computer/file/embedded_program/smart_airlock_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
if(!receive_tag) return
|
||||
|
||||
if(receive_tag==tag_chamber_sensor)
|
||||
if(signal.data["pressure"])
|
||||
memory["chamber_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_exterior_sensor)
|
||||
if(signal.data["pressure"])
|
||||
memory["external_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_interior_sensor)
|
||||
if(signal.data["pressure"])
|
||||
memory["internal_sensor_pressure"] = text2num(signal.data["pressure"])
|
||||
|
||||
else if(receive_tag==tag_exterior_door)
|
||||
memory["exterior_status"] = signal.data["door_status"]
|
||||
|
||||
else if(receive_tag==tag_interior_door)
|
||||
memory["interior_status"] = signal.data["door_status"]
|
||||
|
||||
else if(receive_tag==tag_airpump)
|
||||
if(signal.data["power"])
|
||||
memory["pump_status"] = signal.data["direction"]
|
||||
else
|
||||
memory["pump_status"] = "off"
|
||||
|
||||
else if(receive_tag==id_tag)
|
||||
switch(signal.data["command"])
|
||||
if("cycle_exterior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_OUTOPEN
|
||||
if("cycle_interior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_INOPEN
|
||||
|
||||
master.updateDialog()
|
||||
|
||||
datum/computer/file/embedded_program/smart_airlock_controller/receive_user_command(command)
|
||||
var/shutdown_pump = 0
|
||||
switch(command)
|
||||
if("cycle_closed")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_NONE
|
||||
if(memory["interior_status"] != "closed")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_interior_door
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
if(memory["exterior_status"] != "closed")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_exterior_door
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
shutdown_pump = 1
|
||||
if("open_interior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_NONE
|
||||
if(memory["interior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_interior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
if("close_interior")
|
||||
if(memory["interior_status"] != "closed")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_interior_door
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
shutdown_pump = 1
|
||||
if("close_exterior")
|
||||
if(memory["exterior_status"] != "closed")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_exterior_door
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
shutdown_pump = 1
|
||||
if("open_exterior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_NONE
|
||||
if(memory["exterior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_exterior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
if("cycle_exterior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_OUTOPEN
|
||||
if("cycle_interior")
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_INOPEN
|
||||
|
||||
if(shutdown_pump)
|
||||
//send a signal to stop pressurizing
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = tag_airpump,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
master.updateDialog()
|
||||
|
||||
datum/computer/file/embedded_program/smart_airlock_controller/process()
|
||||
var/process_again = 1
|
||||
while(process_again)
|
||||
process_again = 0
|
||||
|
||||
if(!state && target_state)
|
||||
//we're ready to do stuff, now what do we want to do?
|
||||
switch(target_state)
|
||||
if(AIRLOCK_TARGET_INOPEN)
|
||||
memory["target_pressure"] = memory["internal_sensor_pressure"]
|
||||
if(AIRLOCK_TARGET_OUTOPEN)
|
||||
memory["target_pressure"] = memory["external_sensor_pressure"]
|
||||
|
||||
//work out whether we need to pressurize or depressurize the chamber (5% leeway with target pressure)
|
||||
var/chamber_pressure = memory["chamber_sensor_pressure"]
|
||||
var/target_pressure = memory["target_pressure"]
|
||||
if(chamber_pressure <= target_pressure)
|
||||
state = AIRLOCK_STATE_PRESSURIZE
|
||||
|
||||
//send a signal to start pressurizing
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = tag_airpump,
|
||||
"sigtype"="command",
|
||||
"power"=1,
|
||||
"direction"=1,
|
||||
"set_external_pressure"=target_pressure
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
else if(chamber_pressure > target_pressure)
|
||||
state = AIRLOCK_STATE_DEPRESSURIZE
|
||||
|
||||
//send a signal to start depressurizing
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
"tag" = tag_airpump,
|
||||
"sigtype"="command",
|
||||
"power"=1,
|
||||
"direction"=0,
|
||||
"set_external_pressure"=target_pressure
|
||||
)
|
||||
post_signal(signal)
|
||||
|
||||
//actually do stuff
|
||||
//override commands are handled elsewhere, otherwise everything proceeds automatically
|
||||
switch(state)
|
||||
if(AIRLOCK_STATE_PRESSURIZE)
|
||||
if(memory["chamber_sensor_pressure"] >= memory["target_pressure"] * 0.95)
|
||||
if(target_state < 0)
|
||||
if(memory["interior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_interior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else if(target_state > 0)
|
||||
if(memory["exterior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_exterior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_NONE
|
||||
|
||||
//send a signal to stop pumping
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = tag_airpump,
|
||||
"sigtype"="command",
|
||||
"power" = 0
|
||||
)
|
||||
post_signal(signal)
|
||||
master.updateDialog()
|
||||
|
||||
if(AIRLOCK_STATE_DEPRESSURIZE)
|
||||
if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05)
|
||||
if(target_state > 0)
|
||||
if(memory["exterior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_exterior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
else if(target_state < 0)
|
||||
if(memory["interior_status"] != "open")
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = tag_interior_door
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
state = AIRLOCK_STATE_WAIT
|
||||
target_state = AIRLOCK_TARGET_NONE
|
||||
|
||||
//send a signal to stop pumping
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = tag_airpump,
|
||||
"sigtype"="command",
|
||||
"power" = 0
|
||||
)
|
||||
post_signal(signal)
|
||||
master.updateDialog()
|
||||
|
||||
//memory["sensor_pressure"] = sensor_pressure
|
||||
memory["processing"] = state != target_state
|
||||
//sensor_pressure = null //not sure if we can comment this out. Uncomment in case of problems -rastaf0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
obj/machinery/embedded_controller/radio/smart_airlock_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_control_standby"
|
||||
|
||||
name = "Cycling Airlock Console"
|
||||
density = 0
|
||||
unacidable = 1
|
||||
frequency = 1449
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
var/id_tag
|
||||
var/tag_exterior_door
|
||||
var/tag_interior_door
|
||||
var/tag_airpump
|
||||
var/tag_chamber_sensor
|
||||
var/tag_exterior_sensor
|
||||
var/tag_interior_sensor
|
||||
//var/sanitize_external
|
||||
|
||||
initialize()
|
||||
..()
|
||||
|
||||
var/datum/computer/file/embedded_program/smart_airlock_controller/new_prog = new
|
||||
|
||||
new_prog.id_tag = id_tag
|
||||
new_prog.tag_exterior_door = tag_exterior_door
|
||||
new_prog.tag_interior_door = tag_interior_door
|
||||
new_prog.tag_airpump = tag_airpump
|
||||
new_prog.tag_chamber_sensor = tag_chamber_sensor
|
||||
new_prog.tag_exterior_sensor = tag_exterior_sensor
|
||||
new_prog.tag_interior_sensor = tag_interior_sensor
|
||||
//new_prog.sanitize_external = sanitize_external
|
||||
|
||||
new_prog.master = src
|
||||
program = new_prog
|
||||
|
||||
update_icon()
|
||||
if(on && program)
|
||||
if(program.memory["processing"])
|
||||
icon_state = "airlock_control_process"
|
||||
else
|
||||
icon_state = "airlock_control_standby"
|
||||
else
|
||||
icon_state = "airlock_control_off"
|
||||
|
||||
|
||||
return_text()
|
||||
var/state_options = ""
|
||||
|
||||
var/state = 0
|
||||
var/chamber_sensor_pressure = "----"
|
||||
var/external_sensor_pressure = "----"
|
||||
var/internal_sensor_pressure = "----"
|
||||
var/exterior_status = "----"
|
||||
var/interior_status = "----"
|
||||
var/pump_status = "----"
|
||||
var/target_pressure = "----"
|
||||
if(program)
|
||||
state = program.state
|
||||
chamber_sensor_pressure = program.memory["chamber_sensor_pressure"]
|
||||
external_sensor_pressure = program.memory["external_sensor_pressure"]
|
||||
internal_sensor_pressure = program.memory["internal_sensor_pressure"]
|
||||
exterior_status = program.memory["exterior_status"]
|
||||
interior_status = program.memory["interior_status"]
|
||||
pump_status = program.memory["pump_status"]
|
||||
target_pressure = program.memory["target_pressure"]
|
||||
|
||||
var/exterior_closed = 0
|
||||
if(exterior_status == "closed")
|
||||
exterior_closed = 1
|
||||
var/interior_closed = 0
|
||||
if(interior_status == "closed")
|
||||
interior_closed = 1
|
||||
|
||||
state_options += "<B>Exterior status: </B> [exterior_status] ([external_sensor_pressure] kPa)<br>"
|
||||
if(exterior_closed)
|
||||
state_options += "<A href='?src=\ref[src];command=open_exterior'>Open exterior airlock</A> "
|
||||
if(abs(chamber_sensor_pressure - external_sensor_pressure) > ONE_ATMOSPHERE * 0.05)
|
||||
state_options += "<font color='red'><b>WARNING</b></font>"
|
||||
state_options += "<BR>"
|
||||
if(!state && exterior_closed && interior_closed)
|
||||
state_options += "<A href='?src=\ref[src];command=cycle_exterior'>Cycle to Exterior Airlock</A><BR>"
|
||||
else
|
||||
state_options += "<br>"
|
||||
else
|
||||
state_options += "<A href='?src=\ref[src];command=close_exterior'>Close exterior airlock</A><BR>"
|
||||
state_options += "<BR>"
|
||||
|
||||
state_options += "<B>Interior status: </B> [interior_status] ([internal_sensor_pressure] kPa)<br>"
|
||||
if(interior_closed)
|
||||
state_options += "<A href='?src=\ref[src];command=open_interior'>Open interior airlock</A> "
|
||||
if(abs(chamber_sensor_pressure - internal_sensor_pressure) > ONE_ATMOSPHERE * 0.05)
|
||||
state_options += "<font color='red'><b>WARNING</b></font>"
|
||||
state_options += "<BR>"
|
||||
if(!state && exterior_closed && interior_closed)
|
||||
state_options += "<A href='?src=\ref[src];command=cycle_interior'>Cycle to Interior Airlock</A><BR>"
|
||||
else
|
||||
state_options += "<br>"
|
||||
else
|
||||
state_options += "<A href='?src=\ref[src];command=close_interior'>Close interior airlock</A><BR>"
|
||||
state_options += "<BR>"
|
||||
|
||||
state_options += "<br>"
|
||||
state_options += "<B>Chamber Pressure:</B> [chamber_sensor_pressure] kPa<BR>"
|
||||
state_options += "<B>Target Chamber Pressure:</B> [target_pressure] kPa<BR>"
|
||||
state_options += "<B>Control Pump: </B> [pump_status]<BR>"
|
||||
if(state)
|
||||
state_options += "<A href='?src=\ref[src];command=cycle_closed'>Abort Cycling</A><BR>"
|
||||
else
|
||||
state_options += "<br>"
|
||||
|
||||
return state_options
|
||||
|
||||
#undef AIRLOCK_STATE_PRESSURIZE
|
||||
#undef AIRLOCK_STATE_WAIT
|
||||
#undef AIRLOCK_STATE_DEPRESSURIZE
|
||||
|
||||
#undef AIRLOCK_TARGET_INOPEN
|
||||
#undef AIRLOCK_TARGET_CLOSED
|
||||
#undef AIRLOCK_TARGET_OUTOPEN
|
||||
@@ -340,11 +340,11 @@
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part)
|
||||
if(!part) return
|
||||
|
||||
|
||||
// critical exploit prevention, do not remove unless you replace it -walter0o
|
||||
if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
|
||||
return
|
||||
|
||||
|
||||
src.being_built = new part.type(src)
|
||||
src.desc = "It's building [src.being_built]."
|
||||
src.remove_resources(part)
|
||||
@@ -576,24 +576,24 @@
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit)
|
||||
// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o
|
||||
|
||||
|
||||
if(!Part || !user || !istype(Part) || !istype(user)) // sanity
|
||||
return 1
|
||||
|
||||
|
||||
if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
|
||||
|
||||
|
||||
var/turf/LOC = get_turf(user)
|
||||
message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] <a href='?_src_=vars;Vars=\ref[Part]'>[Part]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
|
||||
log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !")
|
||||
log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !")
|
||||
return 1
|
||||
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
|
||||
|
||||
if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o
|
||||
return
|
||||
|
||||
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["part_set"])
|
||||
var/tpart_set = filter.getStr("part_set")
|
||||
@@ -605,24 +605,24 @@
|
||||
screen = "parts"
|
||||
if(href_list["part"])
|
||||
var/obj/part = filter.getObj("part")
|
||||
|
||||
|
||||
// critical exploit prevention, do not remove unless you replace it -walter0o
|
||||
if(src.exploit_prevention(part, usr))
|
||||
return
|
||||
|
||||
|
||||
if(!processing_queue)
|
||||
build_part(part)
|
||||
else
|
||||
add_to_queue(part)
|
||||
if(href_list["add_to_queue"])
|
||||
var/obj/part = filter.getObj("add_to_queue")
|
||||
|
||||
|
||||
// critical exploit prevention, do not remove unless you replace it -walter0o
|
||||
if(src.exploit_prevention(part, usr))
|
||||
return
|
||||
|
||||
|
||||
add_to_queue(part)
|
||||
|
||||
|
||||
return update_queue_on_page()
|
||||
if(href_list["remove_from_queue"])
|
||||
remove_from_queue(filter.getNum("remove_from_queue"))
|
||||
@@ -661,12 +661,12 @@
|
||||
return update_queue_on_page()
|
||||
if(href_list["part_desc"])
|
||||
var/obj/part = filter.getObj("part_desc")
|
||||
|
||||
|
||||
// critical exploit prevention, do not remove unless you replace it -walter0o
|
||||
if(src.exploit_prevention(part, usr, 1))
|
||||
return
|
||||
|
||||
if(part)
|
||||
|
||||
if(part)
|
||||
temp = {"<h1>[part] description:</h1>
|
||||
[part.desc]<br>
|
||||
<a href='?src=\ref[src];clear_temp=1'>Return</a>
|
||||
@@ -711,6 +711,8 @@
|
||||
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/attackby(obj/W as obj, mob/user as mob)
|
||||
if(exchange_parts(user, W))
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/screwdriver))
|
||||
if (!opened)
|
||||
opened = 1
|
||||
|
||||
@@ -105,7 +105,7 @@ var/last_chew = 0
|
||||
|
||||
var/mob/living/carbon/human/H = A
|
||||
if (!H.handcuffed) return
|
||||
if (H.a_intent != "hurt") return
|
||||
if (H.a_intent != "harm") return
|
||||
if (H.zone_sel.selecting != "mouth") return
|
||||
if (H.wear_mask) return
|
||||
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
..()
|
||||
if(!buckled_mob) return
|
||||
|
||||
if(propelled || (pulling && (pulling.a_intent == "hurt")))
|
||||
if(propelled || (pulling && (pulling.a_intent == "harm")))
|
||||
var/mob/living/occupant = buckled_mob
|
||||
unbuckle()
|
||||
occupant.throw_at(A, 3, 2)
|
||||
|
||||
+10
-26
@@ -170,34 +170,13 @@ var/list/mechtoys = list(
|
||||
eta = round(ticksleft/600,1)
|
||||
else
|
||||
eta = 0
|
||||
send()
|
||||
|
||||
var/datum/shuttle/S = shuttles["Supply"]
|
||||
if (istype(S)) S.move()
|
||||
moving = 0
|
||||
at_station = !at_station
|
||||
|
||||
sleep(processing_interval)
|
||||
|
||||
proc/send()
|
||||
var/area/from
|
||||
var/area/dest
|
||||
var/area/the_shuttles_way
|
||||
switch(at_station)
|
||||
if(1)
|
||||
from = locate(SUPPLY_STATION_AREATYPE)
|
||||
dest = locate(SUPPLY_DOCK_AREATYPE)
|
||||
the_shuttles_way = from
|
||||
at_station = 0
|
||||
if(0)
|
||||
from = locate(SUPPLY_DOCK_AREATYPE)
|
||||
dest = locate(SUPPLY_STATION_AREATYPE)
|
||||
the_shuttles_way = dest
|
||||
at_station = 1
|
||||
moving = 0
|
||||
|
||||
//Do I really need to explain this loop?
|
||||
for(var/mob/living/unlucky_person in the_shuttles_way)
|
||||
unlucky_person.gib()
|
||||
|
||||
from.move_contents_to(dest)
|
||||
|
||||
//Check whether the shuttle is allowed to move
|
||||
proc/can_move()
|
||||
if(moving) return 0
|
||||
@@ -524,7 +503,12 @@ var/list/mechtoys = list(
|
||||
else if(supply_shuttle.at_station)
|
||||
supply_shuttle.moving = -1
|
||||
supply_shuttle.sell()
|
||||
supply_shuttle.send()
|
||||
supply_shuttle.moving = 0
|
||||
supply_shuttle.at_station = !supply_shuttle.at_station
|
||||
|
||||
var/datum/shuttle/S = shuttles["Supply"]
|
||||
if (istype(S)) S.move()
|
||||
|
||||
temp = "The supply shuttle has departed.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
else
|
||||
supply_shuttle.moving = 1
|
||||
|
||||
@@ -140,7 +140,6 @@ var/list/bombers = list( )
|
||||
var/list/admin_log = list ( )
|
||||
var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
|
||||
var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
|
||||
var/list/shuttles = list( )
|
||||
var/list/reg_dna = list( )
|
||||
// list/traitobj = list( )
|
||||
|
||||
|
||||
@@ -965,70 +965,6 @@ var/global/nologevent = 0
|
||||
//
|
||||
//ALL DONE
|
||||
//*********************************************************************************************************
|
||||
//TO-DO:
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
/**********************Administration Shuttle**************************/
|
||||
|
||||
var/admin_shuttle_location = 0 // 0 = centcom 13, 1 = station
|
||||
|
||||
proc/move_admin_shuttle()
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (admin_shuttle_location == 1)
|
||||
fromArea = locate(/area/shuttle/administration/station)
|
||||
toArea = locate(/area/shuttle/administration/centcom)
|
||||
else
|
||||
fromArea = locate(/area/shuttle/administration/centcom)
|
||||
toArea = locate(/area/shuttle/administration/station)
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (admin_shuttle_location)
|
||||
admin_shuttle_location = 0
|
||||
else
|
||||
admin_shuttle_location = 1
|
||||
return
|
||||
|
||||
/**********************Centcom Ferry**************************/
|
||||
|
||||
var/ferry_location = 0 // 0 = centcom , 1 = station
|
||||
|
||||
proc/move_ferry()
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (ferry_location == 1)
|
||||
fromArea = locate(/area/shuttle/transport1/station)
|
||||
toArea = locate(/area/shuttle/transport1/centcom)
|
||||
else
|
||||
fromArea = locate(/area/shuttle/transport1/centcom)
|
||||
toArea = locate(/area/shuttle/transport1/station)
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (ferry_location)
|
||||
ferry_location = 0
|
||||
else
|
||||
ferry_location = 1
|
||||
return
|
||||
|
||||
/**********************Alien ship**************************/
|
||||
|
||||
var/alien_ship_location = 1 // 0 = base , 1 = mine
|
||||
|
||||
proc/move_alien_ship()
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (alien_ship_location == 1)
|
||||
fromArea = locate(/area/shuttle/alien/mine)
|
||||
toArea = locate(/area/shuttle/alien/base)
|
||||
else
|
||||
fromArea = locate(/area/shuttle/alien/base)
|
||||
toArea = locate(/area/shuttle/alien/mine)
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (alien_ship_location)
|
||||
alien_ship_location = 0
|
||||
else
|
||||
alien_ship_location = 1
|
||||
return
|
||||
|
||||
var/gamma_ship_location = 1 // 0 = station , 1 = space
|
||||
|
||||
|
||||
@@ -29,10 +29,7 @@
|
||||
<A href='?src=\ref[src];secretsadmin=manifest'>Show Crew Manifest</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=DNA'>List DNA (Blood)</A><BR>
|
||||
<A href='?src=\ref[src];secretsadmin=fingerprints'>List Fingerprints</A><BR><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveadminshuttle'>Move Administration Shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveferry'>Move Ferry</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=movealienship'>Move Alien Dinghy</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveminingshuttle'>Move Mining Shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=moveshuttle'>Move a shuttle</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=floorlava'>The floor is lava! (DANGEROUS: extremely lame)</A><BR>
|
||||
|
||||
+15
-24
@@ -2044,32 +2044,23 @@
|
||||
ticker.mode.finalize_traitor(A.mind)
|
||||
message_admins("\blue [key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1)
|
||||
log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
|
||||
if("moveminingshuttle")
|
||||
if(mining_shuttle_moving)
|
||||
return
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShM")
|
||||
move_mining_shuttle()
|
||||
message_admins("\blue [key_name_admin(usr)] moved mining shuttle", 1)
|
||||
log_admin("[key_name(usr)] moved the mining shuttle")
|
||||
if("moveadminshuttle")
|
||||
|
||||
if("moveshuttle")
|
||||
|
||||
if(!shuttles) return // Something is very wrong, the global shuttle list has not been created.
|
||||
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShA")
|
||||
move_admin_shuttle()
|
||||
message_admins("\blue [key_name_admin(usr)] moved the centcom administration shuttle", 1)
|
||||
log_admin("[key_name(usr)] moved the centcom administration shuttle")
|
||||
if("moveferry")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShF")
|
||||
move_ferry()
|
||||
message_admins("\blue [key_name_admin(usr)] moved the centcom ferry", 1)
|
||||
log_admin("[key_name(usr)] moved the centcom ferry")
|
||||
if("movealienship")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShX")
|
||||
move_alien_ship()
|
||||
message_admins("\blue [key_name_admin(usr)] moved the alien dinghy", 1)
|
||||
log_admin("[key_name(usr)] moved the alien dinghy")
|
||||
|
||||
var/shuttle_tag = input("Which shuttle do you want to call?") as null|anything in shuttles
|
||||
|
||||
if(shuttle_tag)
|
||||
var/datum/shuttle/S = shuttles[shuttle_tag]
|
||||
if(istype(S) && S.moving_status == 0)
|
||||
S.move()
|
||||
message_admins("\blue [key_name_admin(usr)] moved the [shuttle_tag] shuttle", 1)
|
||||
log_admin("[key_name(usr)] moved the [shuttle_tag] shuttle")
|
||||
|
||||
if("togglebombcap")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","BC")
|
||||
|
||||
@@ -38,125 +38,6 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
|
||||
|
||||
/**********************Shuttle Computer**************************/
|
||||
|
||||
var/mining_shuttle_tickstomove = 10
|
||||
var/mining_shuttle_moving = 0
|
||||
var/mining_shuttle_location = 0 // 0 = station 13, 1 = mining station
|
||||
|
||||
proc/move_mining_shuttle()
|
||||
if(mining_shuttle_moving) return
|
||||
mining_shuttle_moving = 1
|
||||
spawn(mining_shuttle_tickstomove*10)
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (mining_shuttle_location == 1)
|
||||
fromArea = locate(/area/shuttle/mining/outpost)
|
||||
toArea = locate(/area/shuttle/mining/station)
|
||||
|
||||
else
|
||||
fromArea = locate(/area/shuttle/mining/station)
|
||||
toArea = locate(/area/shuttle/mining/outpost)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in toArea)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
// NOTE: Commenting this out to avoid recreating mass driver glitch
|
||||
/*
|
||||
spawn(0)
|
||||
AM.throw_at(E, 1, 1)
|
||||
return
|
||||
*/
|
||||
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
//Do I really need to explain this loop?
|
||||
for(var/atom/A in toArea)
|
||||
if(istype(A,/mob/living))
|
||||
var/mob/living/unlucky_person = A
|
||||
unlucky_person.gib()
|
||||
// Weird things happen when this shit gets in the way.
|
||||
if(istype(A,/obj/structure/lattice) \
|
||||
|| istype(A, /obj/structure/window) \
|
||||
|| istype(A, /obj/structure/grille))
|
||||
qdel(A)
|
||||
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (mining_shuttle_location)
|
||||
mining_shuttle_location = 0
|
||||
else
|
||||
mining_shuttle_location = 1
|
||||
|
||||
for(var/mob/M in toArea)
|
||||
if(M.client)
|
||||
spawn(0)
|
||||
if(M.buckled)
|
||||
shake_camera(M, 3, 1) // buckled, not a lot of shaking
|
||||
else
|
||||
shake_camera(M, 10, 1) // unbuckled, HOLY SHIT SHAKE THE ROOM
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(!M.buckled)
|
||||
M.Weaken(3)
|
||||
|
||||
mining_shuttle_moving = 0
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mining_shuttle
|
||||
name = "mining shuttle console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_mining)
|
||||
circuit = "/obj/item/weapon/circuitboard/mining_shuttle"
|
||||
var/hacked = 0
|
||||
var/location = 0 //0 = station, 1 = mining base
|
||||
|
||||
/obj/machinery/computer/mining_shuttle/attack_hand(user as mob)
|
||||
if(..(user))
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
var/dat
|
||||
dat = text("<center>Mining shuttle:<br> <b><A href='?src=\ref[src];move=[1]'>Send</A></b></center>")
|
||||
user << browse("[dat]", "window=miningshuttle;size=200x100")
|
||||
|
||||
/obj/machinery/computer/mining_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["move"])
|
||||
//if(ticker.mode.name == "blob")
|
||||
// if(ticker.mode:declared)
|
||||
// usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
|
||||
// return
|
||||
|
||||
if (!mining_shuttle_moving)
|
||||
usr << "\blue Shuttle recieved message and will be sent shortly."
|
||||
move_mining_shuttle()
|
||||
else
|
||||
usr << "\blue Shuttle is already moving."
|
||||
|
||||
/obj/machinery/computer/mining_shuttle/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/card/emag))
|
||||
src.req_access = list()
|
||||
hacked = 1
|
||||
usr << "You fried the consoles ID checking system. It's now available to everyone!"
|
||||
else
|
||||
..()
|
||||
|
||||
/******************************Lantern*******************************/
|
||||
|
||||
/obj/item/device/flashlight/lantern
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
return
|
||||
|
||||
if (spikes > 0)
|
||||
if(user.a_intent == "hurt")
|
||||
if(user.a_intent == "harm")
|
||||
user.visible_message("\red <b> \The [user] fires \the [src] point blank at [M]!</b>")
|
||||
Fire(M,user)
|
||||
return
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
if(!target)
|
||||
return
|
||||
|
||||
if(user.a_intent != "hurt")
|
||||
if(user.a_intent != "harm")
|
||||
return ..()
|
||||
|
||||
force = 5
|
||||
|
||||
@@ -50,6 +50,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
|
||||
return g_amount + gold_amount + diamond_amount + uranium_amount
|
||||
|
||||
attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(exchange_parts(user, O))
|
||||
return
|
||||
if (shocked)
|
||||
shock(user,50)
|
||||
if (istype(O, /obj/item/weapon/screwdriver))
|
||||
|
||||
@@ -99,6 +99,9 @@ Note: Must be placed within 3 tiles of the R&D Console
|
||||
spawn(10)
|
||||
icon_state = "d_analyzer_l"
|
||||
busy = 0
|
||||
|
||||
if(exchange_parts(user, O))
|
||||
return
|
||||
return
|
||||
|
||||
//For testing purposes only.
|
||||
|
||||
@@ -53,6 +53,8 @@ Note: Must be placed west/left of and R&D console to function.
|
||||
max_material_storage = T * 75000
|
||||
|
||||
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(exchange_parts(user, O))
|
||||
return
|
||||
if (shocked)
|
||||
shock(user,50)
|
||||
if (O.is_open_container())
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
|
||||
/**********************Shuttle Computer**************************/
|
||||
|
||||
//copy paste from the mining shuttle
|
||||
|
||||
var/research_shuttle_tickstomove = 10
|
||||
var/research_shuttle_moving = 0
|
||||
var/research_shuttle_location = 0 // 0 = station 13, 1 = research station
|
||||
|
||||
proc/move_research_shuttle()
|
||||
if(research_shuttle_moving) return
|
||||
research_shuttle_moving = 1
|
||||
spawn(research_shuttle_tickstomove*10)
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (research_shuttle_location == 1)
|
||||
fromArea = locate(/area/shuttle/research/outpost)
|
||||
toArea = locate(/area/shuttle/research/station)
|
||||
else
|
||||
fromArea = locate(/area/shuttle/research/station)
|
||||
toArea = locate(/area/shuttle/research/outpost)
|
||||
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in toArea)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
// NOTE: Commenting this out to avoid recreating mass driver glitch
|
||||
/*
|
||||
spawn(0)
|
||||
AM.throw_at(E, 1, 1)
|
||||
return
|
||||
*/
|
||||
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area...
|
||||
bug.gib()
|
||||
|
||||
for(var/mob/living/simple_animal/pest in toArea) // And for the other kind of bug...
|
||||
pest.gib()
|
||||
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (research_shuttle_location)
|
||||
research_shuttle_location = 0
|
||||
else
|
||||
research_shuttle_location = 1
|
||||
research_shuttle_moving = 0
|
||||
return
|
||||
|
||||
/obj/machinery/computer/research_shuttle
|
||||
name = "Research Shuttle Console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_research)
|
||||
circuit = "/obj/item/weapon/circuitboard/research_shuttle"
|
||||
var/hacked = 0
|
||||
var/location = 0 //0 = station, 1 = research base
|
||||
|
||||
/obj/machinery/computer/research_shuttle/attack_hand(user as mob)
|
||||
src.add_fingerprint(usr)
|
||||
var/dat = "<center>Research shuttle: <b><A href='?src=\ref[src];move=1'>Send</A></b></center><br>"
|
||||
|
||||
user << browse("[dat]", "window=researchshuttle;size=200x100")
|
||||
|
||||
/obj/machinery/computer/research_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.machine = src
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["move"])
|
||||
|
||||
if (!research_shuttle_moving)
|
||||
usr << "\blue Shuttle recieved message and will be sent shortly."
|
||||
move_research_shuttle()
|
||||
else
|
||||
usr << "\blue Shuttle is already moving."
|
||||
|
||||
/obj/machinery/computer/research_shuttle/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/card/emag))
|
||||
var/obj/item/weapon/card/emag/E = W
|
||||
if(E.uses)
|
||||
E.uses--
|
||||
else
|
||||
return
|
||||
src.req_access = list()
|
||||
hacked = 1
|
||||
usr << "You fried the consoles ID checking system. It's now available to everyone!"
|
||||
|
||||
else
|
||||
..()
|
||||
@@ -121,6 +121,8 @@
|
||||
env.merge(removed)
|
||||
|
||||
/obj/machinery/r_n_d/server/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(exchange_parts(user, O))
|
||||
return
|
||||
if (disabled)
|
||||
return
|
||||
if (shocked)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/obj/machinery/computer/shuttle_control/multi/vox
|
||||
name = "skipjack control console"
|
||||
req_access = list(access_syndicate)
|
||||
shuttle_tag = "Vox Skipjack"
|
||||
|
||||
/obj/machinery/computer/shuttle_control/multi/syndicate
|
||||
name = "Syndicate control console"
|
||||
req_access = list(access_syndicate)
|
||||
shuttle_tag = "Syndicate"
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/machinery/computer/shuttle_control/mining
|
||||
name = "mining shuttle console"
|
||||
shuttle_tag = "Mining"
|
||||
req_access = list(access_mining)
|
||||
circuit = "/obj/item/weapon/circuitboard/mining_shuttle"
|
||||
|
||||
/obj/machinery/computer/shuttle_control/engineering
|
||||
name = "engineering shuttle console"
|
||||
shuttle_tag = "Engineering"
|
||||
req_access = list(access_engine)
|
||||
circuit = "/obj/item/weapon/circuitboard/engineering_shuttle"
|
||||
|
||||
/obj/machinery/computer/shuttle_control/research
|
||||
name = "research shuttle console"
|
||||
shuttle_tag = "Research"
|
||||
req_access = list(access_research)
|
||||
circuit = "/obj/item/weapon/circuitboard/research_shuttle"
|
||||
@@ -1,108 +0,0 @@
|
||||
var/engineering_shuttle_tickstomove = 10
|
||||
var/engineering_shuttle_moving = 0
|
||||
var/engineering_shuttle_location = 1 //Starts at the construction site.
|
||||
|
||||
proc/move_engineering_shuttle()
|
||||
if(engineering_shuttle_moving) return
|
||||
engineering_shuttle_moving = 1
|
||||
spawn(engineering_shuttle_tickstomove*10)
|
||||
var/area/fromArea
|
||||
var/area/toArea
|
||||
if (engineering_shuttle_location == 1)
|
||||
fromArea = locate(/area/shuttle/constructionsite/site)
|
||||
toArea = locate(/area/shuttle/constructionsite/station)
|
||||
|
||||
else
|
||||
fromArea = locate(/area/shuttle/constructionsite/station)
|
||||
toArea = locate(/area/shuttle/constructionsite/site)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in toArea)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
for(var/turf/T in dstturfs)
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
for(var/mob/living/carbon/bug in toArea)
|
||||
bug.gib()
|
||||
|
||||
for(var/mob/living/simple_animal/pest in toArea)
|
||||
pest.gib()
|
||||
|
||||
fromArea.move_contents_to(toArea)
|
||||
if (engineering_shuttle_location)
|
||||
engineering_shuttle_location = 0
|
||||
else
|
||||
engineering_shuttle_location = 1
|
||||
|
||||
for(var/mob/M in toArea)
|
||||
if(M.client)
|
||||
spawn(0)
|
||||
if(M.buckled)
|
||||
shake_camera(M, 3, 1)
|
||||
else
|
||||
shake_camera(M, 10, 1)
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(!M.buckled)
|
||||
M.Weaken(3)
|
||||
|
||||
engineering_shuttle_moving = 0
|
||||
return
|
||||
|
||||
/obj/machinery/computer/engineering_shuttle
|
||||
name = "engineering shuttle console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_engine)
|
||||
circuit = "/obj/item/weapon/circuitboard/engineering_shuttle"
|
||||
var/hacked = 0
|
||||
var/location = 0
|
||||
|
||||
/obj/machinery/computer/engineering_shuttle/attack_hand(user as mob)
|
||||
if(..(user))
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
var/dat
|
||||
|
||||
dat = "<center>Engineering Shuttle Control<hr>"
|
||||
|
||||
if(engineering_shuttle_moving)
|
||||
dat += "Location: <font color='red'>Moving</font> <br>"
|
||||
else
|
||||
dat += "Location: [engineering_shuttle_location ? "Outpost" : "Station"] <br>"
|
||||
|
||||
dat += "<b><A href='?src=\ref[src];move=[1]'>Send</A></b></center>"
|
||||
|
||||
|
||||
user << browse("[dat]", "window=engineeringshuttle;size=200x150")
|
||||
|
||||
/obj/machinery/computer/engineering_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["move"])
|
||||
if (!engineering_shuttle_moving)
|
||||
usr << "\blue Shuttle recieved message and will be sent shortly."
|
||||
move_engineering_shuttle()
|
||||
else
|
||||
usr << "\blue Shuttle is already moving."
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/computer/engineering_shuttle/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/card/emag))
|
||||
src.req_access = list()
|
||||
hacked = 1
|
||||
usr << "You fried the consoles ID checking system. It's now available to everyone!"
|
||||
else
|
||||
..()
|
||||
@@ -0,0 +1,275 @@
|
||||
//These lists are populated in /datum/shuttle_controller/New()
|
||||
//Shuttle controller is instantiated in master_controller.dm.
|
||||
|
||||
#define SHUTTLE_IDLE 0
|
||||
#define SHUTTLE_WARMUP 1
|
||||
#define SHUTTLE_INTRANSIT 2
|
||||
|
||||
var/global/list/shuttles
|
||||
|
||||
/datum/shuttle
|
||||
var/location = 0 //0 = at area_station, 1 = at area_offsite
|
||||
var/warmup_time = 0
|
||||
var/moving_status = SHUTTLE_IDLE //prevents people from doing things they shouldn't when the shuttle is in transit
|
||||
var/in_use = 0 //this mutex ensures that only one console can be doing things with the shuttle at a time.
|
||||
var/area_station
|
||||
var/area_offsite
|
||||
|
||||
var/docking_controller_tag //tag of the controller used to coordinate docking
|
||||
var/datum/computer/file/embedded_program/docking/docking_controller //the controller itself
|
||||
//TODO: change location to a string and use a mapping for area and dock targets.
|
||||
var/dock_target_station
|
||||
var/dock_target_offsite
|
||||
|
||||
|
||||
/datum/shuttle/proc/short_jump(var/datum/shuttle/shuttle,var/area/origin,var/area/destination)
|
||||
if(moving_status != SHUTTLE_IDLE) return
|
||||
|
||||
moving_status = SHUTTLE_WARMUP
|
||||
spawn(warmup_time*10)
|
||||
if (moving_status == SHUTTLE_IDLE)
|
||||
return //someone cancelled the launch
|
||||
|
||||
move(origin, destination)
|
||||
moving_status = SHUTTLE_IDLE
|
||||
|
||||
/datum/shuttle/proc/long_jump(var/shuttle_tag,var/area/departing,var/area/destination,var/area/interim,var/travel_time)
|
||||
if(moving_status != SHUTTLE_IDLE) return
|
||||
|
||||
moving_status = SHUTTLE_WARMUP
|
||||
|
||||
spawn(warmup_time*10)
|
||||
if (moving_status == SHUTTLE_IDLE)
|
||||
return //someone cancelled the launch
|
||||
|
||||
move(locate(departing),locate(interim))
|
||||
|
||||
sleep(travel_time)
|
||||
|
||||
move(locate(interim),locate(destination))
|
||||
|
||||
moving_status = SHUTTLE_IDLE
|
||||
|
||||
|
||||
/datum/shuttle/proc/dock()
|
||||
if (!docking_controller)
|
||||
return
|
||||
|
||||
var/dock_target = current_dock_target()
|
||||
if (!dock_target)
|
||||
return
|
||||
|
||||
docking_controller.initiate_docking(dock_target)
|
||||
|
||||
/datum/shuttle/proc/undock()
|
||||
if (!docking_controller)
|
||||
return
|
||||
|
||||
docking_controller.initiate_undocking()
|
||||
|
||||
/datum/shuttle/proc/current_dock_target()
|
||||
var/dock_target
|
||||
if (!location) //station
|
||||
dock_target = dock_target_station
|
||||
else
|
||||
dock_target = dock_target_offsite
|
||||
return dock_target
|
||||
|
||||
//just moves the shuttle from A to B, if it can be moved
|
||||
/datum/shuttle/proc/move(var/area/origin,var/area/destination)
|
||||
|
||||
//world << "move_shuttle() called for [shuttle_tag] leaving [origin] en route to [destination]."
|
||||
if(isnull(location))
|
||||
return
|
||||
|
||||
var/area/area_going_to
|
||||
if(destination)
|
||||
//world << "Using supplied destination [destination]."
|
||||
area_going_to = destination
|
||||
else
|
||||
//world << "Using controller value [(cur_location[shuttle_tag] == 1 ? areas_station[shuttle_tag] : areas_offsite[shuttle_tag])]."
|
||||
area_going_to = (location == 1 ? area_station : area_offsite)
|
||||
|
||||
var/area/area_coming_from
|
||||
if(origin)
|
||||
//world << "Using supplied origin [origin]."
|
||||
area_coming_from = origin
|
||||
else
|
||||
//world << "Using controller value [(cur_location[shuttle_tag] == 1 ? areas_offsite[shuttle_tag] : areas_station[shuttle_tag])]."
|
||||
area_coming_from = (location == 1 ? area_offsite : area_station)
|
||||
|
||||
//world << "area_coming_from: [area_coming_from]"
|
||||
//world << "area_going_to: [area_going_to]"
|
||||
|
||||
if(area_coming_from == area_going_to)
|
||||
//world << "cancelling move, shuttle will overlap."
|
||||
return
|
||||
|
||||
moving_status = SHUTTLE_INTRANSIT
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in area_going_to)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
for(var/turf/T in dstturfs)
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
for(var/mob/living/carbon/bug in area_going_to)
|
||||
bug.gib()
|
||||
|
||||
for(var/mob/living/simple_animal/pest in area_going_to)
|
||||
pest.gib()
|
||||
|
||||
area_coming_from.move_contents_to(area_going_to)
|
||||
|
||||
location = !location //this needs to change.
|
||||
|
||||
for(var/mob/M in area_going_to)
|
||||
if(M.client)
|
||||
spawn(0)
|
||||
if(M.buckled)
|
||||
M << "\red Sudden acceleration presses you into your chair!"
|
||||
shake_camera(M, 3, 1)
|
||||
else
|
||||
M << "\red The floor lurches beneath you!"
|
||||
shake_camera(M, 10, 1)
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(!M.buckled)
|
||||
M.Weaken(3)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
/proc/setup_shuttles()
|
||||
shuttles = list()
|
||||
|
||||
var/datum/shuttle/shuttle
|
||||
|
||||
//Supply and escape shuttles.
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.location = 1
|
||||
shuttle.area_offsite = locate(/area/supply/dock)
|
||||
shuttle.area_station = locate(/area/supply/station)
|
||||
shuttles["Supply"] = shuttle
|
||||
|
||||
// Admin shuttles.
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.location = 1
|
||||
shuttle.area_offsite = locate(/area/shuttle/transport1/centcom)
|
||||
shuttle.area_station = locate(/area/shuttle/transport1/station)
|
||||
shuttles["Centcom"] = shuttle
|
||||
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.location = 1
|
||||
shuttle.area_offsite = locate(/area/shuttle/administration/centcom)
|
||||
shuttle.area_station = locate(/area/shuttle/administration/station)
|
||||
shuttles["Administration"] = shuttle
|
||||
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.area_offsite = locate(/area/shuttle/alien/base)
|
||||
shuttle.area_station = locate(/area/shuttle/alien/mine)
|
||||
shuttles["Alien"] = shuttle
|
||||
|
||||
// Public shuttles
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.location = 1
|
||||
shuttle.warmup_time = 10
|
||||
shuttle.area_offsite = locate(/area/shuttle/constructionsite/site)
|
||||
shuttle.area_station = locate(/area/shuttle/constructionsite/station)
|
||||
shuttles["Engineering"] = shuttle
|
||||
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.warmup_time = 10
|
||||
shuttle.area_offsite = locate(/area/shuttle/mining/outpost)
|
||||
shuttle.area_station = locate(/area/shuttle/mining/station)
|
||||
shuttles["Mining"] = shuttle
|
||||
|
||||
shuttle = new/datum/shuttle()
|
||||
shuttle.warmup_time = 10
|
||||
shuttle.area_offsite = locate(/area/shuttle/research/outpost)
|
||||
shuttle.area_station = locate(/area/shuttle/research/station)
|
||||
shuttle.docking_controller_tag = "research_shuttle"
|
||||
shuttle.dock_target_station = "research_dock_airlock"
|
||||
shuttle.dock_target_offsite = "research_outpost_dock"
|
||||
shuttles["Research"] = shuttle
|
||||
|
||||
//Vox Shuttle.
|
||||
var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle()
|
||||
VS.origin = /area/shuttle/vox/station
|
||||
|
||||
VS.destinations = list(
|
||||
"NSS Cyberiad" = /area/vox_station/northwest_solars
|
||||
)
|
||||
|
||||
VS.announcer = "NSV Icarus"
|
||||
VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
|
||||
VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
|
||||
VS.interim = /area/vox_station/transit
|
||||
|
||||
VS.location = 1
|
||||
VS.warmup_time = 10
|
||||
shuttles["Vox Skipjack"] = VS
|
||||
|
||||
//Nuke Ops shuttle.
|
||||
var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle()
|
||||
MS.origin = /area/syndicate_station/start
|
||||
|
||||
MS.destinations = list(
|
||||
"Northwest of the station" = /area/syndicate_station/northwest,
|
||||
"North of the station" = /area/syndicate_station/north,
|
||||
"Northeast of the station" = /area/syndicate_station/northeast,
|
||||
"Southwest of the station" = /area/syndicate_station/southwest,
|
||||
"South of the station" = /area/syndicate_station/south,
|
||||
"Southeast of the station" = /area/syndicate_station/southeast,
|
||||
"Telecomms Satellite" = /area/syndicate_station/commssat,
|
||||
"Mining Asteroid" = /area/syndicate_station/mining
|
||||
)
|
||||
|
||||
MS.announcer = "NSV Icarus"
|
||||
MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
|
||||
MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance."
|
||||
MS.interim = /area/syndicate_station/transit
|
||||
|
||||
MS.location = 1
|
||||
MS.warmup_time = 10
|
||||
shuttles["Syndicate"] = MS
|
||||
|
||||
|
||||
/proc/setup_shuttle_docks()
|
||||
var/datum/shuttle/shuttle
|
||||
var/list/dock_controller_map = list() //so we only have to iterate once through each list
|
||||
|
||||
for (var/shuttle_tag in shuttles)
|
||||
shuttle = shuttles[shuttle_tag]
|
||||
if (shuttle.docking_controller_tag)
|
||||
dock_controller_map[shuttle.docking_controller_tag] = shuttle
|
||||
|
||||
//search for the controllers, if we have one.
|
||||
if (dock_controller_map.len)
|
||||
for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment
|
||||
if (istype(C.program, /datum/computer/file/embedded_program/docking) && C.id_tag in dock_controller_map)
|
||||
shuttle = dock_controller_map[C.id_tag]
|
||||
shuttle.docking_controller = C.program
|
||||
dock_controller_map -= C.id_tag
|
||||
|
||||
//sanity check
|
||||
if (dock_controller_map.len)
|
||||
var/dat = ""
|
||||
for (var/dock_tag in dock_controller_map)
|
||||
dat += "\"[dock_tag]\", "
|
||||
world << "/red /b warning: shuttles with docking tags [dat] could not find their controllers!"
|
||||
|
||||
//makes all shuttles docked to something at round start go into the docked state
|
||||
for (var/shuttle_tag in shuttles)
|
||||
shuttle = shuttles[shuttle_tag]
|
||||
shuttle.dock()
|
||||
|
||||
@@ -0,0 +1,209 @@
|
||||
#define IDLE_STATE 0
|
||||
#define WAIT_LAUNCH 1
|
||||
#define WAIT_ARRIVE 2
|
||||
#define WAIT_FINISH 3
|
||||
|
||||
|
||||
/*
|
||||
I dont really like how much this manipulates shuttle it's docking controller, as it makes this code
|
||||
depend a lot on their current implementation, and also having var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
everywhere is kind of messy. I'm probably going to end up creating a subtype of shuttle called ferry_shuttle
|
||||
and move a lot of this into there when I get the time.
|
||||
*/
|
||||
/obj/machinery/computer/shuttle_control
|
||||
name = "shuttle control console"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_engine)
|
||||
circuit = "/obj/item/weapon/circuitboard/engineering_shuttle"
|
||||
|
||||
var/shuttle_tag // Used to coordinate data in shuttle controller.
|
||||
var/hacked = 0 // Has been emagged, no access restrictions.
|
||||
|
||||
var/process_state = IDLE_STATE
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/launch_shuttle()
|
||||
if (!can_launch()) return
|
||||
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
shuttle.in_use = 1 //obtain an exclusive lock on the shuttle
|
||||
|
||||
process_state = WAIT_LAUNCH
|
||||
shuttle.undock()
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/cancel_launch()
|
||||
if (!can_cancel()) return
|
||||
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
shuttle.moving_status = SHUTTLE_IDLE
|
||||
process_state = WAIT_FINISH
|
||||
|
||||
if (shuttle.docking_controller && !shuttle.docking_controller.undocked())
|
||||
shuttle.docking_controller.force_undock()
|
||||
shuttle.dock()
|
||||
|
||||
shuttle.in_use = 0
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/toggle_override()
|
||||
if (!can_override()) return
|
||||
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (shuttle.docking_controller.override_enabled)
|
||||
shuttle.docking_controller.disable_override()
|
||||
else
|
||||
shuttle.docking_controller.enable_override()
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/can_launch()
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (shuttle.moving_status != SHUTTLE_IDLE)
|
||||
return 0
|
||||
|
||||
if (shuttle.in_use && !skip_checks())
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/can_cancel()
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (shuttle.moving_status == SHUTTLE_WARMUP || process_state == WAIT_LAUNCH)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/can_override()
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (shuttle.docking_controller && (!shuttle.docking_controller.override_enabled || !shuttle.in_use))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//TODO move this stuff into the shuttle datum itself, instead of manipulating the shuttle's members
|
||||
/obj/machinery/computer/shuttle_control/process()
|
||||
if (!shuttles || !(shuttle_tag in shuttles))
|
||||
return
|
||||
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
switch(process_state)
|
||||
if (WAIT_LAUNCH)
|
||||
if (skip_checks() || shuttle.docking_controller.can_launch())
|
||||
shuttle.short_jump()
|
||||
if (shuttle.docking_controller && !shuttle.docking_controller.undocked())
|
||||
shuttle.docking_controller.force_undock()
|
||||
process_state = WAIT_ARRIVE
|
||||
if (WAIT_ARRIVE)
|
||||
if (shuttle.moving_status == SHUTTLE_IDLE)
|
||||
shuttle.dock()
|
||||
process_state = WAIT_FINISH
|
||||
if (WAIT_FINISH)
|
||||
if (skip_checks() || shuttle.docking_controller.docked())
|
||||
process_state = IDLE_STATE
|
||||
shuttle.in_use = 0 //release lock
|
||||
|
||||
/obj/machinery/computer/shuttle_control/proc/skip_checks()
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (!shuttle.docking_controller || !shuttle.current_dock_target())
|
||||
return 1 //shuttles without docking controllers or at locations without docking ports act like old-style shuttles
|
||||
|
||||
return shuttle.docking_controller.override_enabled //override pretty much lets you do whatever you want
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle_control/Del()
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
if (process_state != IDLE_STATE)
|
||||
shuttle.in_use = 0 //shuttle may not dock properly if this gets deleted while in transit, but its not a big deal
|
||||
|
||||
/obj/machinery/computer/shuttle_control/attack_hand(user as mob)
|
||||
if(..(user))
|
||||
return
|
||||
//src.add_fingerprint(user) //shouldn't need fingerprints just for looking at it.
|
||||
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/computer/shuttle_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
var/data[0]
|
||||
var/datum/shuttle/shuttle = shuttles[shuttle_tag]
|
||||
|
||||
var/shuttle_state
|
||||
switch(shuttle.moving_status)
|
||||
if(SHUTTLE_IDLE) shuttle_state = "idle"
|
||||
if(SHUTTLE_WARMUP) shuttle_state = "warmup"
|
||||
if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit"
|
||||
|
||||
var/shuttle_status
|
||||
switch (process_state)
|
||||
if(IDLE_STATE)
|
||||
if (shuttle.in_use)
|
||||
shuttle_status = "Busy."
|
||||
else if (!shuttle.location)
|
||||
shuttle_status = "Standing-by at station."
|
||||
else
|
||||
shuttle_status = "Standing-by at offsite location."
|
||||
if(WAIT_LAUNCH)
|
||||
shuttle_status = "Shuttle has recieved command and will depart shortly."
|
||||
if(WAIT_ARRIVE)
|
||||
shuttle_status = "Proceeding to destination."
|
||||
if(WAIT_FINISH)
|
||||
shuttle_status = "Arriving at destination now."
|
||||
|
||||
data = list(
|
||||
"shuttle_status" = shuttle_status,
|
||||
"shuttle_state" = shuttle_state,
|
||||
"has_docking" = shuttle.docking_controller? 1 : 0,
|
||||
"docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null,
|
||||
"override_enabled" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null,
|
||||
"can_launch" = can_launch(),
|
||||
"can_cancel" = can_cancel(),
|
||||
"can_override" = can_override(),
|
||||
)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "shuttle_control_console.tmpl", "[shuttle_tag] Shuttle Control", 470, 310)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
//TODO: Canceling launches, dock overrides using the console, forcing dock/undock
|
||||
/obj/machinery/computer/shuttle_control/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
|
||||
if(href_list["move"])
|
||||
launch_shuttle()
|
||||
else if(href_list["cancel"])
|
||||
cancel_launch()
|
||||
else if(href_list["override"])
|
||||
toggle_override()
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle_control/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/card/emag))
|
||||
src.req_access = list()
|
||||
hacked = 1
|
||||
usr << "You short out the console's ID checking system. It's now available to everyone!"
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj)
|
||||
visible_message("[Proj] ricochets off [src]!")
|
||||
|
||||
#undef IDLE_STATE
|
||||
#undef WAIT_LAUNCH
|
||||
#undef WAIT_ARRIVE
|
||||
#undef WAIT_FINISH
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
//This is a holder for things like the Vox and Nuke shuttle.
|
||||
/datum/shuttle/multi_shuttle
|
||||
|
||||
var/cloaked = 1
|
||||
var/at_origin = 1
|
||||
var/move_time = 240
|
||||
var/cooldown = 200
|
||||
var/last_move = 0
|
||||
|
||||
var/announcer
|
||||
var/arrival_message
|
||||
var/departure_message
|
||||
|
||||
var/area/interim
|
||||
var/area/last_departed
|
||||
var/list/destinations
|
||||
var/area/origin
|
||||
var/return_warning = 0
|
||||
|
||||
/datum/shuttle/multi_shuttle/New()
|
||||
..()
|
||||
if(origin) last_departed = origin
|
||||
|
||||
/datum/shuttle/multi_shuttle/proc/announce_departure()
|
||||
|
||||
if(cloaked || isnull(departure_message))
|
||||
return
|
||||
|
||||
command_alert(departure_message,(announcer ? announcer : "Central Command"))
|
||||
|
||||
/datum/shuttle/multi_shuttle/proc/announce_arrival()
|
||||
|
||||
if(cloaked || isnull(arrival_message))
|
||||
return
|
||||
|
||||
command_alert(arrival_message,(announcer ? announcer : "Central Command"))
|
||||
|
||||
/obj/machinery/computer/shuttle_control/multi
|
||||
icon_state = "syndishuttle"
|
||||
|
||||
/obj/machinery/computer/shuttle_control/multi/attack_hand(user as mob)
|
||||
|
||||
if(..(user))
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
|
||||
var/datum/shuttle/multi_shuttle/MS = shuttles[shuttle_tag]
|
||||
if(!istype(MS)) return
|
||||
|
||||
var/dat
|
||||
dat = "<center>[shuttle_tag] Ship Control<hr>"
|
||||
|
||||
|
||||
if(MS.moving_status != SHUTTLE_IDLE)
|
||||
dat += "Location: <font color='red'>Moving</font> <br>"
|
||||
else
|
||||
var/area/areacheck = get_area(src)
|
||||
dat += "Location: [areacheck.name]<br>"
|
||||
|
||||
if((MS.last_move + MS.cooldown) > world.time)
|
||||
dat += "<font color='red'>Engines charging.</font><br>"
|
||||
else
|
||||
dat += "<font color='green'>Engines ready.</font><br>"
|
||||
|
||||
dat += "<br><b><A href='?src=\ref[src];toggle_cloak=[1]'>Toggle cloaking field</A></b><br>"
|
||||
dat += "<b><A href='?src=\ref[src];move_multi=[1]'>Move ship</A></b><br>"
|
||||
dat += "<b><A href='?src=\ref[src];start=[1]'>Return to base</A></b></center>"
|
||||
|
||||
user << browse("[dat]", "window=[shuttle_tag]shuttlecontrol;size=300x600")
|
||||
|
||||
/obj/machinery/computer/shuttle_control/multi/Topic(href, href_list)
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
var/datum/shuttle/multi_shuttle/MS = shuttles[shuttle_tag]
|
||||
if(!istype(MS)) return
|
||||
|
||||
if (MS.moving_status != SHUTTLE_IDLE)
|
||||
usr << "\blue [shuttle_tag] vessel is moving."
|
||||
return
|
||||
|
||||
if((MS.last_move + MS.cooldown) > world.time)
|
||||
usr << "\red The ship is inoperable while the engines are charging."
|
||||
return
|
||||
|
||||
if(href_list["start"])
|
||||
|
||||
if(MS.at_origin)
|
||||
usr << "\red You are already at your home base."
|
||||
return
|
||||
|
||||
if(!MS.return_warning)
|
||||
usr << "\red Returning to your home base will end your mission. If you are sure, press the button again."
|
||||
//TODO: Actually end the mission.
|
||||
MS.return_warning = 1
|
||||
return
|
||||
|
||||
MS.long_jump(MS.last_departed,MS.origin,MS.interim,MS.move_time)
|
||||
MS.last_departed = MS.origin
|
||||
MS.at_origin = 1
|
||||
|
||||
if(href_list["toggle_cloak"])
|
||||
|
||||
MS.cloaked = !MS.cloaked
|
||||
usr << "\red Ship stealth systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival."
|
||||
|
||||
if(href_list["move_multi"])
|
||||
|
||||
var/choice = input("Select a destination.") as null|anything in MS.destinations
|
||||
if(!choice) return
|
||||
|
||||
usr << "\blue [shuttle_tag] main computer recieved message."
|
||||
|
||||
if(MS.at_origin)
|
||||
MS.announce_arrival()
|
||||
MS.last_departed = MS.origin
|
||||
MS.at_origin = 0
|
||||
|
||||
|
||||
MS.long_jump(MS.last_departed,MS.destinations[choice],MS.interim,MS.move_time)
|
||||
MS.last_departed = MS.destinations[choice]
|
||||
return
|
||||
|
||||
else if(choice == MS.origin)
|
||||
|
||||
MS.announce_departure()
|
||||
|
||||
MS.short_jump(locate(MS.last_departed),locate(MS.destinations[choice]))
|
||||
MS.last_departed = MS.destinations[choice]
|
||||
|
||||
updateUsrDialog()
|
||||
@@ -797,5 +797,5 @@ var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/mon
|
||||
stage = 1
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob << "<span class = 'notice'> You feel optimistic!</span>"
|
||||
if (mob.reagents.get_reagent_amount("tricordazine") < 1)
|
||||
mob.reagents.add_reagent("tricordazine", 1)
|
||||
if (mob.reagents.get_reagent_amount("tricordrazine") < 1)
|
||||
mob.reagents.add_reagent("tricordrazine", 1)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+12815
-12774
File diff suppressed because it is too large
Load Diff
+14
-2
@@ -174,8 +174,20 @@ h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
.bad {
|
||||
color: #ee0000;
|
||||
font-weight: bold;
|
||||
color: #ee0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.idle {
|
||||
color: #272727;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.redBackground {
|
||||
background: #ea0000;
|
||||
}
|
||||
.yellowBackground {
|
||||
background: #cacc00;
|
||||
}
|
||||
.highlight {
|
||||
color: #8BA5C4;
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Docking Port Status:
|
||||
</div>
|
||||
{{if docking_status == "docked"}}
|
||||
<div class="itemContent" style="float:left">
|
||||
{{if airlock_disabled}}
|
||||
<span class="good" style="float:left">DOCKED</span>
|
||||
{{else}}
|
||||
<span class="bad" style="float:left">DOCKED-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
<span style="float:right">
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, airlock_disabled ? null : 'redBackground')}}
|
||||
</span>
|
||||
</div>
|
||||
{{else docking_status == "docking"}}
|
||||
<div class="itemContent" style="float:left">
|
||||
{{if airlock_disabled}}
|
||||
<span class="average" style="float:left">DOCKING</span>
|
||||
{{else}}
|
||||
<span class="bad" style="float:left">DOCKING-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
<span style="float:right">
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, airlock_disabled ? null : 'redBackground')}}
|
||||
</span>
|
||||
</div>
|
||||
{{else docking_status == "undocking"}}
|
||||
<div class="itemContent" style="float:left">
|
||||
{{if airlock_disabled}}
|
||||
<span class="average" style="float:left">UNDOCKING</span>
|
||||
{{else}}
|
||||
<span class="bad" style="float:left">UNDOCKING-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
<span style="float:right">
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, airlock_disabled ? null : 'redBackground')}}
|
||||
</span>
|
||||
</div>
|
||||
{{else docking_status == "undocked"}}
|
||||
<span class="idle">NOT IN USE</span>
|
||||
{{else}}
|
||||
<span class="bad">ERROR</span>
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, airlock_disabled ? null : 'redBackground')}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Chamber Pressure:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:~displayBar(chamber_pressure, 0, 200, chamber_pressure < 80 || chamber_pressure > 120 ? 'bad' : chamber_pressure < 95 || chamber_pressure > 110 ? 'average' : 'good')}}
|
||||
<div class="statusValue">
|
||||
{{:chamber_pressure}} kPa
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%">
|
||||
{{:~link('Cycle to Exterior', 'arrowthickstop-1-w', {'command' : 'cycle_ext'}, (processing || airlock_disabled) ? 'disabled' : null)}}
|
||||
{{:~link('Cycle to Interior', 'arrowthickstop-1-e', {'command' : 'cycle_int'}, (processing || airlock_disabled) ? 'disabled' : null)}}
|
||||
</div>
|
||||
<div class="itemContent" style="padding-top: 2px; width: 100%">
|
||||
{{if airlock_disabled}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_ext'}, 'disabled', null)}}
|
||||
{{:~link('Force interior door', 'alert', {'command' : 'force_int'}, 'disabled', null)}}
|
||||
{{else}}
|
||||
{{if interior_status.state == "open"}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_ext'}, null, 'redBackground')}}
|
||||
{{else}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_ext'}, null, processing ? 'yellowBackground' : null)}}
|
||||
{{/if}}
|
||||
{{if exterior_status.state == "open"}}
|
||||
{{:~link('Force interior door', 'alert', {'command' : 'force_int'}, null, 'redBackground')}}
|
||||
{{else}}
|
||||
{{:~link('Force interior door', 'alert', {'command' : 'force_int'}, null, processing ? 'yellowBackground' : null)}}
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px; width: 100%">
|
||||
{{:~link('Abort', 'cancel', {'command' : 'abort'}, (processing && !airlock_disabled) ? null : 'disabled', (processing && !airlock_disabled) ? 'redBackground' : null)}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,73 @@
|
||||
<h3>Shuttle Status</h3>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
{{:shuttle_status}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Bluespace Drive:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if shuttle_state == "idle"}}
|
||||
<span class="idle">IDLE</span>
|
||||
{{else shuttle_state == "warmup"}}
|
||||
<span style="font-weight: bold;color: #336699">SPINNING UP</span>
|
||||
{{else shuttle_state == "in_transit"}}
|
||||
<span style="font-weight: bold;color: #336699">ENGAGED</span>
|
||||
{{else}}
|
||||
<span class="bad">ERROR</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{if has_docking}}
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Docking Status:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if docking_status == "docked"}}
|
||||
<span class="good">DOCKED</span>
|
||||
{{else docking_status == "docking"}}
|
||||
<span class="average">DOCKING</span>
|
||||
{{else docking_status == "undocking"}}
|
||||
<span class="average">UNDOCKING</span>
|
||||
{{else docking_status == "undocked"}}
|
||||
<span class="idle">UNDOCKED</span>
|
||||
{{else}}
|
||||
<span class="bad">ERROR</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Docking Override:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if override_enabled}}
|
||||
<span class="bad">ENABLED</span>
|
||||
{{else}}
|
||||
<span class="good">SAFE</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<h3>Shuttle Control</h3>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="padding-top: 2px; width: 100%">
|
||||
{{:~link('Launch Shuttle', 'arrowthickstop-1-e', {'move' : '1'}, can_launch? null : 'disabled' , null)}}
|
||||
{{:~link('Cancel Launch', 'cancel', {'cancel' : '1'}, can_cancel? null : 'disabled' , null)}}
|
||||
{{if has_docking}}
|
||||
{{:~link('Override', 'alert', {'override' : '1'}, can_override? null : 'disabled' , (can_override && override_enabled)? 'redBackground' : null)}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,36 @@
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Chamber Pressure:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{:~displayBar(chamber_pressure, 0, 200, chamber_pressure < 80 || chamber_pressure > 120 ? 'bad' : chamber_pressure < 95 || chamber_pressure > 110 ? 'average' : 'good')}}
|
||||
<div class="statusValue">
|
||||
{{:chamber_pressure}} kPa
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%">
|
||||
{{:~link('Cycle to Exterior', 'arrowthickstop-1-w', {'command' : 'cycle_ext'}, processing ? 'disabled' : null)}}
|
||||
{{:~link('Cycle to Interior', 'arrowthickstop-1-e', {'command' : 'cycle_int'}, processing ? 'disabled' : null)}}
|
||||
</div>
|
||||
<div class="itemContent" style="padding-top: 2px; width: 100%">
|
||||
{{if interior_status.state == "open"}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_ext'}, null, 'redBackground')}}
|
||||
{{else}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_ext'}, null, processing ? 'yellowBackground' : null)}}
|
||||
{{/if}}
|
||||
{{if exterior_status.state == "open"}}
|
||||
{{:~link('Force interior door', 'alert', {'command' : 'force_int'}, null, 'redBackground')}}
|
||||
{{else}}
|
||||
{{:~link('Force interior door', 'alert', {'command' : 'force_int'}, null, processing ? 'yellowBackground' : null)}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px; width: 100%">
|
||||
{{:~link('Abort', 'cancel', {'command' : 'abort'}, processing ? null : 'disabled', processing ? 'redBackground' : null)}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemLabel">
|
||||
Docking Port Status:
|
||||
</div>
|
||||
<div class="itemContent">
|
||||
{{if docking_status == "docked"}}
|
||||
{{if !override_enabled}}
|
||||
<span class="good">DOCKED</span>
|
||||
{{else}}
|
||||
<span class="bad">DOCKED-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
{{else docking_status == "docking"}}
|
||||
{{if !override_enabled}}
|
||||
<span class="average">DOCKING</span>
|
||||
{{else}}
|
||||
<span class="bad">DOCKING-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
{{else docking_status == "undocking"}}
|
||||
{{if !override_enabled}}
|
||||
<span class="average">UNDOCKING</span>
|
||||
{{else}}
|
||||
<span class="bad">UNDOCKING-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
{{else docking_status == "undocked"}}
|
||||
{{if !override_enabled}}
|
||||
<span class="idle">UNDOCKED</span>
|
||||
{{else}}
|
||||
<span class="bad">UNDOCKED-OVERRIDE ENABLED</span>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
<span class="bad">ERROR</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item" style="padding-top: 10px">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="padding-top: 2px; width: 100%">
|
||||
{{if docking_status == "docked"}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_door'}, override_enabled ? null : 'disabled', null)}}
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, override_enabled ? 'redBackground' : null)}}
|
||||
{{else}}
|
||||
{{:~link('Force exterior door', 'alert', {'command' : 'force_door'}, override_enabled ? null : 'disabled', override_enabled? 'redBackground' : null)}}
|
||||
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, override_enabled ? 'redBackground' : 'yellowBackground')}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user