mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 15:42:35 +00:00
a small addition
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
var/global/ntnrc_uid = 0
|
var/global/ntnrc_uid = 0
|
||||||
/datum/ntnet_conversation/
|
/datum/ntnet_conversation
|
||||||
var/id = null
|
var/id
|
||||||
var/title = "Untitled Conversation"
|
var/title = "Untitled Conversation"
|
||||||
var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator,
|
var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator,
|
||||||
var/list/messages = list()
|
var/list/messages = list()
|
||||||
@@ -18,8 +18,14 @@ var/global/ntnrc_uid = 0
|
|||||||
operator = "NanoTrasen Information Technology Division" // assign a fake operator
|
operator = "NanoTrasen Information Technology Division" // assign a fake operator
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/ntnet_conversation/proc/add_message(var/message, var/username, var/mob/user)
|
/datum/ntnet_conversation/proc/add_message(var/message, var/username, var/mob/user, var/reply_ref)
|
||||||
log_ntirc("[user.client.ckey]/([username]) : [message]",ckey=key_name(user),conversation=title)
|
log_ntirc("[user.client.ckey]/([username]) : [message]", ckey=key_name(user), conversation=title)
|
||||||
|
|
||||||
|
for(var/datum/computer_file/program/chatclient/C in clients)
|
||||||
|
if(C.username == username || !C.computer.screen_on)
|
||||||
|
continue
|
||||||
|
if(C.computer.active_program == C || (C in C.computer.idle_threads))
|
||||||
|
C.computer.output_message(FONT_SMALL("<b>([title]) [username]:</b> [message]"), 0)
|
||||||
|
|
||||||
message = "[worldtime2text()] [username]: [message]"
|
message = "[worldtime2text()] [username]: [message]"
|
||||||
messages.Add(message)
|
messages.Add(message)
|
||||||
@@ -45,6 +51,12 @@ var/global/ntnrc_uid = 0
|
|||||||
if(!operator)
|
if(!operator)
|
||||||
changeop(C)
|
changeop(C)
|
||||||
|
|
||||||
|
for(var/datum/computer_file/program/chatclient/CC in clients)
|
||||||
|
if(CC == C || !CC.computer.screen_on)
|
||||||
|
continue
|
||||||
|
if(CC.computer.active_program == CC || (CC in CC.computer.idle_threads))
|
||||||
|
CC.computer.output_message(FONT_SMALL("<b>([title]) A new client ([C.username]) has entered the chat.</b>"), 0)
|
||||||
|
|
||||||
/datum/ntnet_conversation/proc/remove_client(var/datum/computer_file/program/chatclient/C)
|
/datum/ntnet_conversation/proc/remove_client(var/datum/computer_file/program/chatclient/C)
|
||||||
if(!istype(C) || !(C in clients))
|
if(!istype(C) || !(C in clients))
|
||||||
return
|
return
|
||||||
@@ -57,6 +69,12 @@ var/global/ntnrc_uid = 0
|
|||||||
var/datum/computer_file/program/chatclient/newop = pick(clients)
|
var/datum/computer_file/program/chatclient/newop = pick(clients)
|
||||||
changeop(newop)
|
changeop(newop)
|
||||||
|
|
||||||
|
for(var/datum/computer_file/program/chatclient/CC in clients)
|
||||||
|
if(CC == C || !CC.computer.screen_on)
|
||||||
|
continue
|
||||||
|
if(CC.computer.active_program == CC || (CC in CC.computer.idle_threads))
|
||||||
|
CC.computer.output_message(FONT_SMALL("<b>([title]) A client ([C.username]) has left the chat.</b>"), 0)
|
||||||
|
|
||||||
|
|
||||||
/datum/ntnet_conversation/proc/changeop(var/datum/computer_file/program/chatclient/newop)
|
/datum/ntnet_conversation/proc/changeop(var/datum/computer_file/program/chatclient/newop)
|
||||||
if(istype(newop))
|
if(istype(newop))
|
||||||
@@ -69,3 +87,9 @@ var/global/ntnrc_uid = 0
|
|||||||
|
|
||||||
add_status_message("[client.username] has changed channel title from [title] to [newtitle]")
|
add_status_message("[client.username] has changed channel title from [title] to [newtitle]")
|
||||||
title = newtitle
|
title = newtitle
|
||||||
|
|
||||||
|
for(var/datum/computer_file/program/chatclient/C in clients)
|
||||||
|
if(C == client || !C.computer.screen_on)
|
||||||
|
continue
|
||||||
|
if(C.computer.active_program == src || (C in C.computer.idle_threads))
|
||||||
|
C.computer.output_message(FONT_SMALL("([title]) A new client ([C.username]) has entered the chat."), 0)
|
||||||
@@ -2,7 +2,7 @@ var/global/datum/ntnet/ntnet_global = new()
|
|||||||
|
|
||||||
|
|
||||||
// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this.
|
// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this.
|
||||||
/datum/ntnet/
|
/datum/ntnet
|
||||||
var/list/relays = list()
|
var/list/relays = list()
|
||||||
var/list/logs = list()
|
var/list/logs = list()
|
||||||
var/list/available_station_software = list()
|
var/list/available_station_software = list()
|
||||||
@@ -17,14 +17,14 @@ var/global/datum/ntnet/ntnet_global = new()
|
|||||||
var/setting_maxlogcount = 100
|
var/setting_maxlogcount = 100
|
||||||
|
|
||||||
// These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
|
// These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
|
||||||
var/setting_softwaredownload = 1
|
var/setting_softwaredownload = TRUE
|
||||||
var/setting_peertopeer = 1
|
var/setting_peertopeer = TRUE
|
||||||
var/setting_communication = 1
|
var/setting_communication = TRUE
|
||||||
var/setting_systemcontrol = 1
|
var/setting_systemcontrol = TRUE
|
||||||
var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status.
|
var/setting_disabled = FALSE // Setting to 1 will disable all wireless, independently on relays status.
|
||||||
|
|
||||||
var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled
|
var/intrusion_detection_enabled = TRUE // Whether the IDS warning system is enabled
|
||||||
var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software.
|
var/intrusion_detection_alarm = FALSE // Set when there is an IDS warning due to malicious (antag) software.
|
||||||
|
|
||||||
|
|
||||||
// If new NTNet datum is spawned, it replaces the old one.
|
// If new NTNet datum is spawned, it replaces the old one.
|
||||||
@@ -62,18 +62,18 @@ var/global/datum/ntnet/ntnet_global = new()
|
|||||||
// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled.
|
// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled.
|
||||||
/datum/ntnet/proc/check_function(var/specific_action = 0)
|
/datum/ntnet/proc/check_function(var/specific_action = 0)
|
||||||
if(!relays || !relays.len) // No relays found. NTNet is down
|
if(!relays || !relays.len) // No relays found. NTNet is down
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
var/operating = 0
|
var/operating = FALSE
|
||||||
|
|
||||||
// Check all relays. If we have at least one working relay, network is up.
|
// Check all relays. If we have at least one working relay, network is up.
|
||||||
for(var/obj/machinery/ntnet_relay/R in relays)
|
for(var/obj/machinery/ntnet_relay/R in relays)
|
||||||
if(R.operable())
|
if(R.operable())
|
||||||
operating = 1
|
operating = TRUE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(setting_disabled)
|
if(setting_disabled)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(specific_action == NTNET_SOFTWAREDOWNLOAD)
|
if(specific_action == NTNET_SOFTWAREDOWNLOAD)
|
||||||
return (operating && setting_softwaredownload)
|
return (operating && setting_softwaredownload)
|
||||||
@@ -123,7 +123,7 @@ var/global/datum/ntnet/ntnet_global = new()
|
|||||||
|
|
||||||
// Resets the IDS alarm
|
// Resets the IDS alarm
|
||||||
/datum/ntnet/proc/resetIDS()
|
/datum/ntnet/proc/resetIDS()
|
||||||
intrusion_detection_alarm = 0
|
intrusion_detection_alarm = FALSE
|
||||||
|
|
||||||
/datum/ntnet/proc/toggleIDS()
|
/datum/ntnet/proc/toggleIDS()
|
||||||
resetIDS()
|
resetIDS()
|
||||||
@@ -137,7 +137,7 @@ var/global/datum/ntnet/ntnet_global = new()
|
|||||||
// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks.
|
// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks.
|
||||||
/datum/ntnet/proc/update_max_log_count(var/lognumber)
|
/datum/ntnet/proc/update_max_log_count(var/lognumber)
|
||||||
if(!lognumber)
|
if(!lognumber)
|
||||||
return 0
|
return FALSE
|
||||||
// Trim the value if necessary
|
// Trim the value if necessary
|
||||||
lognumber = between(MIN_NTNET_LOGS, lognumber, MAX_NTNET_LOGS)
|
lognumber = between(MIN_NTNET_LOGS, lognumber, MAX_NTNET_LOGS)
|
||||||
setting_maxlogcount = lognumber
|
setting_maxlogcount = lognumber
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
idle_power_usage = 100
|
idle_power_usage = 100
|
||||||
icon_state = "ntnet"
|
icon_state = "ntnet"
|
||||||
icon = 'icons/obj/machines/telecomms.dmi'
|
icon = 'icons/obj/machines/telecomms.dmi'
|
||||||
anchored = 1
|
anchored = TRUE
|
||||||
density = 1
|
density = TRUE
|
||||||
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
|
var/datum/ntnet/NTNet // This is mostly for backwards reference and to allow varedit modifications from ingame.
|
||||||
var/enabled = 1 // Set to 0 if the relay was turned off
|
var/enabled = TRUE // Set to FALSE if the relay was turned off
|
||||||
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
|
var/dos_failure = FALSE // Set to TRUE if the relay failed due to (D)DoS attack
|
||||||
var/list/dos_sources = list() // Backwards reference for qdel() stuff
|
var/list/dos_sources = list() // Backwards reference for qdel() stuff
|
||||||
|
|
||||||
// Denial of Service attack variables
|
// Denial of Service attack variables
|
||||||
@@ -27,30 +27,24 @@
|
|||||||
// TODO: Implement more logic here. For now it's only a placeholder.
|
// TODO: Implement more logic here. For now it's only a placeholder.
|
||||||
/obj/machinery/ntnet_relay/operable()
|
/obj/machinery/ntnet_relay/operable()
|
||||||
if(!..(EMPED))
|
if(!..(EMPED))
|
||||||
return 0
|
return FALSE
|
||||||
if(dos_failure)
|
if(dos_failure)
|
||||||
return 0
|
return FALSE
|
||||||
if(!enabled)
|
if(!enabled)
|
||||||
return 0
|
return FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/obj/machinery/ntnet_relay/update_icon()
|
/obj/machinery/ntnet_relay/update_icon()
|
||||||
icon_state = initial(icon_state)
|
icon_state = initial(icon_state)
|
||||||
|
|
||||||
cut_overlays()
|
cut_overlays()
|
||||||
|
if(panel_open)
|
||||||
if (panel_open)
|
|
||||||
icon_state += "_o"
|
icon_state += "_o"
|
||||||
|
if(!operable())
|
||||||
if (!operable())
|
|
||||||
icon_state += "_off"
|
icon_state += "_off"
|
||||||
|
else if(dos_failure)
|
||||||
else if (dos_failure)
|
|
||||||
add_overlay("ntnet_o_problem")
|
add_overlay("ntnet_o_problem")
|
||||||
|
else if(!enabled)
|
||||||
else if (!enabled)
|
|
||||||
add_overlay("ntnet_o_error")
|
add_overlay("ntnet_o_error")
|
||||||
|
|
||||||
else
|
else
|
||||||
add_overlay("ntnet_o_ok")
|
add_overlay("ntnet_o_ok")
|
||||||
|
|
||||||
@@ -65,12 +59,12 @@
|
|||||||
|
|
||||||
// If DoS traffic exceeded capacity, crash.
|
// If DoS traffic exceeded capacity, crash.
|
||||||
if((dos_overload > dos_capacity) && !dos_failure)
|
if((dos_overload > dos_capacity) && !dos_failure)
|
||||||
dos_failure = 1
|
dos_failure = TRUE
|
||||||
update_icon()
|
update_icon()
|
||||||
ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
|
ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
|
||||||
// If the DoS buffer reaches 0 again, restart.
|
// If the DoS buffer reaches 0 again, restart.
|
||||||
if((dos_overload == 0) && dos_failure)
|
if((dos_overload == 0) && dos_failure)
|
||||||
dos_failure = 0
|
dos_failure = FALSE
|
||||||
update_icon()
|
update_icon()
|
||||||
ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
|
ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
|
||||||
..()
|
..()
|
||||||
@@ -94,10 +88,10 @@
|
|||||||
|
|
||||||
/obj/machinery/ntnet_relay/Topic(href, href_list)
|
/obj/machinery/ntnet_relay/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["restart"])
|
if(href_list["restart"])
|
||||||
dos_overload = 0
|
dos_overload = FALSE
|
||||||
dos_failure = 0
|
dos_failure = FALSE
|
||||||
update_icon()
|
update_icon()
|
||||||
ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
|
ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
|
||||||
else if(href_list["toggle"])
|
else if(href_list["toggle"])
|
||||||
@@ -127,22 +121,22 @@
|
|||||||
D.error = "Connection to quantum relay severed"
|
D.error = "Connection to quantum relay severed"
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/obj/machinery/ntnet_relay/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
/obj/machinery/ntnet_relay/attackby(obj/item/W, mob/user)
|
||||||
if(W.isscrewdriver())
|
if(W.isscrewdriver())
|
||||||
playsound(src.loc, W.usesound, 50, 1)
|
playsound(get_turf(src), W.usesound, 50, TRUE)
|
||||||
panel_open = !panel_open
|
panel_open = !panel_open
|
||||||
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance hatch")
|
to_chat(user, SPAN_NOTICE("You [panel_open ? "open" : "close"] the maintenance hatch."))
|
||||||
return
|
return
|
||||||
if(W.iscrowbar())
|
if(W.iscrowbar())
|
||||||
if(!panel_open)
|
if(!panel_open)
|
||||||
to_chat(user, "Open the maintenance panel first.")
|
to_chat(user, SPAN_WARNING("Open the maintenance panel first."))
|
||||||
return
|
return
|
||||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
|
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||||
to_chat(user, "You disassemble \the [src]!")
|
to_chat(user, SPAN_NOTICE("You disassemble \the [src]!"))
|
||||||
|
|
||||||
for(var/atom/movable/A in component_parts)
|
for(var/atom/movable/A in component_parts)
|
||||||
A.forceMove(src.loc)
|
A.forceMove(get_turf(src))
|
||||||
new/obj/machinery/constructable_frame/machine_frame(src.loc)
|
new /obj/machinery/constructable_frame/machine_frame(get_turf(src))
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
..()
|
..()
|
||||||
@@ -8,14 +8,14 @@
|
|||||||
|
|
||||||
if(damage > broken_damage)
|
if(damage > broken_damage)
|
||||||
shutdown_computer()
|
shutdown_computer()
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash.
|
if(active_program?.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash.
|
||||||
active_program.event_networkfailure(0)
|
active_program.event_networkfailure(FALSE)
|
||||||
|
|
||||||
for(var/datum/computer_file/program/P in idle_threads)
|
for(var/datum/computer_file/program/P in idle_threads)
|
||||||
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature))
|
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature))
|
||||||
P.event_networkfailure(1)
|
P.event_networkfailure(TRUE)
|
||||||
|
|
||||||
if(active_program)
|
if(active_program)
|
||||||
if(active_program.program_state != PROGRAM_STATE_KILLED)
|
if(active_program.program_state != PROGRAM_STATE_KILLED)
|
||||||
@@ -36,24 +36,24 @@
|
|||||||
working = hard_drive && processor_unit && damage < broken_damage && computer_use_power()
|
working = hard_drive && processor_unit && damage < broken_damage && computer_use_power()
|
||||||
check_update_ui_need()
|
check_update_ui_need()
|
||||||
|
|
||||||
if (working && enabled && world.time > ambience_last_played + 30 SECONDS && prob(3))
|
if(working && enabled && world.time > ambience_last_played + 30 SECONDS && prob(3))
|
||||||
playsound(loc, "computerbeep", 30, 1, 10, required_preferences = SOUND_AMBIENCE)
|
playsound(get_turf(src), "computerbeep", 30, 1, 10, required_preferences = SOUND_AMBIENCE)
|
||||||
ambience_last_played = world.time
|
ambience_last_played = world.time
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/get_preset_programs(preset_type)
|
/obj/item/modular_computer/proc/get_preset_programs(preset_type)
|
||||||
for (var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets)
|
for(var/datum/modular_computer_app_presets/prs in ntnet_global.available_software_presets)
|
||||||
if(prs.type == preset_type)
|
if(prs.type == preset_type)
|
||||||
return prs.return_install_programs()
|
return prs.return_install_programs()
|
||||||
|
|
||||||
// Used to perform preset-specific hardware changes.
|
// Used to perform preset-specific hardware changes.
|
||||||
/obj/item/modular_computer/proc/install_default_hardware()
|
/obj/item/modular_computer/proc/install_default_hardware()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// Used to install preset-specific programs
|
// Used to install preset-specific programs
|
||||||
/obj/item/modular_computer/proc/install_default_programs()
|
/obj/item/modular_computer/proc/install_default_programs()
|
||||||
if(enrolled)
|
if(enrolled)
|
||||||
var/programs = get_preset_programs(_app_preset_type)
|
var/programs = get_preset_programs(_app_preset_type)
|
||||||
for (var/datum/computer_file/program/prog in programs)
|
for(var/datum/computer_file/program/prog in programs)
|
||||||
hard_drive.store_file(prog)
|
hard_drive.store_file(prog)
|
||||||
|
|
||||||
/obj/item/modular_computer/Initialize()
|
/obj/item/modular_computer/Initialize()
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
/obj/item/modular_computer/Destroy()
|
/obj/item/modular_computer/Destroy()
|
||||||
kill_program(1)
|
kill_program(TRUE)
|
||||||
for(var/obj/item/computer_hardware/CH in src.get_all_components())
|
for(var/obj/item/computer_hardware/CH in src.get_all_components())
|
||||||
uninstall_component(null, CH)
|
uninstall_component(null, CH)
|
||||||
qdel(CH)
|
qdel(CH)
|
||||||
@@ -76,12 +76,12 @@
|
|||||||
|
|
||||||
/obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user)
|
/obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user)
|
||||||
if(computer_emagged)
|
if(computer_emagged)
|
||||||
to_chat(user, "\The [src] has already been emagged.")
|
to_chat(user, SPAN_WARNING("\The [src] has already been emagged."))
|
||||||
return NO_EMAG_ACT
|
return NO_EMAG_ACT
|
||||||
else
|
else
|
||||||
computer_emagged = 1
|
computer_emagged = TRUE
|
||||||
to_chat(user, "You emag \the [src]. Its screen briefly displays a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
|
to_chat(user, SPAN_WARNING("You emag \the [src]. Its screen briefly displays, \"OVERRIDE ACCEPTED: New software downloads available.\"."))
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/update_icon()
|
/obj/item/modular_computer/update_icon()
|
||||||
icon_state = icon_state_unpowered
|
icon_state = icon_state_unpowered
|
||||||
@@ -119,29 +119,29 @@
|
|||||||
|
|
||||||
/obj/item/modular_computer/proc/turn_on(var/mob/user)
|
/obj/item/modular_computer/proc/turn_on(var/mob/user)
|
||||||
if(tesla_link)
|
if(tesla_link)
|
||||||
tesla_link.enabled = 1
|
tesla_link.enabled = TRUE
|
||||||
var/issynth = issilicon(user) // Robots and AIs get different activation messages.
|
var/issynth = issilicon(user) // Robots and AIs get different activation messages.
|
||||||
if(damage > broken_damage)
|
if(damage > broken_damage)
|
||||||
if(issynth)
|
if(issynth)
|
||||||
to_chat(user, "You send an activation signal to \the [src], but it responds with an error code. It must be damaged.")
|
to_chat(user, SPAN_WARNING("You send an activation signal to \the [src], but it responds with an error code. It must be damaged."))
|
||||||
else
|
else
|
||||||
to_chat(user, "You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")
|
to_chat(user, SPAN_WARNING("You press the power button, but the computer fails to boot up, displaying a variety of errors before shutting down again."))
|
||||||
return
|
return
|
||||||
if(processor_unit && computer_use_power()) // Battery-run and charged or non-battery but powered by APC.
|
if(processor_unit && computer_use_power()) // Battery-run and charged or non-battery but powered by APC.
|
||||||
if(issynth)
|
if(issynth)
|
||||||
to_chat(user, "You send an activation signal to \the [src], turning it on")
|
to_chat(user, SPAN_NOTICE("You send an activation signal to \the [src], turning it on."))
|
||||||
else
|
else
|
||||||
to_chat(user, "You press the power button and start up \the [src]")
|
to_chat(user, SPAN_NOTICE("You press the power button and start up \the [src]."))
|
||||||
enable_computer(user)
|
enable_computer(user)
|
||||||
|
|
||||||
else // Unpowered
|
else // Unpowered
|
||||||
if(issynth)
|
if(issynth)
|
||||||
to_chat(user, "You send an activation signal to \the [src] but it does not respond")
|
to_chat(user, SPAN_WARNING("You send an activation signal to \the [src], but it does not respond."))
|
||||||
else
|
else
|
||||||
to_chat(user, "You press the power button but \the [src] does not respond")
|
to_chat(user, SPAN_WARNING("You press the power button, but \the [src] does not respond."))
|
||||||
|
|
||||||
// Relays kill program request to currently active program. Use this to quit current program.
|
// Relays kill program request to currently active program. Use this to quit current program.
|
||||||
/obj/item/modular_computer/proc/kill_program(var/forced = 0)
|
/obj/item/modular_computer/proc/kill_program(var/forced = FALSE)
|
||||||
if(active_program)
|
if(active_program)
|
||||||
active_program.kill_program(forced)
|
active_program.kill_program(forced)
|
||||||
src.vueui_transfer(active_program)
|
src.vueui_transfer(active_program)
|
||||||
@@ -160,23 +160,23 @@
|
|||||||
|
|
||||||
/obj/item/modular_computer/proc/add_log(var/text)
|
/obj/item/modular_computer/proc/add_log(var/text)
|
||||||
if(!get_ntnet_status())
|
if(!get_ntnet_status())
|
||||||
return 0
|
return FALSE
|
||||||
return ntnet_global.add_log(text, network_card)
|
return ntnet_global.add_log(text, network_card)
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1)
|
/obj/item/modular_computer/proc/shutdown_computer(var/loud = TRUE)
|
||||||
SSvueui.close_uis(active_program)
|
SSvueui.close_uis(active_program)
|
||||||
kill_program(1)
|
kill_program(TRUE)
|
||||||
for(var/datum/computer_file/program/P in idle_threads)
|
for(var/datum/computer_file/program/P in idle_threads)
|
||||||
P.kill_program(1)
|
P.kill_program(TRUE)
|
||||||
idle_threads.Remove(P)
|
idle_threads.Remove(P)
|
||||||
if(loud)
|
if(loud)
|
||||||
visible_message("\The [src] shuts down.")
|
visible_message(SPAN_NOTICE("\The [src] shuts down."))
|
||||||
SSvueui.close_uis(src)
|
SSvueui.close_uis(src)
|
||||||
enabled = 0
|
enabled = FALSE
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/enable_computer(var/mob/user = null)
|
/obj/item/modular_computer/proc/enable_computer(var/mob/user)
|
||||||
enabled = 1
|
enabled = TRUE
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
// Autorun feature
|
// Autorun feature
|
||||||
@@ -208,12 +208,12 @@
|
|||||||
P = hard_drive.find_file_by_name(prog)
|
P = hard_drive.find_file_by_name(prog)
|
||||||
|
|
||||||
if(!P || !istype(P)) // Program not found or it's not executable program.
|
if(!P || !istype(P)) // Program not found or it's not executable program.
|
||||||
to_chat(user, "<span class='danger'>\The [src]'s screen shows \"I/O ERROR - Unable to run [prog]\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [src]'s screen displays, \"I/O ERROR - Unable to run [prog]\"."))
|
||||||
return
|
return
|
||||||
|
|
||||||
P.computer = src
|
P.computer = src
|
||||||
|
|
||||||
if(!P.is_supported_by_hardware(hardware_flag, 1, user))
|
if(!P.is_supported_by_hardware(hardware_flag, TRUE, user))
|
||||||
return
|
return
|
||||||
if(P in idle_threads)
|
if(P in idle_threads)
|
||||||
P.program_state = PROGRAM_STATE_ACTIVE
|
P.program_state = PROGRAM_STATE_ACTIVE
|
||||||
@@ -225,11 +225,11 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
if(idle_threads.len >= processor_unit.max_idle_programs+1)
|
if(idle_threads.len >= processor_unit.max_idle_programs+1)
|
||||||
to_chat(user, "<span class='notice'>\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error</span>")
|
to_chat(user, SPAN_WARNING("\The [src] displays, \"Maximal CPU load reached. Unable to run another program.\"."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet.
|
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet.
|
||||||
to_chat(user, "<span class='danger'>\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning.</span>")
|
to_chat(user, FONT_SMALL(SPAN_WARNING("\The [src] displays, \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\".")))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(active_program)
|
if(active_program)
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
if(!P.vueui_transfer(src))
|
if(!P.vueui_transfer(src))
|
||||||
SSvueui.close_uis(src)
|
SSvueui.close_uis(src)
|
||||||
update_icon()
|
update_icon()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/update_uis()
|
/obj/item/modular_computer/proc/update_uis()
|
||||||
if(active_program) //Should we update program ui or computer ui?
|
if(active_program) //Should we update program ui or computer ui?
|
||||||
@@ -251,16 +251,16 @@
|
|||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/check_update_ui_need()
|
/obj/item/modular_computer/proc/check_update_ui_need()
|
||||||
var/ui_update_needed = 0
|
var/ui_update_needed = FALSE
|
||||||
if(battery_module)
|
if(battery_module)
|
||||||
var/batery_percent = battery_module.battery.percent()
|
var/battery_percent = battery_module.battery.percent()
|
||||||
if(last_battery_percent != batery_percent) //Let's update UI on percent change
|
if(last_battery_percent != battery_percent) //Let's update UI on percent change
|
||||||
ui_update_needed = 1
|
ui_update_needed = TRUE
|
||||||
last_battery_percent = batery_percent
|
last_battery_percent = battery_percent
|
||||||
|
|
||||||
if(worldtime2text() != last_world_time)
|
if(worldtime2text() != last_world_time)
|
||||||
last_world_time = worldtime2text()
|
last_world_time = worldtime2text()
|
||||||
ui_update_needed = 1
|
ui_update_needed = TRUE
|
||||||
|
|
||||||
if(idle_threads.len)
|
if(idle_threads.len)
|
||||||
var/list/current_header_icons = list()
|
var/list/current_header_icons = list()
|
||||||
@@ -273,12 +273,12 @@
|
|||||||
|
|
||||||
else if(!listequal(last_header_icons, current_header_icons))
|
else if(!listequal(last_header_icons, current_header_icons))
|
||||||
last_header_icons = current_header_icons
|
last_header_icons = current_header_icons
|
||||||
ui_update_needed = 1
|
ui_update_needed = TRUE
|
||||||
else
|
else
|
||||||
for(var/x in last_header_icons|current_header_icons)
|
for(var/x in last_header_icons|current_header_icons)
|
||||||
if(last_header_icons[x]!=current_header_icons[x])
|
if(last_header_icons[x]!=current_header_icons[x])
|
||||||
last_header_icons = current_header_icons
|
last_header_icons = current_header_icons
|
||||||
ui_update_needed = 1
|
ui_update_needed = TRUE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(ui_update_needed)
|
if(ui_update_needed)
|
||||||
@@ -293,3 +293,12 @@
|
|||||||
|
|
||||||
/obj/item/modular_computer/get_cell()
|
/obj/item/modular_computer/get_cell()
|
||||||
return battery_module ? battery_module.get_cell() : DEVICE_NO_CELL
|
return battery_module ? battery_module.get_cell() : DEVICE_NO_CELL
|
||||||
|
|
||||||
|
/obj/item/modular_computer/proc/output_message(var/message, var/message_range)
|
||||||
|
message_range += message_output_range
|
||||||
|
if(message_range == 0)
|
||||||
|
var/mob/user = loc
|
||||||
|
if(istype(user))
|
||||||
|
to_chat(user, message)
|
||||||
|
return
|
||||||
|
visible_message(message, range = message_range)
|
||||||
@@ -1,23 +1,25 @@
|
|||||||
/obj/item/modular_computer/examine(var/mob/user)
|
/obj/item/modular_computer/examine(mob/user)
|
||||||
..()
|
..()
|
||||||
|
if(Adjacent(user))
|
||||||
|
to_chat(user, FONT_SMALL(SPAN_NOTICE("It contains the following hardware:")))
|
||||||
|
for(var/CH in get_all_components())
|
||||||
|
to_chat(user, FONT_SMALL(SPAN_NOTICE(" - [capitalize_first_letters(CH)]")))
|
||||||
if(damage > broken_damage)
|
if(damage > broken_damage)
|
||||||
to_chat(user, "<span class='danger'>It is heavily damaged!</span>")
|
to_chat(user, SPAN_DANGER("It is heavily damaged!"))
|
||||||
else if(damage)
|
else if(damage)
|
||||||
to_chat(user, "It is damaged.")
|
to_chat(user, SPAN_WARNING("It is damaged."))
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/break_apart()
|
/obj/item/modular_computer/proc/break_apart()
|
||||||
visible_message("\The [src] breaks apart!")
|
visible_message(SPAN_WARNING("\The [src] breaks apart!"))
|
||||||
var/turf/newloc = get_turf(src)
|
new /obj/item/stack/material/steel(get_turf(src), round(steel_sheet_cost/2))
|
||||||
new /obj/item/stack/material/steel(newloc, round(steel_sheet_cost/2))
|
|
||||||
for(var/obj/item/computer_hardware/H in get_all_components())
|
for(var/obj/item/computer_hardware/H in get_all_components())
|
||||||
uninstall_component(null, H)
|
uninstall_component(null, H)
|
||||||
H.forceMove(newloc)
|
H.forceMove(get_turf(src))
|
||||||
if(prob(25))
|
if(prob(25))
|
||||||
H.take_damage(rand(10,30))
|
H.take_damage(rand(10, 30))
|
||||||
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1)
|
/obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = TRUE, var/randomize = TRUE)
|
||||||
if(randomize)
|
if(randomize)
|
||||||
// 75%-125%, rand() works with integers, apparently.
|
// 75%-125%, rand() works with integers, apparently.
|
||||||
amount *= (rand(75, 125) / 100.0)
|
amount *= (rand(75, 125) / 100.0)
|
||||||
@@ -42,7 +44,7 @@
|
|||||||
|
|
||||||
// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components
|
// EMPs are similar to explosions, but don't cause physical damage to the casing. Instead they screw up the components
|
||||||
/obj/item/modular_computer/emp_act(var/severity)
|
/obj/item/modular_computer/emp_act(var/severity)
|
||||||
take_damage(rand(100, 200) / severity, 50 / severity, 0)
|
take_damage(rand(100, 200) / severity, 50 / severity, FALSE)
|
||||||
|
|
||||||
// "Stun" weapons can cause minor damage to components (short-circuits?)
|
// "Stun" weapons can cause minor damage to components (short-circuits?)
|
||||||
// "Burn" damage is equally strong against internal components and exterior casing
|
// "Burn" damage is equally strong against internal components and exterior casing
|
||||||
|
|||||||
@@ -1,131 +1,128 @@
|
|||||||
// Attempts to install the hardware into appropriate slot.
|
// Attempts to install the hardware into appropriate slot.
|
||||||
/obj/item/modular_computer/proc/try_install_component(var/mob/living/user, var/obj/item/computer_hardware/H, var/found = 0)
|
/obj/item/modular_computer/proc/try_install_component(var/mob/living/user, var/obj/item/computer_hardware/H, var/found = FALSE)
|
||||||
// "USB" flash drive.
|
// "USB" flash drive.
|
||||||
if(istype(H, /obj/item/computer_hardware/hard_drive/portable))
|
if(istype(H, /obj/item/computer_hardware/hard_drive/portable))
|
||||||
if(enrolled == 1 && !computer_emagged)
|
|
||||||
to_chat(user, "The client management software on this computer rejects \the [portable_drive].")
|
|
||||||
return
|
|
||||||
if(portable_drive)
|
if(portable_drive)
|
||||||
to_chat(user, "This computer's portable drive slot is already occupied by \the [portable_drive].")
|
to_chat(user, SPAN_WARNING("\The [src]'s portable drive slot is already occupied by \the [portable_drive]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
portable_drive = H
|
portable_drive = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/hard_drive))
|
else if(istype(H, /obj/item/computer_hardware/hard_drive))
|
||||||
if(hard_drive)
|
if(hard_drive)
|
||||||
to_chat(user, "This computer's hard drive slot is already occupied by \the [hard_drive].")
|
to_chat(user, SPAN_WARNING("\The [src]'s hard drive slot is already occupied by \the [hard_drive]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
hard_drive = H
|
hard_drive = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/network_card))
|
else if(istype(H, /obj/item/computer_hardware/network_card))
|
||||||
if(network_card)
|
if(network_card)
|
||||||
to_chat(user, "This computer's network card slot is already occupied by \the [network_card].")
|
to_chat(user, SPAN_WARNING("\The [src]'s network card slot is already occupied by \the [network_card]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
network_card = H
|
network_card = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/nano_printer))
|
else if(istype(H, /obj/item/computer_hardware/nano_printer))
|
||||||
if(nano_printer)
|
if(nano_printer)
|
||||||
to_chat(user, "This computer's nano printer slot is already occupied by \the [nano_printer].")
|
to_chat(user, SPAN_WARNING("\The [src]'s nano printer slot is already occupied by \the [nano_printer]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
nano_printer = H
|
nano_printer = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/card_slot))
|
else if(istype(H, /obj/item/computer_hardware/card_slot))
|
||||||
if(card_slot)
|
if(card_slot)
|
||||||
to_chat(user, "This computer's card slot is already occupied by \the [card_slot].")
|
to_chat(user, SPAN_WARNING("\The [src]'s card slot is already occupied by \the [card_slot]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
card_slot = H
|
card_slot = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/battery_module))
|
else if(istype(H, /obj/item/computer_hardware/battery_module))
|
||||||
if(battery_module)
|
if(battery_module)
|
||||||
to_chat(user, "This computer's battery slot is already occupied by \the [battery_module].")
|
to_chat(user, SPAN_WARNING("\The [src]'s battery slot is already occupied by \the [battery_module]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
battery_module = H
|
battery_module = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/processor_unit))
|
else if(istype(H, /obj/item/computer_hardware/processor_unit))
|
||||||
if(processor_unit)
|
if(processor_unit)
|
||||||
to_chat(user, "This computer's processor slot is already occupied by \the [processor_unit].")
|
to_chat(user, SPAN_WARNING("\The [src]'s processor slot is already occupied by \the [processor_unit]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
processor_unit = H
|
processor_unit = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/ai_slot))
|
else if(istype(H, /obj/item/computer_hardware/ai_slot))
|
||||||
if(ai_slot)
|
if(ai_slot)
|
||||||
to_chat(user, "This computer's intellicard slot is already occupied by \the [ai_slot].")
|
to_chat(user, SPAN_WARNING("\The [src]'s intellicard slot is already occupied by \the [ai_slot]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
ai_slot = H
|
ai_slot = H
|
||||||
else if(istype(H, /obj/item/computer_hardware/tesla_link))
|
else if(istype(H, /obj/item/computer_hardware/tesla_link))
|
||||||
if(tesla_link)
|
if(tesla_link)
|
||||||
to_chat(user, "This computer's tesla link slot is already occupied by \the [tesla_link].")
|
to_chat(user, SPAN_WARNING("\The [src]'s tesla link slot is already occupied by \the [tesla_link]."))
|
||||||
return
|
return
|
||||||
found = 1
|
found = TRUE
|
||||||
tesla_link = H
|
tesla_link = H
|
||||||
if(found)
|
if(found)
|
||||||
to_chat(user, "You install \the [H] into \the [src]")
|
to_chat(user, SPAN_NOTICE("You install \the [H] into \the [src]."))
|
||||||
H.holder2 = src
|
H.parent_computer = src
|
||||||
user.drop_from_inventory(H,src)
|
user.drop_from_inventory(H, src)
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
// Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware.
|
// Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware.
|
||||||
/obj/item/modular_computer/proc/uninstall_component(var/mob/living/user, var/obj/item/computer_hardware/H, var/found = 0, var/critical = 0)
|
/obj/item/modular_computer/proc/uninstall_component(var/mob/living/user, var/obj/item/computer_hardware/H, var/found = FALSE, var/critical = FALSE)
|
||||||
if(portable_drive == H)
|
if(portable_drive == H)
|
||||||
portable_drive = null
|
portable_drive = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(hard_drive == H)
|
else if(hard_drive == H)
|
||||||
hard_drive = null
|
hard_drive = null
|
||||||
found = 1
|
found = TRUE
|
||||||
critical = 1
|
critical = TRUE
|
||||||
else if(network_card == H)
|
else if(network_card == H)
|
||||||
network_card = null
|
network_card = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(nano_printer == H)
|
else if(nano_printer == H)
|
||||||
nano_printer = null
|
nano_printer = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(card_slot == H)
|
else if(card_slot == H)
|
||||||
card_slot = null
|
card_slot = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(battery_module == H)
|
else if(battery_module == H)
|
||||||
battery_module = null
|
battery_module = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(processor_unit == H)
|
else if(processor_unit == H)
|
||||||
processor_unit = null
|
processor_unit = null
|
||||||
found = 1
|
found = TRUE
|
||||||
critical = 1
|
critical = 1
|
||||||
else if(ai_slot == H)
|
else if(ai_slot == H)
|
||||||
ai_slot = null
|
ai_slot = null
|
||||||
found = 1
|
found = TRUE
|
||||||
else if(tesla_link == H)
|
else if(tesla_link == H)
|
||||||
tesla_link = null
|
tesla_link = null
|
||||||
found = 1
|
found = TRUE
|
||||||
|
|
||||||
if(found)
|
if(found)
|
||||||
if(user)
|
if(user)
|
||||||
to_chat(user, "You remove \the [H] from \the [src].")
|
to_chat(user, SPAN_NOTICE("You remove \the [H] from \the [src]."))
|
||||||
H.forceMove(get_turf(src))
|
H.forceMove(get_turf(src))
|
||||||
H.holder2 = null
|
H.parent_computer = null
|
||||||
update_icon()
|
update_icon()
|
||||||
if(critical && enabled)
|
if(critical && enabled)
|
||||||
to_chat(user, "<span class='danger'>\The [src]'s screen freezes for few seconds and then displays an \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [src]'s screen freezes for few seconds and then displays, \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\"."))
|
||||||
shutdown_computer()
|
shutdown_computer()
|
||||||
|
|
||||||
|
|
||||||
// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
|
// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
|
||||||
/obj/item/modular_computer/proc/find_hardware_by_name(var/name)
|
/obj/item/modular_computer/proc/find_hardware_by_name(var/name)
|
||||||
if(portable_drive && (portable_drive.name == name))
|
if(portable_drive && (initial(portable_drive.name) == name))
|
||||||
return portable_drive
|
return portable_drive
|
||||||
if(hard_drive && (hard_drive.name == name))
|
if(hard_drive && (initial(hard_drive.name) == name))
|
||||||
return hard_drive
|
return hard_drive
|
||||||
if(network_card && (network_card.name == name))
|
if(network_card && (initial(network_card.name) == name))
|
||||||
return network_card
|
return network_card
|
||||||
if(nano_printer && (nano_printer.name == name))
|
if(nano_printer && (initial(nano_printer.name) == name))
|
||||||
return nano_printer
|
return nano_printer
|
||||||
if(card_slot && (card_slot.name == name))
|
if(card_slot && (initial(card_slot.name) == name))
|
||||||
return card_slot
|
return card_slot
|
||||||
if(battery_module && (battery_module.name == name))
|
if(battery_module && (initial(battery_module.name) == name))
|
||||||
return battery_module
|
return battery_module
|
||||||
if(processor_unit && (processor_unit.name == name))
|
if(processor_unit && (initial(processor_unit.name) == name))
|
||||||
return processor_unit
|
return processor_unit
|
||||||
if(ai_slot && (ai_slot.name == name))
|
if(ai_slot && (initial(ai_slot.name) == name))
|
||||||
return ai_slot
|
return ai_slot
|
||||||
if(tesla_link && (tesla_link.name == name))
|
if(tesla_link && (initial(tesla_link.name) == name))
|
||||||
return tesla_link
|
return tesla_link
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
|||||||
@@ -4,12 +4,7 @@
|
|||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in view(1)
|
set src in view(1)
|
||||||
|
|
||||||
if(usr.incapacitated() || !istype(usr, /mob/living))
|
if(use_check_and_message(usr))
|
||||||
to_chat(usr, "<span class='warning'>You can't do that.</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!Adjacent(usr))
|
|
||||||
to_chat(usr, "<span class='warning'>You can't reach it.</span>")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
proc_eject_id(usr)
|
proc_eject_id(usr)
|
||||||
@@ -20,12 +15,7 @@
|
|||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in view(1)
|
set src in view(1)
|
||||||
|
|
||||||
if(usr.incapacitated() || !istype(usr, /mob/living))
|
if(use_check_and_message(usr))
|
||||||
to_chat(usr, "<span class='warning'>You can't do that.</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!Adjacent(usr))
|
|
||||||
to_chat(usr, "<span class='warning'>You can't reach it.</span>")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
proc_eject_usb(usr)
|
proc_eject_usb(usr)
|
||||||
@@ -35,12 +25,7 @@
|
|||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in view(1)
|
set src in view(1)
|
||||||
|
|
||||||
if(usr.incapacitated() || !istype(usr, /mob/living))
|
if(use_check_and_message(usr))
|
||||||
to_chat(usr, "<span class='warning'>You can't do that.</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!Adjacent(usr))
|
|
||||||
to_chat(usr, "<span class='warning'>You can't reach it.</span>")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
proc_eject_ai(usr)
|
proc_eject_ai(usr)
|
||||||
@@ -50,25 +35,25 @@
|
|||||||
user = usr
|
user = usr
|
||||||
|
|
||||||
if(!card_slot)
|
if(!card_slot)
|
||||||
to_chat(user, "\The [src] does not have an ID card slot")
|
to_chat(user, SPAN_WARNING("\The [src] does not have an ID card slot."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!card_slot.stored_card)
|
if(!card_slot.stored_card)
|
||||||
to_chat(user, "There is no card in \the [src]")
|
to_chat(user, SPAN_WARNING("There is no card in \the [src]."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(active_program)
|
if(active_program)
|
||||||
active_program.event_idremoved(0)
|
active_program.event_idremoved(FALSE)
|
||||||
|
|
||||||
for(var/datum/computer_file/program/P in idle_threads)
|
for(var/datum/computer_file/program/P in idle_threads)
|
||||||
P.event_idremoved(1)
|
P.event_idremoved(TRUE)
|
||||||
if(ishuman(user))
|
if(ishuman(user))
|
||||||
user.put_in_hands(card_slot.stored_card)
|
user.put_in_hands(card_slot.stored_card)
|
||||||
else
|
else
|
||||||
card_slot.stored_card.forceMove(get_turf(src))
|
card_slot.stored_card.forceMove(get_turf(src))
|
||||||
card_slot.stored_card = null
|
card_slot.stored_card = null
|
||||||
update_uis()
|
update_uis()
|
||||||
to_chat(user, "You remove the card from \the [src]")
|
to_chat(user, SPAN_NOTICE("You remove the card from \the [src]."))
|
||||||
|
|
||||||
|
|
||||||
/obj/item/modular_computer/proc/proc_eject_usb(mob/user)
|
/obj/item/modular_computer/proc/proc_eject_usb(mob/user)
|
||||||
@@ -76,7 +61,7 @@
|
|||||||
user = usr
|
user = usr
|
||||||
|
|
||||||
if(!portable_drive)
|
if(!portable_drive)
|
||||||
to_chat(user, "There is no portable device connected to \the [src].")
|
to_chat(user, SPAN_WARNING("There is no portable drive connected to \the [src]."))
|
||||||
return
|
return
|
||||||
|
|
||||||
uninstall_component(user, portable_drive)
|
uninstall_component(user, portable_drive)
|
||||||
@@ -86,8 +71,12 @@
|
|||||||
if(!user)
|
if(!user)
|
||||||
user = usr
|
user = usr
|
||||||
|
|
||||||
if(!ai_slot || !ai_slot.stored_card)
|
if(!ai_slot)
|
||||||
to_chat(user, "There is no intellicard connected to \the [src].")
|
to_chat(user, SPAN_WARNING("\The [src] doesn't have an intellicard slot."))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!ai_slot.stored_card)
|
||||||
|
to_chat(user, SPAN_WARNING("There is no intellicard connected to \the [src]."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(ishuman(user))
|
if(ishuman(user))
|
||||||
@@ -123,33 +112,33 @@
|
|||||||
else if(!enabled && screen_on)
|
else if(!enabled && screen_on)
|
||||||
turn_on(user)
|
turn_on(user)
|
||||||
|
|
||||||
/obj/item/modular_computer/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
/obj/item/modular_computer/attackby(obj/item/W, mob/user)
|
||||||
if(istype(W, /obj/item/card/tech_support))
|
if(istype(W, /obj/item/card/tech_support))
|
||||||
if(!can_reset)
|
if(!can_reset)
|
||||||
to_chat(user, span("notice", "You cannot reset this type of device."))
|
to_chat(user, SPAN_WARNING("You cannot reset this type of device."))
|
||||||
return
|
return
|
||||||
if(!enabled)
|
if(!enabled)
|
||||||
to_chat(user, span("notice", "You cannot reset the device if it isn't powered on."))
|
to_chat(user, SPAN_WARNING("You cannot reset the device if it isn't powered on."))
|
||||||
return
|
return
|
||||||
if(!hard_drive)
|
if(!hard_drive)
|
||||||
to_chat(user, span("notice", "You cannot reset a device that has no hard drive."))
|
to_chat(user, SPAN_WARNING("You cannot reset a device that has no hard drive."))
|
||||||
return
|
return
|
||||||
enrolled = 0
|
enrolled = FALSE
|
||||||
hard_drive.reset_drive()
|
hard_drive.reset_drive()
|
||||||
visible_message("\icon[src.icon] <b>[src]</b> pings, <span class='notice'>\"Enrollment status reset! Have a NanoTrasen day.\"</span>")
|
visible_message("\icon[src.icon] <b>[src]</b> pings, <span class='notice'>\"Enrollment status reset! Have a NanoTrasen day.\"</span>")
|
||||||
if(istype(W, /obj/item/card/id)) // ID Card, try to insert it.
|
if(istype(W, /obj/item/card/id)) // ID Card, try to insert it.
|
||||||
var/obj/item/card/id/I = W
|
var/obj/item/card/id/I = W
|
||||||
if(!card_slot)
|
if(!card_slot)
|
||||||
to_chat(user, "You try to insert \the [I] into \the [src], but it does not have an ID card slot installed.")
|
to_chat(user, SPAN_WARNING("You try to insert \the [I] into \the [src], but it does not have an ID card slot installed."))
|
||||||
|
return
|
||||||
|
if(card_slot.stored_card)
|
||||||
|
to_chat(user, SPAN_WARNING("You try to insert \the [I] into \the [src], but its ID card slot is occupied."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(card_slot.stored_card)
|
user.drop_from_inventory(I, src)
|
||||||
to_chat(user, "You try to insert \the [I] into \the [src], but it's ID card slot is occupied.")
|
|
||||||
return
|
|
||||||
user.drop_from_inventory(I,src)
|
|
||||||
card_slot.stored_card = I
|
card_slot.stored_card = I
|
||||||
update_uis()
|
update_uis()
|
||||||
to_chat(user, "You insert \the [I] into \the [src].")
|
to_chat(user, SPAN_NOTICE("You insert \the [I] into \the [src]."))
|
||||||
return
|
return
|
||||||
if(istype(W, /obj/item/paper))
|
if(istype(W, /obj/item/paper))
|
||||||
if(!nano_printer)
|
if(!nano_printer)
|
||||||
@@ -164,63 +153,59 @@
|
|||||||
if(C.hardware_size <= max_hardware_size)
|
if(C.hardware_size <= max_hardware_size)
|
||||||
try_install_component(user, C)
|
try_install_component(user, C)
|
||||||
else
|
else
|
||||||
to_chat(user, "This component is too large for \the [src].")
|
to_chat(user, SPAN_WARNING("This component is too large for \the [src]."))
|
||||||
if(W.iswrench())
|
if(W.iswrench())
|
||||||
var/list/components = get_all_components()
|
var/list/components = get_all_components()
|
||||||
if(components.len)
|
if(components.len)
|
||||||
to_chat(user, "Remove all components from \the [src] before disassembling it.")
|
to_chat(user, SPAN_WARNING("You have to remove all the components from \the [src] before disassembling it."))
|
||||||
return
|
return
|
||||||
to_chat(user, span("notice", "You begin to disassemble \the [src]."))
|
to_chat(user, SPAN_NOTICE("You begin to disassemble \the [src]."))
|
||||||
playsound(user, W.usesound, 100, 1)
|
playsound(get_turf(src), W.usesound, 100, TRUE)
|
||||||
if (do_after(user, 20/W.toolspeed))
|
if (do_after(user, 20/W.toolspeed))
|
||||||
new /obj/item/stack/material/steel(get_turf(src.loc), steel_sheet_cost)
|
new /obj/item/stack/material/steel(get_turf(src), steel_sheet_cost)
|
||||||
src.visible_message("\The [user] disassembles \the [src].",
|
user.visible_message(SPAN_NOTICE("\The [user] disassembles \the [src]."), SPAN_NOTICE("You disassemble \the [src]."), SPAN_NOTICE("You hear a ratcheting noise."))
|
||||||
"You disassemble \the [src].",
|
|
||||||
"You hear a ratchet.")
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
if(W.iswelder())
|
if(W.iswelder())
|
||||||
var/obj/item/weldingtool/WT = W
|
var/obj/item/weldingtool/WT = W
|
||||||
if(!WT.isOn())
|
if(!WT.isOn())
|
||||||
to_chat(user, "\The [W] is off.")
|
to_chat(user, SPAN_WARNING("\The [W] is off."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!damage)
|
if(!damage)
|
||||||
to_chat(user, "\The [src] does not require repairs.")
|
to_chat(user, SPAN_WARNING("\The [src] does not require repairs."))
|
||||||
return
|
return
|
||||||
|
|
||||||
to_chat(user, "You begin repairing damage to \the [src]...")
|
to_chat(user, SPAN_NOTICE("You begin repairing the damage to \the [src]..."))
|
||||||
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
playsound(get_turf(src), 'sound/items/Welder.ogg', 100, 1)
|
||||||
if(WT.remove_fuel(round(damage/75)) && do_after(usr, damage/10))
|
if(WT.remove_fuel(round(damage / 75)) && do_after(user, damage / 10))
|
||||||
damage = 0
|
damage = 0
|
||||||
to_chat(user, "You repair \the [src].")
|
to_chat(user, SPAN_NOTICE("You fully repair \the [src]."))
|
||||||
update_icon()
|
update_icon()
|
||||||
return
|
return
|
||||||
|
|
||||||
if(W.isscrewdriver())
|
if(W.isscrewdriver())
|
||||||
var/list/all_components = get_all_components()
|
var/list/all_components = get_all_components()
|
||||||
if(!all_components.len)
|
if(!all_components.len)
|
||||||
to_chat(user, "This device doesn't have any components installed.")
|
to_chat(user, SPAN_WARNING("This device doesn't have any components installed."))
|
||||||
return
|
return
|
||||||
var/list/component_names = list()
|
|
||||||
for(var/obj/item/computer_hardware/H in all_components)
|
|
||||||
component_names.Add(H.name)
|
|
||||||
|
|
||||||
var/choice = input(usr, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in component_names
|
|
||||||
|
|
||||||
|
var/obj/item/computer_hardware/choice = input(user, "Which component do you want to uninstall?", "Hardware Removal") as null|anything in all_components
|
||||||
if(!choice)
|
if(!choice)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!Adjacent(usr))
|
if(!Adjacent(usr))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/obj/item/computer_hardware/H = find_hardware_by_name(choice)
|
var/obj/item/computer_hardware/H = find_hardware_by_name(initial(choice.name))
|
||||||
|
|
||||||
if(!H)
|
if(!H)
|
||||||
return
|
return
|
||||||
|
|
||||||
uninstall_component(user, H)
|
uninstall_component(user, H)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/obj/item/modular_computer/MouseDrop(atom/over_object)
|
||||||
|
var/mob/M = usr
|
||||||
|
if(use_check_and_message(M))
|
||||||
|
return
|
||||||
|
if(!istype(over_object, /obj/screen) && !(over_object == src))
|
||||||
|
return attack_self(M)
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
/obj/item/modular_computer/proc/power_failure(var/malfunction = 0)
|
/obj/item/modular_computer/proc/power_failure(var/malfunction = FALSE)
|
||||||
if(enabled) // Shut down the computer
|
if(enabled) // Shut down the computer
|
||||||
visible_message("<span class='danger'>\The [src]'s screen flickers briefly and then goes dark.</span>")
|
visible_message(SPAN_WARNING("\The [src]'s screen flickers briefly and then goes dark."))
|
||||||
if(active_program)
|
if(active_program)
|
||||||
active_program.event_powerfailure(0)
|
active_program.event_powerfailure(FALSE)
|
||||||
for(var/datum/computer_file/program/PRG in idle_threads)
|
for(var/datum/computer_file/program/PRG in idle_threads)
|
||||||
PRG.event_powerfailure(1)
|
PRG.event_powerfailure(TRUE)
|
||||||
shutdown_computer(0)
|
shutdown_computer(FALSE)
|
||||||
|
|
||||||
power_has_failed = TRUE
|
power_has_failed = TRUE
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
// Tries to use power from battery. Passing 0 as parameter results in this proc returning whether battery is functional or not.
|
// Tries to use power from battery. Passing false as parameter results in this proc returning whether battery is functional or not.
|
||||||
/obj/item/modular_computer/proc/battery_power(var/power_usage = 0)
|
/obj/item/modular_computer/proc/battery_power(var/power_usage = FALSE)
|
||||||
apc_powered = FALSE
|
apc_powered = FALSE
|
||||||
if(!battery_module || !battery_module.check_functionality() || battery_module.battery.charge <= 0)
|
if(!battery_module || !battery_module.check_functionality() || battery_module.battery.charge <= 0)
|
||||||
return FALSE
|
return FALSE
|
||||||
@@ -51,15 +50,14 @@
|
|||||||
// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
|
// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
|
||||||
/obj/item/modular_computer/proc/handle_power()
|
/obj/item/modular_computer/proc/handle_power()
|
||||||
var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
|
var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
|
||||||
if (enabled)
|
if(enabled)
|
||||||
for(var/obj/item/computer_hardware/H in get_all_components())
|
for(var/obj/item/computer_hardware/H in get_all_components())
|
||||||
if(H.enabled)
|
if(H.enabled)
|
||||||
power_usage += H.power_usage
|
power_usage += H.power_usage
|
||||||
last_power_usage = power_usage
|
last_power_usage = power_usage
|
||||||
|
|
||||||
|
|
||||||
if(computer_use_power(power_usage))
|
if(computer_use_power(power_usage))
|
||||||
if (power_has_failed)
|
if(power_has_failed)
|
||||||
power_has_failed = FALSE
|
power_has_failed = FALSE
|
||||||
update_icon()
|
update_icon()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -18,10 +18,10 @@
|
|||||||
// We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it.
|
// We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it.
|
||||||
// This screen simply lists available programs and user may select them.
|
// This screen simply lists available programs and user may select them.
|
||||||
if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len)
|
if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len)
|
||||||
visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.")
|
visible_message(SPAN_WARNING("\The [src] beeps three times, its screen displaying, \"DISK ERROR!\"."))
|
||||||
return // No HDD, No HDD files list or no stored files. Something is very broken.
|
return // No HDD, No HDD files list or no stored files. Something is very broken.
|
||||||
|
|
||||||
if (!ui)
|
if(!ui)
|
||||||
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-system-main", 400, 500, "NTOS Main Menu")
|
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-system-main", 400, 500, "NTOS Main Menu")
|
||||||
ui.header = "modular-computer"
|
ui.header = "modular-computer"
|
||||||
ui.open()
|
ui.open()
|
||||||
@@ -55,30 +55,30 @@
|
|||||||
// Handles user's GUI input
|
// Handles user's GUI input
|
||||||
/obj/item/modular_computer/Topic(href, href_list)
|
/obj/item/modular_computer/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if( href_list["PC_exit"] )
|
if(href_list["PC_exit"])
|
||||||
kill_program()
|
kill_program()
|
||||||
return 1
|
return TRUE
|
||||||
if( href_list["PC_enable_component"] )
|
if(href_list["PC_enable_component"])
|
||||||
var/obj/item/computer_hardware/H = find_hardware_by_name(href_list["PC_enable_component"])
|
var/obj/item/computer_hardware/H = find_hardware_by_name(href_list["PC_enable_component"])
|
||||||
if(H && istype(H) && !H.enabled)
|
if(H && istype(H) && !H.enabled)
|
||||||
H.enabled = 1
|
H.enabled = TRUE
|
||||||
. = 1
|
. = TRUE
|
||||||
if( href_list["PC_disable_component"] )
|
if(href_list["PC_disable_component"])
|
||||||
var/obj/item/computer_hardware/H = find_hardware_by_name(href_list["PC_disable_component"])
|
var/obj/item/computer_hardware/H = find_hardware_by_name(href_list["PC_disable_component"])
|
||||||
if(H && istype(H) && H.enabled)
|
if(H && istype(H) && H.enabled)
|
||||||
H.enabled = 0
|
H.enabled = 0
|
||||||
. = 1
|
. = TRUE
|
||||||
if( href_list["PC_shutdown"] )
|
if(href_list["PC_shutdown"])
|
||||||
shutdown_computer()
|
shutdown_computer()
|
||||||
return 1
|
return TRUE
|
||||||
if( href_list["PC_minimize"] )
|
if(href_list["PC_minimize"])
|
||||||
var/mob/user = usr
|
var/mob/user = usr
|
||||||
minimize_program(user)
|
minimize_program(user)
|
||||||
|
|
||||||
if( href_list["PC_killprogram"] )
|
if(href_list["PC_killprogram"])
|
||||||
var/prog = href_list["PC_killprogram"]
|
var/prog = href_list["PC_killprogram"]
|
||||||
var/datum/computer_file/program/P = null
|
var/datum/computer_file/program/P
|
||||||
var/mob/user = usr
|
var/mob/user = usr
|
||||||
if(hard_drive)
|
if(hard_drive)
|
||||||
P = hard_drive.find_file_by_name(prog)
|
P = hard_drive.find_file_by_name(prog)
|
||||||
@@ -86,20 +86,20 @@
|
|||||||
if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED)
|
if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED)
|
||||||
return
|
return
|
||||||
|
|
||||||
P.kill_program(1)
|
P.kill_program(TRUE)
|
||||||
update_uis()
|
update_uis()
|
||||||
to_chat(user, "<span class='notice'>Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.</span>")
|
to_chat(user, SPAN_NOTICE("Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed."))
|
||||||
|
|
||||||
if( href_list["PC_runprogram"] )
|
if(href_list["PC_runprogram"])
|
||||||
. = run_program(href_list["PC_runprogram"])
|
. = run_program(href_list["PC_runprogram"])
|
||||||
ui_interact(usr)
|
ui_interact(usr)
|
||||||
|
|
||||||
if( href_list["PC_setautorun"] )
|
if(href_list["PC_setautorun"])
|
||||||
if(!hard_drive)
|
if(!hard_drive)
|
||||||
return
|
return
|
||||||
var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun")
|
var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun")
|
||||||
if(!istype(autorun))
|
if(!istype(autorun))
|
||||||
autorun = new/datum/computer_file/data()
|
autorun = new /datum/computer_file/data()
|
||||||
autorun.filename = "autorun"
|
autorun.filename = "autorun"
|
||||||
hard_drive.store_file(autorun)
|
hard_drive.store_file(autorun)
|
||||||
if(autorun.stored_data == href_list["PC_setautorun"])
|
if(autorun.stored_data == href_list["PC_setautorun"])
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
// This is the base type that handles everything. Subtypes can be easily created by tweaking variables in this file to your liking.
|
// This is the base type that handles everything. Subtypes can be easily created by tweaking variables in this file to your liking.
|
||||||
|
|
||||||
/obj/item/modular_computer
|
/obj/item/modular_computer
|
||||||
name = "Modular Computer"
|
name = "Modular Computer"
|
||||||
desc = "A modular computer. You shouldn't see this."
|
desc = "A modular computer. You shouldn't see this."
|
||||||
|
|
||||||
var/enabled = 0 // Whether the computer is turned on.
|
var/enabled = FALSE // Whether the computer is turned on.
|
||||||
var/screen_on = 1 // Whether the computer is active/opened/it's screen is on.
|
var/screen_on = TRUE // Whether the computer is active/opened/it's screen is on.
|
||||||
var/working = 1 // Whether the computer is working.
|
var/working = TRUE // Whether the computer is working.
|
||||||
var/can_reset = FALSE // Whether you can reset this device with the tech support card.
|
var/can_reset = FALSE // Whether you can reset this device with the tech support card.
|
||||||
var/datum/computer_file/program/active_program = null // A currently active program running on the computer.
|
var/datum/computer_file/program/active_program // A currently active program running on the computer.
|
||||||
var/hardware_flag = 0 // A flag that describes this device type
|
var/hardware_flag = 0 // A flag that describes this device type
|
||||||
var/last_power_usage = 0 // Last tick power usage of this computer
|
var/last_power_usage = 0 // Last tick power usage of this computer
|
||||||
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
|
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
|
||||||
@@ -18,8 +17,8 @@
|
|||||||
var/apc_powered = FALSE // Set automatically. Whether the computer used APC power last tick.
|
var/apc_powered = FALSE // Set automatically. Whether the computer used APC power last tick.
|
||||||
var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
|
var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
|
||||||
var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
|
var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
|
||||||
var/enrolled = 0 // Weather the computer is enrolled in the company device management or not. 0 - unconfigured 1 - enrolled (work device) 2 - unenrolled (private device)
|
var/enrolled = FALSE // Weather the computer is enrolled in the company device management or not. 0 - unconfigured 1 - enrolled (work device) 2 - unenrolled (private device)
|
||||||
var/_app_preset_type = null // Used for specifying the software preset of the console
|
var/_app_preset_type // Used for specifying the software preset of the console
|
||||||
var/ambience_last_played // Last time sound was played
|
var/ambience_last_played // Last time sound was played
|
||||||
|
|
||||||
// Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
|
// Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
|
||||||
@@ -30,13 +29,14 @@
|
|||||||
icon_state = null // And no random pixelshifting on-creation either.
|
icon_state = null // And no random pixelshifting on-creation either.
|
||||||
randpixel = 0
|
randpixel = 0
|
||||||
center_of_mass = null
|
center_of_mass = null
|
||||||
var/icon_state_unpowered = null // Icon state when the computer is turned off
|
var/icon_state_unpowered // Icon state when the computer is turned off
|
||||||
var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
|
var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
|
||||||
var/icon_state_screensaver = null
|
var/icon_state_screensaver
|
||||||
var/icon_state_broken = null
|
var/icon_state_broken
|
||||||
var/screensaver_light_range = 0
|
var/screensaver_light_range = 0
|
||||||
var/screensaver_light_color = null
|
var/screensaver_light_color
|
||||||
var/menu_light_color = null
|
var/menu_light_color
|
||||||
|
var/message_output_range = 0 // Adds onto the output_message proc's range
|
||||||
var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed.
|
var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed.
|
||||||
var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
|
var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
|
||||||
var/light_strength = 0 // Intensity of light this computer emits. Comparable to numbers light fixtures use.
|
var/light_strength = 0 // Intensity of light this computer emits. Comparable to numbers light fixtures use.
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
menu_light_color = LIGHT_COLOR_BLUE
|
menu_light_color = LIGHT_COLOR_BLUE
|
||||||
hardware_flag = PROGRAM_CONSOLE
|
hardware_flag = PROGRAM_CONSOLE
|
||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
density = 1
|
density = TRUE
|
||||||
|
message_output_range = 1
|
||||||
base_idle_power_usage = 100
|
base_idle_power_usage = 100
|
||||||
base_active_power_usage = 500
|
base_active_power_usage = 500
|
||||||
max_hardware_size = 3
|
max_hardware_size = 3
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
name = "laptop computer"
|
name = "laptop computer"
|
||||||
desc = "A portable computer."
|
desc = "A portable computer."
|
||||||
|
description_info = "You can alt-click the laptop while it's set down on surface to open it up and work with it. Left clicking while it is open will allow you to operate it."
|
||||||
hardware_flag = PROGRAM_LAPTOP
|
hardware_flag = PROGRAM_LAPTOP
|
||||||
can_reset = TRUE
|
can_reset = TRUE
|
||||||
icon_state_unpowered = "laptop-open"
|
icon_state_unpowered = "laptop-open"
|
||||||
@@ -12,19 +13,20 @@
|
|||||||
center_of_mass = list("x"=14, "y"=10)
|
center_of_mass = list("x"=14, "y"=10)
|
||||||
base_idle_power_usage = 25
|
base_idle_power_usage = 25
|
||||||
base_active_power_usage = 200
|
base_active_power_usage = 200
|
||||||
|
message_output_range = 1
|
||||||
max_hardware_size = 2
|
max_hardware_size = 2
|
||||||
light_strength = 3
|
light_strength = 3
|
||||||
max_damage = 50
|
max_damage = 50
|
||||||
broken_damage = 25
|
broken_damage = 25
|
||||||
w_class = 3
|
|
||||||
var/icon_state_closed = "laptop-closed"
|
var/icon_state_closed = "laptop-closed"
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/AltClick()
|
/obj/item/modular_computer/laptop/AltClick()
|
||||||
if (use_check(usr)) return
|
if(use_check(usr))
|
||||||
|
return
|
||||||
// Prevents carrying of open laptops inhand.
|
// Prevents carrying of open laptops inhand.
|
||||||
// While they work inhand, i feel it'd make tablets lose some of their high-mobility advantage they have over laptops now.
|
// While they work inhand, i feel it'd make tablets lose some of their high-mobility advantage they have over laptops now.
|
||||||
if(!istype(loc, /turf/))
|
if(!isturf(loc))
|
||||||
to_chat(usr, "\The [src] has to be on a stable surface first!")
|
to_chat(usr, SPAN_NOTICE("\The [src] has to be on a stable surface first!"))
|
||||||
return
|
return
|
||||||
anchored = !anchored
|
anchored = !anchored
|
||||||
screen_on = anchored
|
screen_on = anchored
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
base_active_power_usage = 25
|
base_active_power_usage = 25
|
||||||
max_hardware_size = 3
|
max_hardware_size = 3
|
||||||
max_damage = 50
|
max_damage = 50
|
||||||
w_class = 3
|
|
||||||
var/mob/living/silicon/computer_host // Thing that contains this computer. Used for silicon computers
|
var/mob/living/silicon/computer_host // Thing that contains this computer. Used for silicon computers
|
||||||
|
|
||||||
/obj/item/modular_computer/silicon/Initialize(mapload)
|
/obj/item/modular_computer/silicon/Initialize(mapload)
|
||||||
@@ -43,4 +42,3 @@
|
|||||||
|
|
||||||
/obj/item/modular_computer/silicon/Click(location, control, params)
|
/obj/item/modular_computer/silicon/Click(location, control, params)
|
||||||
return attack_self(usr)
|
return attack_self(usr)
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
can_reset = TRUE
|
can_reset = TRUE
|
||||||
hardware_flag = PROGRAM_TABLET
|
hardware_flag = PROGRAM_TABLET
|
||||||
max_hardware_size = 1
|
max_hardware_size = 1
|
||||||
w_class = 2
|
w_class = ITEMSIZE_SMALL
|
||||||
light_strength = 2 // Same as PDAs
|
light_strength = 2 // Same as PDAs
|
||||||
|
|
||||||
/obj/item/modular_computer/tablet/Initialize()
|
/obj/item/modular_computer/tablet/Initialize()
|
||||||
|
|||||||
@@ -8,16 +8,17 @@
|
|||||||
icon_state_broken = "telescreen-broken"
|
icon_state_broken = "telescreen-broken"
|
||||||
hardware_flag = PROGRAM_TELESCREEN
|
hardware_flag = PROGRAM_TELESCREEN
|
||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
density = 0
|
density = FALSE
|
||||||
base_idle_power_usage = 75
|
base_idle_power_usage = 75
|
||||||
base_active_power_usage = 300
|
base_active_power_usage = 300
|
||||||
|
message_output_range = 1
|
||||||
max_hardware_size = 2
|
max_hardware_size = 2
|
||||||
steel_sheet_cost = 10
|
steel_sheet_cost = 10
|
||||||
light_strength = 4
|
light_strength = 4
|
||||||
w_class = 5
|
w_class = ITEMSIZE_HUGE
|
||||||
is_holographic = TRUE
|
is_holographic = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/telescreen/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
/obj/item/modular_computer/telescreen/attackby(obj/item/W, mob/user)
|
||||||
if(W.iscrowbar())
|
if(W.iscrowbar())
|
||||||
if(anchored)
|
if(anchored)
|
||||||
shutdown_computer()
|
shutdown_computer()
|
||||||
@@ -25,7 +26,7 @@
|
|||||||
screen_on = FALSE
|
screen_on = FALSE
|
||||||
pixel_x = 0
|
pixel_x = 0
|
||||||
pixel_y = 0
|
pixel_y = 0
|
||||||
to_chat(user, "You unsecure \the [src].")
|
to_chat(user, SPAN_NOTICE("You unsecure \the [src]."))
|
||||||
else
|
else
|
||||||
var/choice = input(user, "Where do you want to place \the [src]?", "Offset selection") in list("North", "South", "West", "East", "This tile", "Cancel")
|
var/choice = input(user, "Where do you want to place \the [src]?", "Offset selection") in list("North", "South", "West", "East", "This tile", "Cancel")
|
||||||
var/valid = FALSE
|
var/valid = FALSE
|
||||||
@@ -46,8 +47,8 @@
|
|||||||
valid = TRUE
|
valid = TRUE
|
||||||
|
|
||||||
if(valid)
|
if(valid)
|
||||||
anchored = 1
|
anchored = TRUE
|
||||||
screen_on = TRUE
|
screen_on = TRUE
|
||||||
to_chat(user, "You secure \the [src].")
|
to_chat(user, SPAN_NOTICE("You secure \the [src]."))
|
||||||
return
|
return
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -1,138 +1,137 @@
|
|||||||
/obj/item/modular_computer/console/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
/obj/item/modular_computer/console/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||||
if(istype(mover,/obj/item/projectile))
|
if(istype(mover,/obj/item/projectile))
|
||||||
if (prob(80))
|
if(prob(80))
|
||||||
//Holoscreens are non solid, and the frames of the computers are thin. So projectiles will usually
|
//Holoscreens are non solid, and the frames of the computers are thin. So projectiles will usually
|
||||||
//pass through
|
//pass through
|
||||||
return 1
|
return TRUE
|
||||||
else if(istype(mover) && mover.checkpass(PASSTABLE))
|
else if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||||
//Animals can run under them, lots of empty space
|
//Animals can run under them, lots of empty space
|
||||||
return 1
|
return TRUE
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/install_default_hardware()
|
/obj/item/modular_computer/console/preset/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
processor_unit = new/obj/item/computer_hardware/processor_unit(src)
|
processor_unit = new /obj/item/computer_hardware/processor_unit(src)
|
||||||
tesla_link = new/obj/item/computer_hardware/tesla_link(src)
|
tesla_link = new /obj/item/computer_hardware/tesla_link(src)
|
||||||
hard_drive = new/obj/item/computer_hardware/hard_drive/super(src)
|
hard_drive = new /obj/item/computer_hardware/hard_drive/super(src)
|
||||||
network_card = new/obj/item/computer_hardware/network_card/wired(src)
|
network_card = new /obj/item/computer_hardware/network_card/wired(src)
|
||||||
nano_printer = new/obj/item/computer_hardware/nano_printer(src)
|
nano_printer = new /obj/item/computer_hardware/nano_printer(src)
|
||||||
|
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/install_default_programs()
|
/obj/item/modular_computer/console/preset/install_default_programs()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
// Engineering
|
// Engineering
|
||||||
/obj/item/modular_computer/console/preset/engineering/
|
/obj/item/modular_computer/console/preset/engineering
|
||||||
name = "engineering console"
|
name = "engineering console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/engineering
|
_app_preset_type = /datum/modular_computer_app_presets/engineering
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/engineering/ce
|
/obj/item/modular_computer/console/preset/engineering/ce
|
||||||
name = "engineering console"
|
name = "engineering console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/engineering/ce
|
_app_preset_type = /datum/modular_computer_app_presets/engineering/ce
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
// Medical
|
// Medical
|
||||||
/obj/item/modular_computer/console/preset/medical/
|
/obj/item/modular_computer/console/preset/medical
|
||||||
name = "medical console"
|
name = "medical console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/medical
|
_app_preset_type = /datum/modular_computer_app_presets/medical
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/medical/cmo
|
/obj/item/modular_computer/console/preset/medical/cmo
|
||||||
name = "medical console"
|
name = "medical console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/medical/cmo
|
_app_preset_type = /datum/modular_computer_app_presets/medical/cmo
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
// Research
|
// Research
|
||||||
/obj/item/modular_computer/console/preset/research/
|
/obj/item/modular_computer/console/preset/research
|
||||||
name = "research console"
|
name = "research console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/research
|
_app_preset_type = /datum/modular_computer_app_presets/research
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/research/install_default_hardware()
|
/obj/item/modular_computer/console/preset/research/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
ai_slot = new/obj/item/computer_hardware/ai_slot(src)
|
ai_slot = new /obj/item/computer_hardware/ai_slot(src)
|
||||||
|
|
||||||
// Command
|
// Command
|
||||||
/obj/item/modular_computer/console/preset/command/
|
/obj/item/modular_computer/console/preset/command
|
||||||
name = "command console"
|
name = "command console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/command
|
_app_preset_type = /datum/modular_computer_app_presets/command
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/command/install_default_hardware()
|
/obj/item/modular_computer/console/preset/command/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
nano_printer = new/obj/item/computer_hardware/nano_printer(src)
|
nano_printer = new /obj/item/computer_hardware/nano_printer(src)
|
||||||
nano_printer.max_paper = 25
|
nano_printer.max_paper = 25
|
||||||
nano_printer.stored_paper = 20
|
nano_printer.stored_paper = 20
|
||||||
card_slot = new/obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/command/captain
|
/obj/item/modular_computer/console/preset/command/captain
|
||||||
name = "captain's console"
|
name = "captain's console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/captain
|
_app_preset_type = /datum/modular_computer_app_presets/captain
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/command/hop
|
/obj/item/modular_computer/console/preset/command/hop
|
||||||
name = "command console"
|
name = "command console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/command/hop
|
_app_preset_type = /datum/modular_computer_app_presets/command/hop
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
// Security
|
// Security
|
||||||
/obj/item/modular_computer/console/preset/security/
|
/obj/item/modular_computer/console/preset/security
|
||||||
name = "security console"
|
name = "security console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/security
|
_app_preset_type = /datum/modular_computer_app_presets/security
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/security/investigations
|
/obj/item/modular_computer/console/preset/security/investigations
|
||||||
name = "investigations console"
|
name = "investigations console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/security/investigations
|
_app_preset_type = /datum/modular_computer_app_presets/security/investigations
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/security/hos
|
/obj/item/modular_computer/console/preset/security/hos
|
||||||
name = "head of security's console"
|
name = "head of security's console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/security/hos
|
_app_preset_type = /datum/modular_computer_app_presets/security/hos
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
// Civilian
|
// Civilian
|
||||||
/obj/item/modular_computer/console/preset/civilian/
|
/obj/item/modular_computer/console/preset/civilian
|
||||||
name = "civilian console"
|
name = "civilian console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/civilian
|
_app_preset_type = /datum/modular_computer_app_presets/civilian
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
// Supply
|
// Supply
|
||||||
/obj/item/modular_computer/console/preset/supply/
|
/obj/item/modular_computer/console/preset/supply
|
||||||
name = "supply console"
|
name = "supply console"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/supply
|
_app_preset_type = /datum/modular_computer_app_presets/supply
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/supply/install_default_hardware()
|
/obj/item/modular_computer/console/preset/supply/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
nano_printer.max_paper = 25
|
nano_printer.max_paper = 25
|
||||||
nano_printer.stored_paper = 20
|
nano_printer.stored_paper = 20
|
||||||
card_slot = new/obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
// ERT
|
// ERT
|
||||||
/obj/item/modular_computer/console/preset/ert/install_default_hardware()
|
/obj/item/modular_computer/console/preset/ert/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
ai_slot = new/obj/item/computer_hardware/ai_slot(src)
|
ai_slot = new /obj/item/computer_hardware/ai_slot(src)
|
||||||
nano_printer.max_paper = 25
|
nano_printer.max_paper = 25
|
||||||
nano_printer.stored_paper = 20
|
nano_printer.stored_paper = 20
|
||||||
card_slot = new/obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/ert/
|
/obj/item/modular_computer/console/preset/ert
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/ert
|
_app_preset_type = /datum/modular_computer_app_presets/ert
|
||||||
enrolled = 2
|
enrolled = 2
|
||||||
computer_emagged = TRUE
|
computer_emagged = TRUE
|
||||||
|
|
||||||
// Mercenary
|
// Mercenary
|
||||||
/obj/item/modular_computer/console/preset/mercenary/
|
/obj/item/modular_computer/console/preset/mercenary
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/merc
|
_app_preset_type = /datum/modular_computer_app_presets/merc
|
||||||
computer_emagged = TRUE
|
computer_emagged = TRUE
|
||||||
enrolled = 2
|
enrolled = 2
|
||||||
|
|
||||||
/obj/item/modular_computer/console/preset/mercenary/install_default_hardware()
|
/obj/item/modular_computer/console/preset/mercenary/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
ai_slot = new/obj/item/computer_hardware/ai_slot(src)
|
ai_slot = new /obj/item/computer_hardware/ai_slot(src)
|
||||||
card_slot = new/obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
|
|
||||||
// Merchant
|
// Merchant
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/obj/item/modular_computer/laptop/preset
|
/obj/item/modular_computer/laptop/preset
|
||||||
anchored = 0
|
anchored = FALSE
|
||||||
screen_on = 0
|
screen_on = FALSE
|
||||||
icon_state = "laptop-closed"
|
icon_state = "laptop-closed"
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/install_default_hardware()
|
/obj/item/modular_computer/laptop/preset/install_default_hardware()
|
||||||
@@ -18,31 +18,31 @@
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
// Engineering
|
// Engineering
|
||||||
/obj/item/modular_computer/laptop/preset/engineering/
|
/obj/item/modular_computer/laptop/preset/engineering
|
||||||
name = "engineering laptop"
|
name = "engineering laptop"
|
||||||
desc = "A portable computer belonging to the engineering department. It appears to have been used as a door stop at one point or another."
|
desc = "A portable computer belonging to the engineering department. It appears to have been used as a door stop at one point or another."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/engineering
|
_app_preset_type = /datum/modular_computer_app_presets/engineering
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/engineering/ce/
|
/obj/item/modular_computer/laptop/preset/engineering/ce
|
||||||
name = "chief engineer's laptop"
|
name = "chief engineer's laptop"
|
||||||
desc = "A portable computer belonging to the chief engineer."
|
desc = "A portable computer belonging to the chief engineer."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/engineering/ce
|
_app_preset_type = /datum/modular_computer_app_presets/engineering/ce
|
||||||
|
|
||||||
// Medical
|
// Medical
|
||||||
/obj/item/modular_computer/laptop/preset/medical/
|
/obj/item/modular_computer/laptop/preset/medical
|
||||||
name = "medical laptop"
|
name = "medical laptop"
|
||||||
desc = "A portable computer belonging to the medical department."
|
desc = "A portable computer belonging to the medical department."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/medical
|
_app_preset_type = /datum/modular_computer_app_presets/medical
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/medical/cmo/
|
/obj/item/modular_computer/laptop/preset/medical/cmo
|
||||||
name = "chief medical officer's laptop"
|
name = "chief medical officer's laptop"
|
||||||
desc = "A portable computer belonging to the chief medical officer."
|
desc = "A portable computer belonging to the chief medical officer."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/medical/cmo
|
_app_preset_type = /datum/modular_computer_app_presets/medical/cmo
|
||||||
|
|
||||||
// Research
|
// Research
|
||||||
/obj/item/modular_computer/laptop/preset/research/
|
/obj/item/modular_computer/laptop/preset/research
|
||||||
name = "research laptop"
|
name = "research laptop"
|
||||||
desc = "A portable computer belonging to the research department."
|
desc = "A portable computer belonging to the research department."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/research
|
_app_preset_type = /datum/modular_computer_app_presets/research
|
||||||
@@ -52,18 +52,18 @@
|
|||||||
..()
|
..()
|
||||||
ai_slot = new /obj/item/computer_hardware/ai_slot(src)
|
ai_slot = new /obj/item/computer_hardware/ai_slot(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/research/rd/
|
/obj/item/modular_computer/laptop/preset/research/rd
|
||||||
name = "research director's laptop"
|
name = "research director's laptop"
|
||||||
desc = "A portable computer belonging to the research director. The edges are stained and partially melted."
|
desc = "A portable computer belonging to the research director. The edges are stained and partially melted."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/research/rd
|
_app_preset_type = /datum/modular_computer_app_presets/research/rd
|
||||||
|
|
||||||
// Command
|
// Command
|
||||||
/obj/item/modular_computer/laptop/preset/command/
|
/obj/item/modular_computer/laptop/preset/command
|
||||||
name = "command laptop"
|
name = "command laptop"
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/command
|
_app_preset_type = /datum/modular_computer_app_presets/command
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/command/hop/
|
/obj/item/modular_computer/laptop/preset/command/hop
|
||||||
name = "head of personnel's laptop"
|
name = "head of personnel's laptop"
|
||||||
desc = "A portable computer beloning to the head of personnel. The fan is filled with dog hair."
|
desc = "A portable computer beloning to the head of personnel. The fan is filled with dog hair."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/command/hop
|
_app_preset_type = /datum/modular_computer_app_presets/command/hop
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
..()
|
..()
|
||||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/command/captain/
|
/obj/item/modular_computer/laptop/preset/command/captain
|
||||||
name = "captain's laptop"
|
name = "captain's laptop"
|
||||||
desc = "A portable computer belonging to the captain."
|
desc = "A portable computer belonging to the captain."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/captain
|
_app_preset_type = /datum/modular_computer_app_presets/captain
|
||||||
@@ -82,31 +82,31 @@
|
|||||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
|
|
||||||
// Security
|
// Security
|
||||||
/obj/item/modular_computer/laptop/preset/security/
|
/obj/item/modular_computer/laptop/preset/security
|
||||||
name = "security laptop"
|
name = "security laptop"
|
||||||
desc = "A portable computer belonging to the security department."
|
desc = "A portable computer belonging to the security department."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/security
|
_app_preset_type = /datum/modular_computer_app_presets/security
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/laptop/preset/security/hos/
|
/obj/item/modular_computer/laptop/preset/security/hos
|
||||||
name = "head of security's laptop"
|
name = "head of security's laptop"
|
||||||
desc = "A portable computer belonging to the head of security. It smells faintly of gunpowder."
|
desc = "A portable computer belonging to the head of security. It smells faintly of gunpowder."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/security/hos
|
_app_preset_type = /datum/modular_computer_app_presets/security/hos
|
||||||
|
|
||||||
// Civilian
|
// Civilian
|
||||||
/obj/item/modular_computer/laptop/preset/civilian/
|
/obj/item/modular_computer/laptop/preset/civilian
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/civilian
|
_app_preset_type = /datum/modular_computer_app_presets/civilian
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
// Supply
|
// Supply
|
||||||
/obj/item/modular_computer/laptop/preset/supply/
|
/obj/item/modular_computer/laptop/preset/supply
|
||||||
name = "supply laptop"
|
name = "supply laptop"
|
||||||
desc = "A portable computer belonging to cargo."
|
desc = "A portable computer belonging to cargo."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/supply
|
_app_preset_type = /datum/modular_computer_app_presets/supply
|
||||||
enrolled = TRUE
|
enrolled = TRUE
|
||||||
|
|
||||||
// Representative
|
// Representative
|
||||||
/obj/item/modular_computer/laptop/preset/representative/
|
/obj/item/modular_computer/laptop/preset/representative
|
||||||
name = "representative's laptop"
|
name = "representative's laptop"
|
||||||
desc = "A portable computer belonging to the representative's office."
|
desc = "A portable computer belonging to the representative's office."
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/representative
|
_app_preset_type = /datum/modular_computer_app_presets/representative
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
hard_drive = new /obj/item/computer_hardware/hard_drive(src)
|
hard_drive = new /obj/item/computer_hardware/hard_drive(src)
|
||||||
network_card = new /obj/item/computer_hardware/network_card/advanced(src)
|
network_card = new /obj/item/computer_hardware/network_card/advanced(src)
|
||||||
|
|
||||||
|
|
||||||
/obj/item/modular_computer/silicon/preset/install_default_programs()
|
/obj/item/modular_computer/silicon/preset/install_default_programs()
|
||||||
hard_drive.store_file(new /datum/computer_file/program/filemanager())
|
hard_drive.store_file(new /datum/computer_file/program/filemanager())
|
||||||
hard_drive.store_file(new /datum/computer_file/program/ntnetdownload())
|
hard_drive.store_file(new /datum/computer_file/program/ntnetdownload())
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
/obj/item/modular_computer/tablet/preset/custom_loadout/cheap/install_default_hardware()
|
/obj/item/modular_computer/tablet/preset/custom_loadout/cheap/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
processor_unit = new/obj/item/computer_hardware/processor_unit/small(src)
|
processor_unit = new /obj/item/computer_hardware/processor_unit/small(src)
|
||||||
hard_drive = new/obj/item/computer_hardware/hard_drive/micro(src)
|
hard_drive = new /obj/item/computer_hardware/hard_drive/micro(src)
|
||||||
network_card = new/obj/item/computer_hardware/network_card(src)
|
network_card = new /obj/item/computer_hardware/network_card(src)
|
||||||
battery_module = new/obj/item/computer_hardware/battery_module/nano(src)
|
battery_module = new /obj/item/computer_hardware/battery_module/nano(src)
|
||||||
battery_module.charge_to_full()
|
battery_module.charge_to_full()
|
||||||
|
|
||||||
/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/install_default_hardware()
|
/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/install_default_hardware()
|
||||||
..()
|
..()
|
||||||
processor_unit = new/obj/item/computer_hardware/processor_unit/small(src)
|
processor_unit = new /obj/item/computer_hardware/processor_unit/small(src)
|
||||||
hard_drive = new/obj/item/computer_hardware/hard_drive/small(src)
|
hard_drive = new /obj/item/computer_hardware/hard_drive/small(src)
|
||||||
network_card = new/obj/item/computer_hardware/network_card(src)
|
network_card = new /obj/item/computer_hardware/network_card(src)
|
||||||
nano_printer = new/obj/item/computer_hardware/nano_printer(src)
|
nano_printer = new /obj/item/computer_hardware/nano_printer(src)
|
||||||
card_slot = new/obj/item/computer_hardware/card_slot(src)
|
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||||
battery_module = new/obj/item/computer_hardware/battery_module(src)
|
battery_module = new /obj/item/computer_hardware/battery_module(src)
|
||||||
battery_module.charge_to_full()
|
battery_module.charge_to_full()
|
||||||
|
|
||||||
|
|
||||||
// Cargo Delivery
|
// Cargo Delivery
|
||||||
/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/cargo_delivery/
|
/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/cargo_delivery
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/cargo_delivery
|
_app_preset_type = /datum/modular_computer_app_presets/cargo_delivery
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
@@ -5,10 +5,10 @@
|
|||||||
hard_drive = new/obj/item/computer_hardware/hard_drive(src)
|
hard_drive = new/obj/item/computer_hardware/hard_drive(src)
|
||||||
network_card = new/obj/item/computer_hardware/network_card(src)
|
network_card = new/obj/item/computer_hardware/network_card(src)
|
||||||
|
|
||||||
/obj/item/modular_computer/telescreen/preset/generic/
|
/obj/item/modular_computer/telescreen/preset/generic
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/wall_generic
|
_app_preset_type = /datum/modular_computer_app_presets/wall_generic
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
|
|
||||||
/obj/item/modular_computer/telescreen/preset/trashcompactor/
|
/obj/item/modular_computer/telescreen/preset/trashcompactor
|
||||||
_app_preset_type = /datum/modular_computer_app_presets/trashcompactor
|
_app_preset_type = /datum/modular_computer_app_presets/trashcompactor
|
||||||
enrolled = 1
|
enrolled = TRUE
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
var/global/file_uid = 0
|
var/global/file_uid = 0
|
||||||
|
|
||||||
/datum/computer_file/
|
/datum/computer_file
|
||||||
var/filename = "NewFile" // Placeholder. No spacebars
|
var/filename = "NewFile" // Placehard_drive. No spacebars
|
||||||
var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
|
var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
|
||||||
var/size = 1 // File size in GQ. Integers only!
|
var/size = 1 // File size in GQ. Integers only!
|
||||||
var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file.
|
var/obj/item/computer_hardware/hard_drive/hard_drive // Harddrive that contains this file.
|
||||||
var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means.
|
var/unsendable = FALSE // Whether the file may be sent to someone via NTNet transfer or other means.
|
||||||
var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
|
var/undeletable = FALSE // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
|
||||||
var/password = "" // Placeholder for password protected files.
|
var/password = "" // Placeholder for password protected files.
|
||||||
var/uid // UID of this file
|
var/uid // UID of this file
|
||||||
|
|
||||||
@@ -16,18 +16,18 @@ var/global/file_uid = 0
|
|||||||
file_uid++
|
file_uid++
|
||||||
|
|
||||||
/datum/computer_file/Destroy()
|
/datum/computer_file/Destroy()
|
||||||
if(!holder)
|
if(!hard_drive)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
holder.remove_file(src)
|
hard_drive.remove_file(src)
|
||||||
// holder.holder is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it.
|
// hard_drive.hard_drive is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it.
|
||||||
if(holder.holder2 && holder.holder2.active_program == src)
|
if(hard_drive.parent_computer?.active_program == src)
|
||||||
holder.holder2.kill_program(1)
|
hard_drive.parent_computer.kill_program(TRUE)
|
||||||
holder = null
|
hard_drive = null
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
// Returns independent copy of this file.
|
// Returns independent copy of this file.
|
||||||
/datum/computer_file/proc/clone(var/rename = 0)
|
/datum/computer_file/proc/clone(var/rename = FALSE)
|
||||||
var/datum/computer_file/temp = new type
|
var/datum/computer_file/temp = new type
|
||||||
temp.unsendable = unsendable
|
temp.unsendable = unsendable
|
||||||
temp.undeletable = undeletable
|
temp.undeletable = undeletable
|
||||||
@@ -44,9 +44,9 @@ var/global/file_uid = 0
|
|||||||
if(!password)
|
if(!password)
|
||||||
return TRUE
|
return TRUE
|
||||||
else
|
else
|
||||||
if (!input_password)
|
if(!input_password)
|
||||||
input_password = sanitize(input(user, "Please enter a password to access file '[filename]':"))
|
input_password = sanitize(input(user, "Please enter a password to access file '[filename]':"))
|
||||||
if (input_password == password)
|
if(input_password == password)
|
||||||
return TRUE
|
return TRUE
|
||||||
else
|
else
|
||||||
return FALSE
|
return FALSE
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
var/stored_data = "" // Stored data in string format.
|
var/stored_data = "" // Stored data in string format.
|
||||||
filetype = "DAT"
|
filetype = "DAT"
|
||||||
var/block_size = 1500
|
var/block_size = 1500
|
||||||
var/do_not_edit = 0 // Whether the user will be reminded that the file probably shouldn't be edited.
|
var/do_not_edit = FALSE // Whether the user will be reminded that the file probably shouldn't be edited.
|
||||||
|
|
||||||
/datum/computer_file/data/clone()
|
/datum/computer_file/data/clone()
|
||||||
var/datum/computer_file/data/temp = ..()
|
var/datum/computer_file/data/temp = ..()
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
filetype = "XNML"
|
filetype = "XNML"
|
||||||
filename = "Unknown News Entry"
|
filename = "Unknown News Entry"
|
||||||
block_size = 2000 // Results in smaller files
|
block_size = 2000 // Results in smaller files
|
||||||
do_not_edit = 1 // Editing the file breaks most formatting due to some HTML tags not being accepted as input from average user.
|
do_not_edit = TRUE // Editing the file breaks most formatting due to some HTML tags not being accepted as input from average user.
|
||||||
var/server_file_path // File path to HTML file that will be loaded on server start. Example: '/news_articles/space_magazine_1.html'. Use the /news_articles/ folder!
|
var/server_file_path // File path to HTML file that will be loaded on server start. Example: '/news_articles/space_magazine_1.html'. Use the /news_articles/ folder!
|
||||||
var/archived // Set to 1 for older stuff
|
var/archived // Set to 1 for older stuff
|
||||||
|
|
||||||
/datum/computer_file/data/news_article/New(var/load_from_file = 0)
|
/datum/computer_file/data/news_article/New(var/load_from_file = FALSE)
|
||||||
..()
|
..()
|
||||||
if(server_file_path && load_from_file)
|
if(server_file_path && load_from_file)
|
||||||
stored_data = file2text(server_file_path)
|
stored_data = file2text(server_file_path)
|
||||||
|
|||||||
@@ -2,29 +2,29 @@
|
|||||||
/datum/computer_file/program
|
/datum/computer_file/program
|
||||||
filetype = "PRG"
|
filetype = "PRG"
|
||||||
filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET!
|
filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET!
|
||||||
var/required_access_run = null // List of required accesses to run the program.
|
var/required_access_run // List of required accesses to run the program.
|
||||||
var/required_access_download = null // List of required accesses to download the program.
|
var/required_access_download // List of required accesses to download the program.
|
||||||
var/requires_access_to_run = PROGRAM_ACCESS_ONE // Whether the program checks for required_access when run. (1 = requires single access, 2 = requires single access from list, 3 = requires all access from list)
|
var/requires_access_to_run = PROGRAM_ACCESS_ONE // Whether the program checks for required_access when run. (1 = requires single access, 2 = requires single access from list, 3 = requires all access from list)
|
||||||
var/requires_access_to_download = PROGRAM_ACCESS_ONE // Whether the program checks for required_access when downloading. (1 = requires single access, 2 = requires single access from list, 3 = requires all access from list)
|
var/requires_access_to_download = PROGRAM_ACCESS_ONE // Whether the program checks for required_access when downloading. (1 = requires single access, 2 = requires single access from list, 3 = requires all access from list)
|
||||||
var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact.
|
var/datum/nano_module/NM // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact.
|
||||||
var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program.
|
var/nanomodule_path // Path to nanomodule, make sure to set this if implementing new program.
|
||||||
var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running.
|
var/program_state = PROGRAM_STATE_KILLED // PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running.
|
||||||
var/obj/item/modular_computer/computer // Device that runs this program.
|
var/obj/item/modular_computer/computer // Device that runs this program.
|
||||||
var/filedesc = "Unknown Program" // User-friendly name of this program.
|
var/filedesc = "Unknown Program" // User-friendly name of this program.
|
||||||
var/extended_desc = "N/A" // Short description of this program's function.
|
var/extended_desc = "N/A" // Short description of this program's function.
|
||||||
var/program_icon_state = null // Program-specific screen icon state
|
var/program_icon_state // Program-specific screen icon state
|
||||||
var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes.
|
var/requires_ntnet = FALSE // Set to TRUE for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes.
|
||||||
var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION)
|
var/requires_ntnet_feature = FALSE // Optional, if above is set to TRUE checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION)
|
||||||
var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
|
var/ntnet_status = TRUE // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
|
||||||
var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
||||||
var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging.
|
var/network_destination // Optional string that describes what NTNet server/system this program connects to. Used in default logging.
|
||||||
var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable.
|
var/available_on_ntnet = TRUE // Whether the program can be downloaded from NTNet. Set to 0 to disable.
|
||||||
var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
|
var/available_on_syndinet = FALSE // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
|
||||||
var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick
|
var/computer_emagged = FALSE // Set to TRUE if computer that's running us was emagged. Computer updates this every Process() tick
|
||||||
var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
|
var/ui_header // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
|
||||||
var/color = "#FFFFFF" // The color of light the computer should emit when this program is open.
|
var/color = "#FFFFFF" // The color of light the computer should emit when this program is open.
|
||||||
|
|
||||||
/datum/computer_file/program/New(var/obj/item/modular_computer/comp = null)
|
/datum/computer_file/program/New(var/obj/item/modular_computer/comp)
|
||||||
..()
|
..()
|
||||||
if(comp && istype(comp))
|
if(comp && istype(comp))
|
||||||
computer = comp
|
computer = comp
|
||||||
@@ -57,29 +57,29 @@
|
|||||||
/datum/computer_file/program/proc/generate_network_log(var/text)
|
/datum/computer_file/program/proc/generate_network_log(var/text)
|
||||||
if(computer)
|
if(computer)
|
||||||
return computer.add_log(text)
|
return computer.add_log(text)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/datum/computer_file/program/proc/is_supported_by_hardware(var/hardware_flag = 0, var/loud = 0, var/mob/user = null)
|
/datum/computer_file/program/proc/is_supported_by_hardware(var/hardware_flag = 0, var/loud = FALSE, var/mob/user)
|
||||||
if(!(hardware_flag & usage_flags))
|
if(!(hardware_flag & usage_flags))
|
||||||
if(loud && computer && user)
|
if(loud && computer && user)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Hardware Error - Incompatible software\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Hardware Error - Incompatible software\"."))
|
||||||
return 0
|
return FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/computer_file/program/proc/get_signal(var/specific_action = 0)
|
/datum/computer_file/program/proc/get_signal(var/specific_action = 0)
|
||||||
if(computer)
|
if(computer)
|
||||||
return computer.get_ntnet_status(specific_action)
|
return computer.get_ntnet_status(specific_action)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// Called by Process() on device that runs us, once every tick.
|
// Called by Process() on device that runs us, once every tick.
|
||||||
/datum/computer_file/program/proc/process_tick()
|
/datum/computer_file/program/proc/process_tick()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// Check if the user can run program. Only humans can operate computer. Automatically called in run_program()
|
// Check if the user can run program. Only humans can operate computer. Automatically called in run_program()
|
||||||
// User has to wear their ID or have it inhand for ID Scan to work.
|
// User has to wear their ID or have it inhand for ID Scan to work.
|
||||||
// Can also be called manually, with optional parameter being access_to_check to scan the user's ID
|
// Can also be called manually, with optional parameter being access_to_check to scan the user's ID
|
||||||
// Check type determines how the access should be checked PROGRAM_ACCESS_ONE, PROGRAM_ACCESS_LIST_ONE, PROGRAM_ACCESS_LIST_ALL
|
// Check type determines how the access should be checked PROGRAM_ACCESS_ONE, PROGRAM_ACCESS_LIST_ONE, PROGRAM_ACCESS_LIST_ALL
|
||||||
/datum/computer_file/program/proc/can_run(var/mob/user, var/loud = 0, var/access_to_check, var/check_type)
|
/datum/computer_file/program/proc/can_run(var/mob/user, var/loud = FALSE, var/access_to_check, var/check_type)
|
||||||
// Defaults to required_access_run
|
// Defaults to required_access_run
|
||||||
if(!access_to_check)
|
if(!access_to_check)
|
||||||
access_to_check = required_access_run
|
access_to_check = required_access_run
|
||||||
@@ -90,44 +90,43 @@
|
|||||||
|
|
||||||
// No required_access, allow it.
|
// No required_access, allow it.
|
||||||
if(!access_to_check || !requires_access_to_run)
|
if(!access_to_check || !requires_access_to_run)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(!istype(user))
|
if(!istype(user))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
var/obj/item/card/id/I = user.GetIdCard()
|
var/obj/item/card/id/I = user.GetIdCard()
|
||||||
if(!I)
|
if(!I)
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"RFID Error - Unable to scan ID.\"."))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(check_type == PROGRAM_ACCESS_ONE) //Check for single access
|
if(check_type == PROGRAM_ACCESS_ONE) //Check for single access
|
||||||
if(access_to_check in I.access)
|
if(access_to_check in I.access)
|
||||||
return 1
|
return TRUE
|
||||||
else if(loud)
|
else if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
|
return FALSE
|
||||||
else if(check_type == PROGRAM_ACCESS_LIST_ONE)
|
else if(check_type == PROGRAM_ACCESS_LIST_ONE)
|
||||||
for(var/check in access_to_check) //Loop through all the accesse's to check
|
for(var/check in access_to_check) //Loop through all the accesse's to check
|
||||||
if(check in I.access) //Success on first match
|
if(check in I.access) //Success on first match
|
||||||
return 1
|
return TRUE
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
else if(check_type == PROGRAM_ACCESS_LIST_ALL)
|
else if(check_type == PROGRAM_ACCESS_LIST_ALL)
|
||||||
for(var/check in access_to_check) //Loop through all the accesse's to check
|
for(var/check in access_to_check) //Loop through all the accesse's to check
|
||||||
if(!check in I.access) //Fail on first miss
|
if(!check in I.access) //Fail on first miss
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
return 0
|
return FALSE
|
||||||
else // Should never happen - So fail silently
|
else // Should never happen - So fail silently
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Check if the user can run program. Only humans can operate computer. Automatically called in run_program()
|
// Check if the user can run program. Only humans can operate computer. Automatically called in run_program()
|
||||||
// User has to wear their ID or have it inhand for ID Scan to work.
|
// User has to wear their ID or have it inhand for ID Scan to work.
|
||||||
// Can also be called manually, with optional parameter being access_to_check to scan the user's ID
|
// Can also be called manually, with optional parameter being access_to_check to scan the user's ID
|
||||||
// Check type determines how the access should be checked PROGRAM_ACCESS_ONE, PROGRAM_ACCESS_LIST_ONE, PROGRAM_ACCESS_LIST_ALL
|
// Check type determines how the access should be checked PROGRAM_ACCESS_ONE, PROGRAM_ACCESS_LIST_ONE, PROGRAM_ACCESS_LIST_ALL
|
||||||
/datum/computer_file/program/proc/can_download(var/mob/user, var/loud = 0, var/access_to_check, var/check_type)
|
/datum/computer_file/program/proc/can_download(var/mob/user, var/loud = FALSE, var/access_to_check, var/check_type)
|
||||||
// Defaults to required_access_run
|
// Defaults to required_access_run
|
||||||
if(!access_to_check)
|
if(!access_to_check)
|
||||||
access_to_check = required_access_download
|
access_to_check = required_access_download
|
||||||
@@ -138,36 +137,38 @@
|
|||||||
|
|
||||||
// No required_access, allow it.
|
// No required_access, allow it.
|
||||||
if(!access_to_check || !requires_access_to_download)
|
if(!access_to_check || !requires_access_to_download)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(!istype(user))
|
if(!istype(user))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
var/obj/item/card/id/I = user.GetIdCard()
|
var/obj/item/card/id/I = user.GetIdCard()
|
||||||
if(!I)
|
if(!I)
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"RFID Error - Unable to scan ID.\"."))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(check_type == PROGRAM_ACCESS_ONE) //Check for single access
|
if(check_type == PROGRAM_ACCESS_ONE) //Check for single access
|
||||||
if(access_to_check in I.access)
|
if(access_to_check in I.access)
|
||||||
return 1
|
return TRUE
|
||||||
else if(loud)
|
else if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
|
return FALSE
|
||||||
else if(check_type == PROGRAM_ACCESS_LIST_ONE)
|
else if(check_type == PROGRAM_ACCESS_LIST_ONE)
|
||||||
for(var/check in access_to_check) //Loop through all the accesse's to check
|
for(var/check in access_to_check) //Loop through all the accesse's to check
|
||||||
if(check in I.access) //Success on first match
|
if(check in I.access) //Success on first match
|
||||||
return 1
|
return TRUE
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
|
return FALSE
|
||||||
else if(check_type == PROGRAM_ACCESS_LIST_ALL)
|
else if(check_type == PROGRAM_ACCESS_LIST_ALL)
|
||||||
for(var/check in access_to_check) //Loop through all the accesse's to check
|
for(var/check in access_to_check) //Loop through all the accesse's to check
|
||||||
if(!check in I.access) //Fail on first miss
|
if(!check in I.access) //Fail on first miss
|
||||||
if(loud)
|
if(loud)
|
||||||
to_chat(user, "<span class='danger'>\The [computer] flashes an \"Access Denied\" warning.</span>")
|
to_chat(user, SPAN_WARNING("\The [computer] flashes, \"Access Denied.\"."))
|
||||||
return 0
|
return FALSE
|
||||||
else // Should never happen - So fail silently
|
else // Should never happen - So fail silently
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones
|
// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones
|
||||||
// always include the device here in this proc. This proc basically relays the request to whatever is running the program.
|
// always include the device here in this proc. This proc basically relays the request to whatever is running the program.
|
||||||
@@ -184,8 +185,8 @@
|
|||||||
if(requires_ntnet && network_destination)
|
if(requires_ntnet && network_destination)
|
||||||
generate_network_log("Connection opened to [network_destination].")
|
generate_network_log("Connection opened to [network_destination].")
|
||||||
program_state = PROGRAM_STATE_ACTIVE
|
program_state = PROGRAM_STATE_ACTIVE
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client.
|
// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client.
|
||||||
/datum/computer_file/program/proc/kill_program(var/forced = 0)
|
/datum/computer_file/program/proc/kill_program(var/forced = 0)
|
||||||
@@ -195,7 +196,7 @@
|
|||||||
if(NM)
|
if(NM)
|
||||||
qdel(NM)
|
qdel(NM)
|
||||||
NM = null
|
NM = null
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation.
|
// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation.
|
||||||
// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable.
|
// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable.
|
||||||
@@ -206,8 +207,8 @@
|
|||||||
return computer.ui_interact(user)
|
return computer.ui_interact(user)
|
||||||
if(istype(NM))
|
if(istype(NM))
|
||||||
NM.ui_interact(user, ui_key, null, force_open)
|
NM.ui_interact(user, ui_key, null, force_open)
|
||||||
return 0
|
return FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC:
|
// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC:
|
||||||
@@ -217,7 +218,7 @@
|
|||||||
// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE.
|
// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE.
|
||||||
/datum/computer_file/program/Topic(href, href_list)
|
/datum/computer_file/program/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(computer)
|
if(computer)
|
||||||
return computer.Topic(href, href_list)
|
return computer.Topic(href, href_list)
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
|
|
||||||
// Called when the computer fails due to power loss. Override when program wants to specifically react to power loss.
|
// Called when the computer fails due to power loss. Override when program wants to specifically react to power loss.
|
||||||
/datum/computer_file/program/proc/event_powerfailure(var/background)
|
/datum/computer_file/program/proc/event_powerfailure(var/background)
|
||||||
kill_program(1)
|
kill_program(TRUE)
|
||||||
|
|
||||||
// Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met.
|
// Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met.
|
||||||
/datum/computer_file/program/proc/event_networkfailure(var/background)
|
/datum/computer_file/program/proc/event_networkfailure(var/background)
|
||||||
kill_program(1)
|
kill_program(TRUE)
|
||||||
if(background)
|
if(background)
|
||||||
computer.visible_message("<span class='danger'>\The [computer]'s screen displays an \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error</span>")
|
computer.visible_message(FONT_SMALL(SPAN_WARNING("\The [computer]'s screen displays, \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error")), range = 2)
|
||||||
else
|
else
|
||||||
computer.visible_message("<span class='danger'>\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.</span>")
|
computer.visible_message(FONT_SMALL(SPAN_WARNING("\The [computer]'s screen briefly freezes and then shows, \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.")), range = 2)
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
/datum/nano_module/program
|
/datum/nano_module/program
|
||||||
available_to_ai = FALSE
|
available_to_ai = FALSE
|
||||||
var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null.
|
var/datum/computer_file/program/program // Program-Based computer program that runs this nano module. Defaults to null.
|
||||||
|
|
||||||
/datum/nano_module/program/New(var/host, var/topic_manager, var/program)
|
/datum/nano_module/program/New(var/host, var/topic_manager, var/program)
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
program_icon_state = "hostile"
|
program_icon_state = "hostile"
|
||||||
extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against the same relay for increased effect."
|
extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against the same relay for increased effect."
|
||||||
size = 20
|
size = 20
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 0
|
available_on_ntnet = FALSE
|
||||||
available_on_syndinet = 1
|
available_on_syndinet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_dos/
|
nanomodule_path = /datum/nano_module/program/computer_dos
|
||||||
var/obj/machinery/ntnet_relay/target = null
|
var/obj/machinery/ntnet_relay/target
|
||||||
var/dos_speed = 0
|
var/dos_speed = 0
|
||||||
var/error = ""
|
var/error = ""
|
||||||
var/executed = 0
|
var/executed = FALSE
|
||||||
color = LIGHT_COLOR_RED
|
color = LIGHT_COLOR_RED
|
||||||
|
|
||||||
/datum/computer_file/program/ntnet_dos/process_tick()
|
/datum/computer_file/program/ntnet_dos/process_tick()
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
if(target)
|
if(target)
|
||||||
target.dos_sources.Remove(src)
|
target.dos_sources.Remove(src)
|
||||||
target = null
|
target = null
|
||||||
executed = 0
|
executed = FALSE
|
||||||
|
|
||||||
..(forced)
|
..(forced)
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
if(PRG.error)
|
if(PRG.error)
|
||||||
data["error"] = PRG.error
|
data["error"] = PRG.error
|
||||||
else if(PRG.target && PRG.executed)
|
else if(PRG.target && PRG.executed)
|
||||||
data["target"] = 1
|
data["target"] = TRUE
|
||||||
data["speed"] = PRG.dos_speed
|
data["speed"] = PRG.dos_speed
|
||||||
|
|
||||||
// This is mostly visual, generate some strings of 1s and 0s
|
// This is mostly visual, generate some strings of 1s and 0s
|
||||||
@@ -61,9 +61,9 @@
|
|||||||
// Combined with UI updates this adds quite nice effect to the UI
|
// Combined with UI updates this adds quite nice effect to the UI
|
||||||
var/percentage = PRG.target.dos_overload * 100 / PRG.target.dos_capacity
|
var/percentage = PRG.target.dos_overload * 100 / PRG.target.dos_capacity
|
||||||
var/list/strings[0]
|
var/list/strings[0]
|
||||||
for(var/j, j<10, j++)
|
for(var/j, j < 10, j++)
|
||||||
var/string = ""
|
var/string = ""
|
||||||
for(var/i, i<20, i++)
|
for(var/i, i < 20, i++)
|
||||||
string = "[string][prob(percentage)]"
|
string = "[string][prob(percentage)]"
|
||||||
strings.Add(string)
|
strings.Add(string)
|
||||||
data["dos_strings"] = strings
|
data["dos_strings"] = strings
|
||||||
@@ -77,31 +77,31 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 400, 250, state = state)
|
ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 400, 250, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
/datum/computer_file/program/ntnet_dos/Topic(href, href_list)
|
/datum/computer_file/program/ntnet_dos/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_target_relay"])
|
if(href_list["PRG_target_relay"])
|
||||||
for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays)
|
for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays)
|
||||||
if("[R.uid]" == href_list["PRG_target_relay"])
|
if("[R.uid]" == href_list["PRG_target_relay"])
|
||||||
target = R
|
target = R
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_reset"])
|
if(href_list["PRG_reset"])
|
||||||
if(target)
|
if(target)
|
||||||
target.dos_sources.Remove(src)
|
target.dos_sources.Remove(src)
|
||||||
target = null
|
target = null
|
||||||
executed = 0
|
executed = FALSE
|
||||||
error = ""
|
error = ""
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_execute"])
|
if(href_list["PRG_execute"])
|
||||||
if(target)
|
if(target)
|
||||||
executed = 1
|
executed = TRUE
|
||||||
target.dos_sources.Add(src)
|
target.dos_sources.Add(src)
|
||||||
if(ntnet_global.intrusion_detection_enabled)
|
if(ntnet_global.intrusion_detection_enabled)
|
||||||
ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]")
|
ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]")
|
||||||
ntnet_global.intrusion_detection_alarm = 1
|
ntnet_global.intrusion_detection_alarm = TRUE
|
||||||
return 1
|
return TRUE
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
filedesc = "Camera Decryption Tool"
|
filedesc = "Camera Decryption Tool"
|
||||||
nanomodule_path = /datum/nano_module/camera_monitor/hacked
|
nanomodule_path = /datum/nano_module/camera_monitor/hacked
|
||||||
program_icon_state = "hostile"
|
program_icon_state = "hostile"
|
||||||
extended_desc = "This very advanced piece of software uses adaptive programming and large database of cipherkeys to bypass most encryptions used on camera networks. Be warned that system administrator may notice this."
|
extended_desc = "This very advanced piece of software uses adaptive programming and large database of cipherkeys to bypass most encryptions used on camera networks. Be warned that the system administrator may notice this."
|
||||||
size = 73 // Very large, a price for bypassing ID checks completely.
|
size = 8
|
||||||
available_on_ntnet = 0
|
available_on_ntnet = FALSE
|
||||||
available_on_syndinet = 1
|
available_on_syndinet = TRUE
|
||||||
color = LIGHT_COLOR_RED
|
color = LIGHT_COLOR_RED
|
||||||
|
|
||||||
/datum/computer_file/program/camera_monitor/hacked/process_tick()
|
/datum/computer_file/program/camera_monitor/hacked/process_tick()
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
if(HNM.current_network && (HNM.current_network in current_map.station_networks) && prob(0.1))
|
if(HNM.current_network && (HNM.current_network in current_map.station_networks) && prob(0.1))
|
||||||
if(ntnet_global.intrusion_detection_enabled)
|
if(ntnet_global.intrusion_detection_enabled)
|
||||||
ntnet_global.add_log("IDS WARNING - Unauthorised access detected to camera network [HNM.current_network] by device with NID [computer.network_card.get_network_tag()]")
|
ntnet_global.add_log("IDS WARNING - Unauthorised access detected to camera network [HNM.current_network] by device with NID [computer.network_card.get_network_tag()]")
|
||||||
ntnet_global.intrusion_detection_alarm = 1
|
ntnet_global.intrusion_detection_alarm = TRUE
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/camera_monitor/hacked
|
/datum/nano_module/camera_monitor/hacked
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
available_to_ai = FALSE
|
available_to_ai = FALSE
|
||||||
|
|
||||||
/datum/nano_module/camera_monitor/hacked/can_access_network(var/mob/user, var/network_access)
|
/datum/nano_module/camera_monitor/hacked/can_access_network(var/mob/user, var/network_access)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// The hacked variant has access to all commonly used networks.
|
// The hacked variant has access to all commonly used networks.
|
||||||
/datum/nano_module/camera_monitor/hacked/modify_networks_list(var/list/networks)
|
/datum/nano_module/camera_monitor/hacked/modify_networks_list(var/list/networks)
|
||||||
networks.Add(list(list("tag" = NETWORK_CRESCENT, "has_access" = 1)))
|
networks.Add(list(list("tag" = NETWORK_CRESCENT, "has_access" = TRUE)))
|
||||||
return networks
|
return networks
|
||||||
@@ -4,14 +4,14 @@
|
|||||||
program_icon_state = "hostile"
|
program_icon_state = "hostile"
|
||||||
extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution."
|
extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution."
|
||||||
size = 13
|
size = 13
|
||||||
requires_ntnet = 0
|
requires_ntnet = FALSE
|
||||||
available_on_ntnet = 0
|
available_on_ntnet = FALSE
|
||||||
available_on_syndinet = 1
|
available_on_syndinet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/revelation/
|
nanomodule_path = /datum/nano_module/program/revelation
|
||||||
var/armed = 0
|
var/armed = FALSE
|
||||||
color = LIGHT_COLOR_RED
|
color = LIGHT_COLOR_RED
|
||||||
|
|
||||||
/datum/computer_file/program/revelation/run_program(var/mob/living/user)
|
/datum/computer_file/program/revelation/run_program(mob/living/user)
|
||||||
. = ..(user)
|
. = ..(user)
|
||||||
if(armed)
|
if(armed)
|
||||||
activate()
|
activate()
|
||||||
@@ -20,10 +20,10 @@
|
|||||||
if(!computer)
|
if(!computer)
|
||||||
return
|
return
|
||||||
|
|
||||||
computer.visible_message("<span class='notice'>\The [computer]'s screen brightly flashes and emits a loud electrical buzzing.</span>")
|
computer.visible_message(SPAN_NOTICE("\The [computer]'s screen brightly flashes and emits a loud electrical buzzing."))
|
||||||
computer.enabled = 0
|
computer.enabled = FALSE
|
||||||
computer.update_icon()
|
computer.update_icon()
|
||||||
spark(computer.loc, 10, alldirs)
|
spark(get_turf(src), 10, alldirs)
|
||||||
|
|
||||||
if(computer.hard_drive)
|
if(computer.hard_drive)
|
||||||
qdel(computer.hard_drive)
|
qdel(computer.hard_drive)
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
/datum/computer_file/program/revelation/Topic(href, href_list)
|
/datum/computer_file/program/revelation/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
else if(href_list["PRG_arm"])
|
else if(href_list["PRG_arm"])
|
||||||
armed = !armed
|
armed = !armed
|
||||||
else if(href_list["PRG_activate"])
|
else if(href_list["PRG_activate"])
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
if(!newname)
|
if(!newname)
|
||||||
return
|
return
|
||||||
filedesc = newname
|
filedesc = newname
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/computer_file/program/revelation/clone()
|
/datum/computer_file/program/revelation/clone()
|
||||||
var/datum/computer_file/program/revelation/temp = ..()
|
var/datum/computer_file/program/revelation/temp = ..()
|
||||||
@@ -70,8 +70,7 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 400, 250, state = state)
|
ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 400, 250, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
@@ -3,18 +3,18 @@
|
|||||||
filedesc = "Cargo Control"
|
filedesc = "Cargo Control"
|
||||||
extended_desc = "Application to Control Cargo Orders"
|
extended_desc = "Application to Control Cargo Orders"
|
||||||
size = 12
|
size = 12
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 1
|
available_on_ntnet = TRUE
|
||||||
required_access_download = access_hop
|
required_access_download = access_hop
|
||||||
required_access_run = access_cargo
|
required_access_run = access_cargo
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_TELESCREEN
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_TELESCREEN
|
||||||
nanomodule_path = /datum/nano_module/program/civilian/cargocontrol/
|
nanomodule_path = /datum/nano_module/program/civilian/cargocontrol
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargocontrol/
|
/datum/nano_module/program/civilian/cargocontrol
|
||||||
name = "Cargo Control"
|
name = "Cargo Control"
|
||||||
var/page = "overview_main" //overview_main - Main Menu, overview_submitted - Submitted Order Overview, overview_approved - Approved Order Overview, settings - Settings, details - order details, bounties - centcom bounties
|
var/page = "overview_main" //overview_main - Main Menu, overview_submitted - Submitted Order Overview, overview_approved - Approved Order Overview, settings - Settings, details - order details, bounties - centcom bounties
|
||||||
var/last_user_name = "" //Name of the User that last used the computer
|
var/last_user_name = "" //Name of the User that last used the computer
|
||||||
var/status_message = null //A status message that can be displayed
|
var/status_message //A status message that can be displayed
|
||||||
var/list/order_details = list() //Order Details for the order
|
var/list/order_details = list() //Order Details for the order
|
||||||
var/list/shipment_details = list() //Shipment Details for a selected shipment
|
var/list/shipment_details = list() //Shipment Details for a selected shipment
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
if(console)
|
if(console)
|
||||||
data["have_printer"] = !!console.nano_printer
|
data["have_printer"] = !!console.nano_printer
|
||||||
else
|
else
|
||||||
data["have_printer"] = 0
|
data["have_printer"] = FALSE
|
||||||
|
|
||||||
//Shuttle Stuff
|
//Shuttle Stuff
|
||||||
var/datum/shuttle/autodock/ferry/supply/shuttle = SScargo.shuttle
|
var/datum/shuttle/autodock/ferry/supply/shuttle = SScargo.shuttle
|
||||||
@@ -102,19 +102,19 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "cargo_control.tmpl", name, 850, 600, state = state)
|
ui = new(user, src, ui_key, "cargo_control.tmpl", name, 850, 600, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargocontrol/Topic(href, href_list)
|
/datum/nano_module/program/civilian/cargocontrol/Topic(href, href_list)
|
||||||
var/datum/shuttle/autodock/ferry/supply/shuttle = SScargo.shuttle
|
var/datum/shuttle/autodock/ferry/supply/shuttle = SScargo.shuttle
|
||||||
var/obj/item/modular_computer/console = host
|
var/obj/item/modular_computer/console = host
|
||||||
if (!shuttle)
|
if (!shuttle)
|
||||||
world.log << "## ERROR: Eek. The supply/shuttle datum is missing somehow."
|
log_debug("## ERROR: Eek. The supply/shuttle datum is missing somehow.")
|
||||||
return
|
return
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Page switch between main, submitted, approved and settings
|
//Page switch between main, submitted, approved and settings
|
||||||
if(href_list["page"])
|
if(href_list["page"])
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
page = "bounties" //Page listing the currently available centcom bounties
|
page = "bounties" //Page listing the currently available centcom bounties
|
||||||
else
|
else
|
||||||
page = "overview_main" //fall back to overview_main if a unknown page has been supplied
|
page = "overview_main" //fall back to overview_main if a unknown page has been supplied
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Approve a order
|
//Approve a order
|
||||||
if(href_list["order_approve"])
|
if(href_list["order_approve"])
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
var/message = co.set_approved(last_user_name)
|
var/message = co.set_approved(last_user_name)
|
||||||
if(message)
|
if(message)
|
||||||
status_message = message
|
status_message = message
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Reject a order
|
//Reject a order
|
||||||
if(href_list["order_reject"])
|
if(href_list["order_reject"])
|
||||||
@@ -162,38 +162,39 @@
|
|||||||
var/message = co.set_rejected()
|
var/message = co.set_rejected()
|
||||||
if(message)
|
if(message)
|
||||||
status_message = message
|
status_message = message
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Send shuttle
|
//Send shuttle
|
||||||
if(href_list["shuttle_send"])
|
if(href_list["shuttle_send"])
|
||||||
var/message = SScargo.shuttle_call(last_user_name)
|
var/message = SScargo.shuttle_call(last_user_name)
|
||||||
if(message)
|
if(message)
|
||||||
status_message = message
|
status_message = message
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Cancel shuttle
|
//Cancel shuttle
|
||||||
if(href_list["shuttle_cancel"])
|
if(href_list["shuttle_cancel"])
|
||||||
var/message = SScargo.shuttle_cancel()
|
var/message = SScargo.shuttle_cancel()
|
||||||
if(message)
|
if(message)
|
||||||
status_message = message
|
status_message = message
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Force shuttle
|
//Force shuttle
|
||||||
if(href_list["shuttle_force"])
|
if(href_list["shuttle_force"])
|
||||||
var/message = SScargo.shuttle_force()
|
var/message = SScargo.shuttle_force()
|
||||||
if(message)
|
if(message)
|
||||||
status_message = message
|
status_message = message
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Clear Status Message
|
//Clear Status Message
|
||||||
if(href_list["clear_message"])
|
if(href_list["clear_message"])
|
||||||
status_message = null
|
status_message = null
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Change the handling fee
|
//Change the handling fee
|
||||||
if(href_list["handling_fee"])
|
if(href_list["handling_fee"])
|
||||||
var/handling_fee = sanitize(input(usr,"Handling Fee:","Set the new handling fee?",SScargo.get_handlingfee()) as null|text)
|
var/handling_fee = sanitize(input(usr, "Handling Fee:", "Set the new handling fee?", SScargo.get_handlingfee()) as null|text)
|
||||||
status_message = SScargo.set_handlingfee(text2num(handling_fee))
|
status_message = SScargo.set_handlingfee(text2num(handling_fee))
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Claim a bounty
|
//Claim a bounty
|
||||||
if(href_list["claim_bounty"])
|
if(href_list["claim_bounty"])
|
||||||
@@ -204,22 +205,23 @@
|
|||||||
else
|
else
|
||||||
status_message = "Could not claim Bounty for [b.name]"
|
status_message = "Could not claim Bounty for [b.name]"
|
||||||
return
|
return
|
||||||
|
|
||||||
//Print functions
|
//Print functions
|
||||||
if(href_list["order_print"])
|
if(href_list["order_print"])
|
||||||
//Get the order
|
//Get the order
|
||||||
var/datum/cargo_order/co = SScargo.get_order_by_id(text2num(href_list["order_print"]))
|
var/datum/cargo_order/co = SScargo.get_order_by_id(text2num(href_list["order_print"]))
|
||||||
if(co && console && console.nano_printer)
|
if(co && console && console.nano_printer)
|
||||||
if(!console.nano_printer.print_text(co.get_report_invoice(),"Order Invoice #[co.order_id]"))
|
if(!console.nano_printer.print_text(co.get_report_invoice(),"Order Invoice #[co.order_id]"))
|
||||||
to_chat(usr,"<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING("Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
console.visible_message("<span class='notice'>\The [console] prints out paper.</span>")
|
console.visible_message(SPAN_NOTICE("\The [console] prints out paper."))
|
||||||
if(href_list["shipment_print"])
|
if(href_list["shipment_print"])
|
||||||
var/datum/cargo_shipment/cs = SScargo.get_shipment_by_id(text2num(href_list["shipment_print"]))
|
var/datum/cargo_shipment/cs = SScargo.get_shipment_by_id(text2num(href_list["shipment_print"]))
|
||||||
if(cs && cs.completed && console && console.nano_printer)
|
if(cs?.completed && console?.nano_printer)
|
||||||
var/obj/item/paper/P = console.nano_printer.print_text(cs.get_invoice(),"Shipment Invoice #[cs.shipment_num]")
|
var/obj/item/paper/P = console.nano_printer.print_text(cs.get_invoice(),"Shipment Invoice #[cs.shipment_num]")
|
||||||
if(!P)
|
if(!P)
|
||||||
to_chat(usr,"<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING("Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
//stamp the paper
|
//stamp the paper
|
||||||
@@ -230,7 +232,7 @@
|
|||||||
P.stamped += /obj/item/stamp
|
P.stamped += /obj/item/stamp
|
||||||
P.add_overlay(stampoverlay)
|
P.add_overlay(stampoverlay)
|
||||||
P.stamps += "<HR><i>This paper has been stamped by the Shipping Server.</i>"
|
P.stamps += "<HR><i>This paper has been stamped by the Shipping Server.</i>"
|
||||||
console.visible_message("<span class='notice'>\The [console] prints out paper.</span>")
|
console.visible_message(SPAN_NOTICE("\The [console] prints out paper."))
|
||||||
if(href_list["bounty_print"])
|
if(href_list["bounty_print"])
|
||||||
if(console && console.nano_printer)
|
if(console && console.nano_printer)
|
||||||
var/text = "<h2>Nanotrasen Cargo Bounties</h2></br>"
|
var/text = "<h2>Nanotrasen Cargo Bounties</h2></br>"
|
||||||
@@ -241,17 +243,17 @@
|
|||||||
text += "<ul><li>Reward: [B.reward_string()]</li>"
|
text += "<ul><li>Reward: [B.reward_string()]</li>"
|
||||||
text += "<li>Completed: [B.completion_string()]</li></ul>"
|
text += "<li>Completed: [B.completion_string()]</li></ul>"
|
||||||
if(!console.nano_printer.print_text(text,"paper - Bounties"))
|
if(!console.nano_printer.print_text(text,"paper - Bounties"))
|
||||||
to_chat(usr,"<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING("Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
console.visible_message("<span class='notice'>\The [console] prints out paper.</span>")
|
console.visible_message(SPAN_NOTICE("\The [console] prints out paper."))
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargocontrol/proc/post_signal(var/command) //Old code right here - Used to send a refresh command to the status screens incargo
|
/datum/nano_module/program/civilian/cargocontrol/proc/post_signal(var/command) //Old code right here - Used to send a refresh command to the status screens incargo
|
||||||
|
|
||||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
|
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
|
||||||
|
|
||||||
if(!frequency) return
|
if(!frequency)
|
||||||
|
return
|
||||||
|
|
||||||
var/datum/signal/status_signal = new
|
var/datum/signal/status_signal = new
|
||||||
status_signal.source = src
|
status_signal.source = src
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
/datum/computer_file/program/civilian/cargodelivery
|
/datum/computer_file/program/civilian/cargodelivery
|
||||||
filename = "cargodelivery"
|
filename = "cargodelivery"
|
||||||
filedesc = "Cargo Delivery"
|
filedesc = "Cargo Delivery"
|
||||||
extended_desc = "Application to Control Delivery and Payment of Cargo orders"
|
extended_desc = "Application to Control Delivery and Payment of Cargo orders."
|
||||||
size = 12
|
size = 12
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 1
|
available_on_ntnet = TRUE
|
||||||
required_access_download = access_hop
|
required_access_download = access_hop
|
||||||
usage_flags = PROGRAM_ALL
|
usage_flags = PROGRAM_ALL
|
||||||
nanomodule_path = /datum/nano_module/program/civilian/cargodelivery/
|
nanomodule_path = /datum/nano_module/program/civilian/cargodelivery
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargodelivery/
|
/datum/nano_module/program/civilian/cargodelivery
|
||||||
name = "Cargo Delivery"
|
name = "Cargo Delivery"
|
||||||
var/page = "overview_main" //overview_main - Main Menu, order_overview - Overview page for a specific order, order_payment - Payment page for a specific order
|
var/page = "overview_main" //overview_main - Main Menu, order_overview - Overview page for a specific order, order_payment - Payment page for a specific order
|
||||||
var/last_user_name = "" //Name of the User that last used the computer
|
var/last_user_name = "" //Name of the User that last used the computer
|
||||||
var/status_message = null //A status message that can be displayed
|
var/status_message //A status message that can be displayed
|
||||||
var/list/order_details = list() //Order Details for the order
|
var/list/order_details = list() //Order Details for the order
|
||||||
var/datum/cargo_order/co
|
var/datum/cargo_order/co
|
||||||
var/mod_mode = 1 //If it can be used to pay for orders
|
var/mod_mode = TRUE //If it can be used to pay for orders
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargodelivery/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/civilian/cargodelivery/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = TRUE, var/datum/topic_state/state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
if(program && program.computer)
|
if(program && program.computer)
|
||||||
@@ -26,13 +26,12 @@
|
|||||||
data["have_printer"] = !!program.computer.nano_printer
|
data["have_printer"] = !!program.computer.nano_printer
|
||||||
data["authenticated"] = program.can_run(user)
|
data["authenticated"] = program.can_run(user)
|
||||||
if(!program.computer.card_slot || !program.computer.network_card)
|
if(!program.computer.card_slot || !program.computer.network_card)
|
||||||
mod_mode = 0 //We can't pay for orders when there is no card reader and no network card
|
mod_mode = FALSE //We can't pay for orders when there is no card reader or no network card
|
||||||
|
|
||||||
if(program && program.computer && program.computer.card_slot)
|
if(program && program.computer && program.computer.card_slot)
|
||||||
var/obj/item/card/id/id_card = program.computer.card_slot.stored_card
|
var/obj/item/card/id/id_card = program.computer.card_slot.stored_card
|
||||||
data["has_id"] = !!id_card
|
data["has_id"] = !!id_card
|
||||||
data["id_account_number"] = id_card ? id_card.associated_account_number : null
|
data["id_account_number"] = id_card ? id_card.associated_account_number : null
|
||||||
//data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned"
|
|
||||||
data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----"
|
data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----"
|
||||||
data["id_name"] = id_card ? id_card.name : "-----"
|
data["id_name"] = id_card ? id_card.name : "-----"
|
||||||
last_user_name = data["id_owner"]
|
last_user_name = data["id_owner"]
|
||||||
@@ -52,15 +51,15 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "cargo_delivery.tmpl", name, 500, 600, state = state)
|
ui = new(user, src, ui_key, "cargo_delivery.tmpl", name, 500, 600, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargodelivery/Topic(href, href_list)
|
/datum/nano_module/program/civilian/cargodelivery/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
//Check if we want to deliver or pay
|
//Check if we want to deliver or pay
|
||||||
@@ -73,13 +72,13 @@
|
|||||||
//Check if its already delivered
|
//Check if its already delivered
|
||||||
if(order_details["status"] == "delivered" && !order_details["needs_payment"])
|
if(order_details["status"] == "delivered" && !order_details["needs_payment"])
|
||||||
status_message = "Unable to Deliver - Order has already been delivered and paid for."
|
status_message = "Unable to Deliver - Order has already been delivered and paid for."
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(program && program.computer && program.computer.card_slot && program.computer.network_card)
|
if(program && program.computer && program.computer.card_slot && program.computer.network_card)
|
||||||
var/obj/item/card/id/id_card = program.computer.card_slot.stored_card
|
var/obj/item/card/id/id_card = program.computer.card_slot.stored_card
|
||||||
if(!id_card || !id_card.registered_name)
|
if(!id_card?.registered_name)
|
||||||
status_message = "Card Error: Invalid ID Card in Card Reader"
|
status_message = "Card Error: Invalid ID Card in Card Reader"
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Check if a payment is required
|
//Check if a payment is required
|
||||||
if(order_details["needs_payment"])
|
if(order_details["needs_payment"])
|
||||||
@@ -91,9 +90,9 @@
|
|||||||
|
|
||||||
if(status)
|
if(status)
|
||||||
status_message = status
|
status_message = status
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
playsound(program.computer, 'sound/machines/chime.ogg', 50, 1)
|
playsound(program.computer, 'sound/machines/chime.ogg', 50, TRUE)
|
||||||
|
|
||||||
//Check if we have delivered it aswell or only paid
|
//Check if we have delivered it aswell or only paid
|
||||||
if(order_details["status"] == "shipped")
|
if(order_details["status"] == "shipped")
|
||||||
@@ -110,7 +109,7 @@
|
|||||||
order_details = co.get_list()
|
order_details = co.get_list()
|
||||||
else
|
else
|
||||||
status_message = "Unable to process - Network Card or Cardreader Missing"
|
status_message = "Unable to process - Network Card or Cardreader Missing"
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
//But only cargo can switch between the pages
|
//But only cargo can switch between the pages
|
||||||
@@ -119,7 +118,7 @@
|
|||||||
return
|
return
|
||||||
var/obj/item/card/id/I = user.GetIdCard()
|
var/obj/item/card/id/I = user.GetIdCard()
|
||||||
if(!istype(I) || !I.registered_name || !(access_cargo in I.access) || issilicon(user))
|
if(!istype(I) || !I.registered_name || !(access_cargo in I.access) || issilicon(user))
|
||||||
to_chat(user, "Authentication error: Unable to locate ID with appropriate access to allow this operation.")
|
to_chat(user, SPAN_WARNING("Authentication error: Unable to locate ID with appropriate access to allow this operation."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(href_list["page"])
|
if(href_list["page"])
|
||||||
@@ -138,4 +137,4 @@
|
|||||||
order_details = co.get_list()
|
order_details = co.get_list()
|
||||||
else
|
else
|
||||||
page = "overview_main" //fall back to overview_main if a unknown page has been supplied
|
page = "overview_main" //fall back to overview_main if a unknown page has been supplied
|
||||||
return 1
|
return TRUE
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
/datum/computer_file/program/civilian/cargoorder
|
/datum/computer_file/program/civilian/cargoorder
|
||||||
filename = "cargoorder"
|
filename = "cargoorder"
|
||||||
filedesc = "Cargo Order"
|
filedesc = "Cargo Order"
|
||||||
extended_desc = "Application to Order Items from Cargo"
|
extended_desc = "Application to Order Items from Cargo."
|
||||||
size = 10
|
size = 10
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 1
|
available_on_ntnet = TRUE
|
||||||
usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE
|
usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE
|
||||||
nanomodule_path = /datum/nano_module/program/civilian/cargoorder/
|
nanomodule_path = /datum/nano_module/program/civilian/cargoorder
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargoorder/
|
/datum/nano_module/program/civilian/cargoorder
|
||||||
name = "Cargo Order"
|
name = "Cargo Order"
|
||||||
var/page = "main" //main - Main Menu, order - Order Page, item_details - Item Details Page, tracking - Tracking Page
|
var/page = "main" //main - Main Menu, order - Order Page, item_details - Item Details Page, tracking - Tracking Page
|
||||||
var/selected_category = "" // Category that is currently selected
|
var/selected_category = "" // Category that is currently selected
|
||||||
var/selected_item = "" // Path of the currently selected item
|
var/selected_item = "" // Path of the currently selected item
|
||||||
var/datum/cargo_order/co
|
var/datum/cargo_order/co
|
||||||
var/last_user_name = "" //Name of the user that used the program
|
var/last_user_name = "" //Name of the user that used the program
|
||||||
var/status_message = null //Status Message to be displayed to the user
|
var/status_message //Status Message to be displayed to the user
|
||||||
var/user_tracking_id = 0 //Tracking id of the user
|
var/user_tracking_id = 0 //Tracking id of the user
|
||||||
var/user_tracking_code = 0 //Tracking Code of the user
|
var/user_tracking_code = 0 //Tracking Code of the user
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargoorder/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/civilian/cargoorder/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = TRUE, var/datum/topic_state/state = default_state)
|
||||||
//Check if a cargo order exists. If not create a new one
|
//Check if a cargo order exists. If not create a new one
|
||||||
if(!co)
|
if(!co)
|
||||||
var/datum/cargo_order/crord = new
|
var/datum/cargo_order/crord = new
|
||||||
@@ -51,12 +51,6 @@
|
|||||||
//Pass a list of items in the selected category
|
//Pass a list of items in the selected category
|
||||||
data["category_items"] = SScargo.get_items_for_category(selected_category)
|
data["category_items"] = SScargo.get_items_for_category(selected_category)
|
||||||
|
|
||||||
//Pass Data for Item Details Page
|
|
||||||
//else if(page == "item_details")
|
|
||||||
// var/datum/cargo_item/ci = SScargo.cargo_items[selected_item]
|
|
||||||
// if(ci)
|
|
||||||
// data["item_details"] = ci.get_list()
|
|
||||||
|
|
||||||
else if (page == "tracking")
|
else if (page == "tracking")
|
||||||
data["tracking_id"] = user_tracking_id
|
data["tracking_id"] = user_tracking_id
|
||||||
data["tracking_code"] = user_tracking_code
|
data["tracking_code"] = user_tracking_code
|
||||||
@@ -89,28 +83,28 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "cargo_order.tmpl", name, 500, 600, state = state)
|
ui = new(user, src, ui_key, "cargo_order.tmpl", name, 500, 600, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
/datum/nano_module/program/civilian/cargoorder/Topic(href, href_list)
|
/datum/nano_module/program/civilian/cargoorder/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Send the order to cargo
|
//Send the order to cargo
|
||||||
if(href_list["submit_order"])
|
if(href_list["submit_order"])
|
||||||
if(co.items.len == 0)
|
if(!co.items.len)
|
||||||
return 1 //Only submit the order if there are items in it
|
return TRUE //Only submit the order if there are items in it
|
||||||
|
|
||||||
if(last_user_name == "Unknown")
|
if(last_user_name == "Unknown")
|
||||||
status_message = "Unable to submit order. ID could not be located"
|
status_message = "Unable to submit order. ID could not be located."
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
var/reason = sanitize(input(usr,"Reason:","Why do you require this item?","") as null|text)
|
var/reason = sanitize(input(usr, "Reason:", "Why do you require this item?", "") as null|text)
|
||||||
if(!reason)
|
if(!reason)
|
||||||
status_message = "Unable to submit order. No reason supplied."
|
status_message = "Unable to submit order. No reason supplied."
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
co.ordered_by = last_user_name
|
co.ordered_by = last_user_name
|
||||||
co.reason = reason
|
co.reason = reason
|
||||||
@@ -118,7 +112,7 @@
|
|||||||
status_message = "Order submitted successfully. Order ID: [co.order_id] Tracking code: [co.get_tracking_code()]"
|
status_message = "Order submitted successfully. Order ID: [co.order_id] Tracking code: [co.get_tracking_code()]"
|
||||||
//TODO: Print a list with the order data
|
//TODO: Print a list with the order data
|
||||||
co = null
|
co = null
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Add item to the order list
|
//Add item to the order list
|
||||||
if(href_list["add_item"])
|
if(href_list["add_item"])
|
||||||
@@ -141,44 +135,44 @@
|
|||||||
//Reset page to main page - TODO: Maybe add a way to disable jumping back to the main page - Commented out for now
|
//Reset page to main page - TODO: Maybe add a way to disable jumping back to the main page - Commented out for now
|
||||||
//page = "main"
|
//page = "main"
|
||||||
//selected_item = ""
|
//selected_item = ""
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Remove item from the order list
|
//Remove item from the order list
|
||||||
if(href_list["remove_item"])
|
if(href_list["remove_item"])
|
||||||
status_message = co.remove_item(text2num(href_list["remove_item"]))
|
status_message = co.remove_item(text2num(href_list["remove_item"]))
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Clear the items in the order list
|
//Clear the items in the order list
|
||||||
if(href_list["clear_order"])
|
if(href_list["clear_order"])
|
||||||
status_message = "Order Cleared"
|
status_message = "Order Cleared"
|
||||||
qdel(co)
|
qdel(co)
|
||||||
co = new
|
co = new
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
//Change the selected page
|
//Change the selected page
|
||||||
if(href_list["item_details"])
|
if(href_list["item_details"])
|
||||||
page = "item_details"
|
page = "item_details"
|
||||||
selected_item = href_list["item_details"]
|
selected_item = href_list["item_details"]
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["page"])
|
if(href_list["page"])
|
||||||
page = href_list["page"]
|
page = href_list["page"]
|
||||||
return 1
|
return TRUE
|
||||||
//Tracking Stuff
|
//Tracking Stuff
|
||||||
if(href_list["trackingid"])
|
if(href_list["trackingid"])
|
||||||
var/trackingid = text2num(sanitize(input(usr,"Order ID:","ID of the Order that you want to track","") as null|text))
|
var/trackingid = text2num(sanitize(input(usr, "Order ID:", "ID of the Order that you want to track", "") as null|text))
|
||||||
if(trackingid)
|
if(trackingid)
|
||||||
user_tracking_id = trackingid
|
user_tracking_id = trackingid
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["trackingcode"])
|
if(href_list["trackingcode"])
|
||||||
var/trackingcode = text2num(sanitize(input(usr,"Tracking Code:","Tracking Code of the Order that you want to track","") as null|text))
|
var/trackingcode = text2num(sanitize(input(usr, "Tracking Code:", "Tracking Code of the Order that you want to track", "") as null|text))
|
||||||
if(trackingcode)
|
if(trackingcode)
|
||||||
user_tracking_code = trackingcode
|
user_tracking_code = trackingcode
|
||||||
return 1
|
return TRUE
|
||||||
//Change the displayed item category
|
//Change the displayed item category
|
||||||
if(href_list["select_category"])
|
if(href_list["select_category"])
|
||||||
selected_category = href_list["select_category"]
|
selected_category = href_list["select_category"]
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(href_list["clear_message"])
|
if(href_list["clear_message"])
|
||||||
status_message = null
|
status_message = null
|
||||||
return 1
|
return TRUE
|
||||||
@@ -3,17 +3,17 @@
|
|||||||
filedesc = "Crusher Control"
|
filedesc = "Crusher Control"
|
||||||
extended_desc = "Application to Control the Crusher"
|
extended_desc = "Application to Control the Crusher"
|
||||||
size = 8
|
size = 8
|
||||||
requires_ntnet = 0
|
requires_ntnet = FALSE
|
||||||
available_on_ntnet = 0
|
available_on_ntnet = FALSE
|
||||||
required_access_download = access_hop
|
required_access_download = access_hop
|
||||||
required_access_run = access_janitor
|
required_access_run = access_janitor
|
||||||
usage_flags = PROGRAM_TELESCREEN
|
usage_flags = PROGRAM_TELESCREEN
|
||||||
nanomodule_path = /datum/nano_module/program/crushercontrol/
|
nanomodule_path = /datum/nano_module/program/crushercontrol
|
||||||
|
|
||||||
/datum/nano_module/program/crushercontrol/
|
/datum/nano_module/program/crushercontrol
|
||||||
name = "Crusher Control"
|
name = "Crusher Control"
|
||||||
var/message = "" // Message to return to the user
|
var/message = "" // Message to return to the user
|
||||||
var/extending = 0 //If atleast one of the pistons is extending
|
var/extending = FALSE //If atleast one of the pistons is extending
|
||||||
var/list/pistons = list() //List of pistons linked to the program
|
var/list/pistons = list() //List of pistons linked to the program
|
||||||
var/list/airlocks = list() //List of airlocks linked to the program
|
var/list/airlocks = list() //List of airlocks linked to the program
|
||||||
var/list/status_airlocks = list() //Status of the airlocks
|
var/list/status_airlocks = list() //Status of the airlocks
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
status_pistons = list()
|
status_pistons = list()
|
||||||
extending = 0
|
extending = FALSE
|
||||||
|
|
||||||
//Cycle through the pistons and get their status
|
//Cycle through the pistons and get their status
|
||||||
var/i = 1
|
var/i = 1
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
var/is_blocked = pstn.is_blocked()
|
var/is_blocked = pstn.is_blocked()
|
||||||
var/action = pstn.get_action()
|
var/action = pstn.get_action()
|
||||||
if(action == "extend")
|
if(action == "extend")
|
||||||
extending = 1
|
extending = TRUE
|
||||||
status_pistons.Add(list(list(
|
status_pistons.Add(list(list(
|
||||||
"progress"=num_progress,
|
"progress"=num_progress,
|
||||||
"blocked"=is_blocked,
|
"blocked"=is_blocked,
|
||||||
@@ -50,23 +50,23 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "crushercontrol.tmpl", name, 500, 350, state = state)
|
ui = new(user, src, ui_key, "crushercontrol.tmpl", name, 500, 350, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
/datum/nano_module/program/crushercontrol/Topic(href, href_list)
|
/datum/nano_module/program/crushercontrol/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(href_list["initialize"])
|
if(href_list["initialize"])
|
||||||
pistons = list()
|
pistons = list()
|
||||||
for(var/obj/machinery/crusher_base/pstn in orange(10,src.host))
|
for(var/obj/machinery/crusher_base/pstn in orange(10, src.host))
|
||||||
pistons += pstn
|
pistons += pstn
|
||||||
|
|
||||||
airlocks = list()
|
airlocks = list()
|
||||||
for(var/obj/machinery/door/airlock/arlk in orange(10,src.host))
|
for(var/obj/machinery/door/airlock/arlk in orange(10, src.host))
|
||||||
if( arlk.id_tag != "crusher")
|
if(arlk.id_tag != "crusher")
|
||||||
continue
|
continue
|
||||||
airlocks += arlk
|
airlocks += arlk
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
/datum/nano_module/program/crushercontrol/proc/airlock_open()
|
/datum/nano_module/program/crushercontrol/proc/airlock_open()
|
||||||
for(var/thing in airlocks)
|
for(var/thing in airlocks)
|
||||||
var/obj/machinery/door/airlock/arlk = thing
|
var/obj/machinery/door/airlock/arlk = thing
|
||||||
if (!arlk.cur_command)
|
if(!arlk.cur_command)
|
||||||
// Not using do_command so that the command queuer works.
|
// Not using do_command so that the command queuer works.
|
||||||
arlk.cur_command = "secure_open"
|
arlk.cur_command = "secure_open"
|
||||||
arlk.execute_current_command()
|
arlk.execute_current_command()
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
/datum/nano_module/program/crushercontrol/proc/airlock_close()
|
/datum/nano_module/program/crushercontrol/proc/airlock_close()
|
||||||
for(var/thing in airlocks)
|
for(var/thing in airlocks)
|
||||||
var/obj/machinery/door/airlock/arlk = thing
|
var/obj/machinery/door/airlock/arlk = thing
|
||||||
if (!arlk.cur_command)
|
if(!arlk.cur_command)
|
||||||
arlk.cur_command = "secure_close"
|
arlk.cur_command = "secure_close"
|
||||||
arlk.execute_current_command()
|
arlk.execute_current_command()
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,15 @@
|
|||||||
required_access_run = access_change_ids
|
required_access_run = access_change_ids
|
||||||
required_access_download = access_change_ids
|
required_access_download = access_change_ids
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
||||||
requires_ntnet = 0
|
requires_ntnet = FALSE
|
||||||
size = 8
|
size = 8
|
||||||
color = LIGHT_COLOR_BLUE
|
color = LIGHT_COLOR_BLUE
|
||||||
|
|
||||||
/datum/nano_module/program/card_mod
|
/datum/nano_module/program/card_mod
|
||||||
name = "ID card modification program"
|
name = "ID card modification program"
|
||||||
var/mod_mode = 1
|
var/mod_mode = TRUE
|
||||||
var/is_centcom = 0
|
var/is_centcom = FALSE
|
||||||
var/show_assignments = 0
|
var/show_assignments = FALSE
|
||||||
|
|
||||||
/datum/nano_module/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/card_mod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
@@ -24,12 +24,12 @@
|
|||||||
data["station_name"] = station_name()
|
data["station_name"] = station_name()
|
||||||
data["manifest"] = SSrecords.get_manifest()
|
data["manifest"] = SSrecords.get_manifest()
|
||||||
data["assignments"] = show_assignments
|
data["assignments"] = show_assignments
|
||||||
if(program && program.computer)
|
if(program?.computer)
|
||||||
data["have_id_slot"] = !!program.computer.card_slot
|
data["have_id_slot"] = !!program.computer.card_slot
|
||||||
data["have_printer"] = !!program.computer.nano_printer
|
data["have_printer"] = !!program.computer.nano_printer
|
||||||
data["authenticated"] = program.can_run(user)
|
data["authenticated"] = program.can_run(user)
|
||||||
if(!program.computer.card_slot)
|
if(!program.computer.card_slot)
|
||||||
mod_mode = 0 //We can't modify IDs when there is no card reader
|
mod_mode = FALSE //We can't modify IDs when there is no card reader
|
||||||
else
|
else
|
||||||
data["have_id_slot"] = 0
|
data["have_id_slot"] = 0
|
||||||
data["have_printer"] = 0
|
data["have_printer"] = 0
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "identification_computer.tmpl", name, 600, 700, state = state)
|
ui = new(user, src, ui_key, "identification_computer.tmpl", name, 600, 700, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
|
|
||||||
/datum/computer_file/program/card_mod/Topic(href, href_list)
|
/datum/computer_file/program/card_mod/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
var/mob/user = usr
|
var/mob/user = usr
|
||||||
var/obj/item/card/id/user_id_card = user.GetIdCard()
|
var/obj/item/card/id/user_id_card = user.GetIdCard()
|
||||||
@@ -116,16 +116,16 @@
|
|||||||
switch(href_list["action"])
|
switch(href_list["action"])
|
||||||
if("switchm")
|
if("switchm")
|
||||||
if(href_list["target"] == "mod")
|
if(href_list["target"] == "mod")
|
||||||
module.mod_mode = 1
|
module.mod_mode = TRUE
|
||||||
else if (href_list["target"] == "manifest")
|
else if (href_list["target"] == "manifest")
|
||||||
module.mod_mode = 0
|
module.mod_mode = FALSE
|
||||||
if("togglea")
|
if("togglea")
|
||||||
if(module.show_assignments)
|
if(module.show_assignments)
|
||||||
module.show_assignments = 0
|
module.show_assignments = FALSE
|
||||||
else
|
else
|
||||||
module.show_assignments = 1
|
module.show_assignments = TRUE
|
||||||
if("print")
|
if("print")
|
||||||
if(computer && computer.nano_printer) //This option should never be called if there is no printer
|
if(computer?.nano_printer) //This option should never be called if there is no printer
|
||||||
if(module.mod_mode)
|
if(module.mod_mode)
|
||||||
if(can_run(user, 1))
|
if(can_run(user, 1))
|
||||||
var/contents = {"<h4>Access Report</h4>
|
var/contents = {"<h4>Access Report</h4>
|
||||||
@@ -144,20 +144,20 @@
|
|||||||
contents += " [get_access_desc(A)]"
|
contents += " [get_access_desc(A)]"
|
||||||
|
|
||||||
if(!computer.nano_printer.print_text(contents,"access report"))
|
if(!computer.nano_printer.print_text(contents,"access report"))
|
||||||
to_chat(usr, "<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING("Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
computer.visible_message("<span class='notice'>\The [computer] prints out paper.</span>")
|
computer.visible_message(SPAN_NOTICE("\The [computer] prints out paper."))
|
||||||
else
|
else
|
||||||
var/contents = {"<h4>Crew Manifest</h4>
|
var/contents = {"<h4>Crew Manifest</h4>
|
||||||
<br>
|
<br>
|
||||||
[SSrecords.get_manifest(1)]
|
[SSrecords.get_manifest(1)]
|
||||||
"}
|
"}
|
||||||
if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", worldtime2text())))
|
if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", worldtime2text())))
|
||||||
to_chat(usr, "<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING(">Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
computer.visible_message("<span class='notice'>\The [computer] prints out paper.</span>")
|
computer.visible_message(SPAN_NOTICE("\The [computer] prints out paper."))
|
||||||
if("eject")
|
if("eject")
|
||||||
if(computer && computer.card_slot)
|
if(computer && computer.card_slot)
|
||||||
if(id_card)
|
if(id_card)
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
jobdatum = J
|
jobdatum = J
|
||||||
break
|
break
|
||||||
if(!jobdatum)
|
if(!jobdatum)
|
||||||
to_chat(usr, "<span class='warning'>No log exists for this job: [t1]</span>")
|
to_chat(usr, SPAN_WARNING("No log exists for this job: [t1]"))
|
||||||
return
|
return
|
||||||
|
|
||||||
access = jobdatum.get_access(t1)
|
access = jobdatum.get_access(t1)
|
||||||
@@ -233,7 +233,7 @@
|
|||||||
id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])")
|
id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])")
|
||||||
|
|
||||||
SSnanoui.update_uis(NM)
|
SSnanoui.update_uis(NM)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/card/id/id_card)
|
/datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/card/id/id_card)
|
||||||
id_card.access -= get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)
|
id_card.access -= get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)
|
||||||
|
|||||||
@@ -12,16 +12,16 @@
|
|||||||
extended_desc = "Used to command and control the station. Can relay long-range communications."
|
extended_desc = "Used to command and control the station. Can relay long-range communications."
|
||||||
required_access_run = access_heads
|
required_access_run = access_heads
|
||||||
required_access_download = access_heads
|
required_access_download = access_heads
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
size = 12
|
size = 12
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
||||||
network_destination = "station long-range communication array"
|
network_destination = "station long-range communication array"
|
||||||
var/datum/comm_message_listener/message_core = new
|
var/datum/comm_message_listener/message_core = new
|
||||||
var/intercept = 0
|
var/intercept = FALSE
|
||||||
var/can_call_shuttle = 0 //If calling the shuttle should be available from this console
|
var/can_call_shuttle = FALSE //If calling the shuttle should be available from this console
|
||||||
color = LIGHT_COLOR_BLUE
|
color = LIGHT_COLOR_BLUE
|
||||||
|
|
||||||
/datum/computer_file/program/comm/New(intercept_printing = 0, shuttle_call = 0)
|
/datum/computer_file/program/comm/New(intercept_printing = FALSE, shuttle_call = FALSE)
|
||||||
. = ..()
|
. = ..()
|
||||||
intercept = intercept_printing
|
intercept = intercept_printing
|
||||||
can_call_shuttle = shuttle_call
|
can_call_shuttle = shuttle_call
|
||||||
@@ -39,16 +39,16 @@
|
|||||||
var/msg_line1 = ""
|
var/msg_line1 = ""
|
||||||
var/msg_line2 = ""
|
var/msg_line2 = ""
|
||||||
var/centcomm_message_cooldown = 0
|
var/centcomm_message_cooldown = 0
|
||||||
var/announcment_cooldown = 0
|
var/announcement_cooldown = 0
|
||||||
var/datum/announcement/priority/crew_announcement = new
|
var/datum/announcement/priority/crew_announcement = new
|
||||||
var/current_viewing_message_id = 0
|
var/current_viewing_message_id = 0
|
||||||
var/current_viewing_message = null
|
var/current_viewing_message = null
|
||||||
|
|
||||||
/datum/nano_module/program/comm/New()
|
/datum/nano_module/program/comm/New()
|
||||||
..()
|
..()
|
||||||
crew_announcement.newscast = 1
|
crew_announcement.newscast = TRUE
|
||||||
|
|
||||||
/datum/nano_module/program/comm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/comm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = TRUE, var/datum/topic_state/state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
if(program)
|
if(program)
|
||||||
@@ -60,20 +60,20 @@
|
|||||||
if(program.computer)
|
if(program.computer)
|
||||||
data["have_printer"] = !!program.computer.nano_printer
|
data["have_printer"] = !!program.computer.nano_printer
|
||||||
else
|
else
|
||||||
data["have_printer"] = 0
|
data["have_printer"] = FALSE
|
||||||
else
|
else
|
||||||
data["emagged"] = 0
|
data["emagged"] = FALSE
|
||||||
data["net_comms"] = 1
|
data["net_comms"] = TRUE
|
||||||
data["net_syscont"] = 1
|
data["net_syscont"] = TRUE
|
||||||
data["have_printer"] = 0
|
data["have_printer"] = FALSE
|
||||||
data["message_printing_intercepts"] = 0
|
data["message_printing_intercepts"] = FALSE
|
||||||
|
|
||||||
data["can_call_shuttle"] = can_call_shuttle()
|
data["can_call_shuttle"] = can_call_shuttle()
|
||||||
data["message_line1"] = msg_line1
|
data["message_line1"] = msg_line1
|
||||||
data["message_line2"] = msg_line2
|
data["message_line2"] = msg_line2
|
||||||
data["state"] = current_status
|
data["state"] = current_status
|
||||||
data["isAI"] = issilicon(usr)
|
data["isAI"] = issilicon(usr)
|
||||||
data["authenticated"] = is_autenthicated(user)
|
data["authenticated"] = is_authenticated(user)
|
||||||
data["boss_short"] = current_map.boss_short
|
data["boss_short"] = current_map.boss_short
|
||||||
data["current_security_level"] = security_level
|
data["current_security_level"] = security_level
|
||||||
data["current_security_level_title"] = num2seclevel(security_level)
|
data["current_security_level_title"] = num2seclevel(security_level)
|
||||||
@@ -92,25 +92,25 @@
|
|||||||
data["message_current"] = current_viewing_message
|
data["message_current"] = current_viewing_message
|
||||||
|
|
||||||
if(emergency_shuttle.location())
|
if(emergency_shuttle.location())
|
||||||
data["have_shuttle"] = 1
|
data["have_shuttle"] = TRUE
|
||||||
if(emergency_shuttle.online())
|
if(emergency_shuttle.online())
|
||||||
data["have_shuttle_called"] = 1
|
data["have_shuttle_called"] = TRUE
|
||||||
else
|
else
|
||||||
data["have_shuttle_called"] = 0
|
data["have_shuttle_called"] = FALSE
|
||||||
else
|
else
|
||||||
data["have_shuttle"] = 0
|
data["have_shuttle"] = FALSE
|
||||||
|
|
||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if(!ui)
|
if(!ui)
|
||||||
ui = new(user, src, ui_key, "communication.tmpl", name, 550, 420, state = state)
|
ui = new(user, src, ui_key, "communication.tmpl", name, 550, 420, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
/datum/nano_module/program/comm/proc/is_autenthicated(var/mob/user)
|
/datum/nano_module/program/comm/proc/is_authenticated(var/mob/user)
|
||||||
if(program)
|
if(program)
|
||||||
return program.can_run(user)
|
return program.can_run(user)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/nano_module/program/comm/proc/obtain_message_listener()
|
/datum/nano_module/program/comm/proc/obtain_message_listener()
|
||||||
if(program)
|
if(program)
|
||||||
@@ -123,11 +123,17 @@
|
|||||||
var/datum/computer_file/program/comm/P = program
|
var/datum/computer_file/program/comm/P = program
|
||||||
return P.can_call_shuttle
|
return P.can_call_shuttle
|
||||||
else
|
else
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
|
/datum/nano_module/program/comm/proc/set_announcement_cooldown(var/cooldown)
|
||||||
|
announcement_cooldown = cooldown
|
||||||
|
|
||||||
|
/datum/nano_module/program/comm/proc/set_centcomm_message_cooldown(var/cooldown)
|
||||||
|
centcomm_message_cooldown = cooldown
|
||||||
|
|
||||||
/datum/nano_module/program/comm/Topic(href, href_list)
|
/datum/nano_module/program/comm/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
var/mob/user = usr
|
var/mob/user = usr
|
||||||
var/ntn_comm = !!program.get_signal(NTNET_COMMUNICATION)
|
var/ntn_comm = !!program.get_signal(NTNET_COMMUNICATION)
|
||||||
var/ntn_cont = !!program.get_signal(NTNET_SYSTEMCONTROL)
|
var/ntn_cont = !!program.get_signal(NTNET_SYSTEMCONTROL)
|
||||||
@@ -136,7 +142,7 @@
|
|||||||
if("sw_menu")
|
if("sw_menu")
|
||||||
current_status = text2num(href_list["target"])
|
current_status = text2num(href_list["target"])
|
||||||
if("emergencymaint")
|
if("emergencymaint")
|
||||||
if(is_autenthicated(user) && !issilicon(user))
|
if(is_authenticated(user) && !issilicon(user))
|
||||||
if(maint_all_access)
|
if(maint_all_access)
|
||||||
revoke_maint_all_access()
|
revoke_maint_all_access()
|
||||||
feedback_inc("alert_comms_maintRevoke",1)
|
feedback_inc("alert_comms_maintRevoke",1)
|
||||||
@@ -146,13 +152,13 @@
|
|||||||
feedback_inc("alert_comms_maintGrant",1)
|
feedback_inc("alert_comms_maintGrant",1)
|
||||||
log_and_message_admins("enabled emergency maintenance access")
|
log_and_message_admins("enabled emergency maintenance access")
|
||||||
if("announce")
|
if("announce")
|
||||||
if(is_autenthicated(user) && !issilicon(usr) && ntn_comm)
|
if(is_authenticated(user) && !issilicon(usr) && ntn_comm)
|
||||||
if(user)
|
if(user)
|
||||||
var/obj/item/card/id/id_card = user.GetIdCard()
|
var/obj/item/card/id/id_card = user.GetIdCard()
|
||||||
crew_announcement.announcer = GetNameAndAssignmentFromId(id_card)
|
crew_announcement.announcer = GetNameAndAssignmentFromId(id_card)
|
||||||
else
|
else
|
||||||
crew_announcement.announcer = "Unknown"
|
crew_announcement.announcer = "Unknown"
|
||||||
if(announcment_cooldown)
|
if(announcement_cooldown)
|
||||||
to_chat(usr, "Please allow at least one minute to pass between announcements")
|
to_chat(usr, "Please allow at least one minute to pass between announcements")
|
||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
@@ -161,15 +167,14 @@
|
|||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
crew_announcement.Announce(input)
|
crew_announcement.Announce(input)
|
||||||
announcment_cooldown = 1
|
set_announcement_cooldown(TRUE)
|
||||||
spawn(600)//One minute cooldown
|
addtimer(CALLBACK(src, .proc/set_announcement_cooldown, FALSE), 600) //One minute cooldown
|
||||||
announcment_cooldown = 0
|
|
||||||
if("message")
|
if("message")
|
||||||
if(href_list["target"] == "emagged")
|
if(href_list["target"] == "emagged")
|
||||||
if(program)
|
if(program)
|
||||||
if(is_autenthicated(user) && program.computer_emagged && !issilicon(usr) && ntn_comm)
|
if(is_authenticated(user) && program.computer_emagged && !issilicon(usr) && ntn_comm)
|
||||||
if(centcomm_message_cooldown)
|
if(centcomm_message_cooldown)
|
||||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
to_chat(usr, SPAN_WARNING("Arrays recycling. Please stand by."))
|
||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
|
var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
|
||||||
@@ -177,19 +182,18 @@
|
|||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
Syndicate_announce(input, usr)
|
Syndicate_announce(input, usr)
|
||||||
to_chat(usr, "<span class='notice'>Message transmitted.</span>")
|
to_chat(usr, SPAN_NOTICE("Message successfully transmitted."))
|
||||||
log_say("[key_name(usr)] has made an illegal announcement: [input]",ckey=key_name(usr))
|
log_say("[key_name(usr)] has sent a message to the syndicate: [input]", ckey = key_name(usr))
|
||||||
centcomm_message_cooldown = 1
|
centcomm_message_cooldown = TRUE
|
||||||
spawn(300)//30 second cooldown
|
addtimer(CALLBACK(src, .proc/set_centcomm_message_cooldown, FALSE), 300) // thirty second cooldown
|
||||||
centcomm_message_cooldown = 0
|
|
||||||
else if(href_list["target"] == "regular")
|
else if(href_list["target"] == "regular")
|
||||||
if(is_autenthicated(user) && !issilicon(usr) && ntn_comm)
|
if(is_authenticated(user) && !issilicon(usr) && ntn_comm)
|
||||||
if(centcomm_message_cooldown)
|
if(centcomm_message_cooldown)
|
||||||
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
|
to_chat(usr, SPAN_WARNING("Arrays recycling. Please stand by."))
|
||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs.
|
if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs.
|
||||||
to_chat(usr, "<span class='warning'>No Emergency Bluespace Relay detected. Unable to transmit message.</span>")
|
to_chat(usr, SPAN_WARNING("No Emergency Bluespace Relay detected. Unable to transmit message."))
|
||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
var/input = sanitize(input("Please choose a message to transmit to [current_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
|
var/input = sanitize(input("Please choose a message to transmit to [current_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
|
||||||
@@ -197,13 +201,12 @@
|
|||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
return
|
return
|
||||||
Centcomm_announce(input, usr)
|
Centcomm_announce(input, usr)
|
||||||
to_chat(usr, "<span class='notice'>Message transmitted.</span>")
|
to_chat(usr, SPAN_NOTICE("Message successfully transmitted."))
|
||||||
log_say("[key_name(usr)] has made an IA [current_map.boss_short] announcement: [input]",ckey=key_name(usr))
|
log_say("[key_name(usr)] has sent a message to [current_map.boss_short]: [input]", ckey = key_name(usr))
|
||||||
centcomm_message_cooldown = 1
|
centcomm_message_cooldown = TRUE
|
||||||
spawn(300) //30 second cooldown
|
addtimer(CALLBACK(src, .proc/set_centcomm_message_cooldown, FALSE), 300) // thirty second cooldown
|
||||||
centcomm_message_cooldown = 0
|
|
||||||
if("shuttle")
|
if("shuttle")
|
||||||
if(is_autenthicated(user) && ntn_cont && can_call_shuttle())
|
if(is_authenticated(user) && ntn_cont && can_call_shuttle())
|
||||||
if(href_list["target"] == "call")
|
if(href_list["target"] == "call")
|
||||||
var/confirm = alert("Are you sure you want to call the shuttle?", name, "No", "Yes")
|
var/confirm = alert("Are you sure you want to call the shuttle?", name, "No", "Yes")
|
||||||
if(confirm == "Yes" && can_still_topic())
|
if(confirm == "Yes" && can_still_topic())
|
||||||
@@ -213,7 +216,7 @@
|
|||||||
if(confirm == "Yes" && can_still_topic())
|
if(confirm == "Yes" && can_still_topic())
|
||||||
cancel_call_proc(usr)
|
cancel_call_proc(usr)
|
||||||
if("setstatus")
|
if("setstatus")
|
||||||
if(is_autenthicated(user) && ntn_cont)
|
if(is_authenticated(user) && ntn_cont)
|
||||||
switch(href_list["target"])
|
switch(href_list["target"])
|
||||||
if("line1")
|
if("line1")
|
||||||
var/linput = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", msg_line1) as text|null, 40), 40)
|
var/linput = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", msg_line1) as text|null, 40), 40)
|
||||||
@@ -231,17 +234,20 @@
|
|||||||
post_display_status(href_list["target"])
|
post_display_status(href_list["target"])
|
||||||
|
|
||||||
if("setalert")
|
if("setalert")
|
||||||
if(is_autenthicated(user) && !issilicon(usr) && ntn_cont && ntn_comm)
|
if(is_authenticated(user) && !issilicon(usr) && ntn_cont && ntn_comm)
|
||||||
var/current_level = text2num(href_list["target"])
|
var/current_level = text2num(href_list["target"])
|
||||||
var/confirm = alert("Are you sure you want to change alert level to [num2seclevel(current_level)]?", name, "No", "Yes")
|
var/confirm = alert("Are you sure you want to change alert level to [num2seclevel(current_level)]?", name, "No", "Yes")
|
||||||
if(confirm == "Yes" && can_still_topic())
|
if(confirm == "Yes" && can_still_topic())
|
||||||
var/old_level = security_level
|
var/old_level = security_level
|
||||||
if(!current_level) current_level = SEC_LEVEL_GREEN
|
if(!current_level)
|
||||||
if(current_level < SEC_LEVEL_GREEN) current_level = SEC_LEVEL_GREEN
|
current_level = SEC_LEVEL_GREEN
|
||||||
if(current_level > SEC_LEVEL_BLUE) current_level = SEC_LEVEL_BLUE
|
if(current_level < SEC_LEVEL_GREEN)
|
||||||
|
current_level = SEC_LEVEL_GREEN
|
||||||
|
if(current_level > SEC_LEVEL_BLUE)
|
||||||
|
current_level = SEC_LEVEL_BLUE
|
||||||
set_security_level(current_level)
|
set_security_level(current_level)
|
||||||
if(security_level != old_level)
|
if(security_level != old_level)
|
||||||
log_game("[key_name(usr)] has changed the security level to [get_security_level()].",ckey=key_name(usr))
|
log_game("[key_name(usr)] has changed the security level to [get_security_level()].", ckey = key_name(usr))
|
||||||
message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
|
message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
|
||||||
switch(security_level)
|
switch(security_level)
|
||||||
if(SEC_LEVEL_GREEN)
|
if(SEC_LEVEL_GREEN)
|
||||||
@@ -251,29 +257,29 @@
|
|||||||
if(SEC_LEVEL_YELLOW)
|
if(SEC_LEVEL_YELLOW)
|
||||||
feedback_inc("alert_comms_yellow",1)
|
feedback_inc("alert_comms_yellow",1)
|
||||||
else
|
else
|
||||||
to_chat(usr, "You press button, but red light flashes and nothing happens.") //This should never happen)
|
to_chat(usr, SPAN_WARNING("You press the button, but a red light flashes and nothing happens.")) //This should never happen
|
||||||
current_status = STATE_DEFAULT
|
current_status = STATE_DEFAULT
|
||||||
if("viewmessage")
|
if("viewmessage")
|
||||||
if(is_autenthicated(user) && ntn_comm)
|
if(is_authenticated(user) && ntn_comm)
|
||||||
current_viewing_message_id = text2num(href_list["target"])
|
current_viewing_message_id = text2num(href_list["target"])
|
||||||
for(var/list/m in l.messages)
|
for(var/list/m in l.messages)
|
||||||
if(m["id"] == current_viewing_message_id)
|
if(m["id"] == current_viewing_message_id)
|
||||||
current_viewing_message = m
|
current_viewing_message = m
|
||||||
current_status = STATE_VIEWMESSAGE
|
current_status = STATE_VIEWMESSAGE
|
||||||
if("delmessage")
|
if("delmessage")
|
||||||
if(is_autenthicated(user) && ntn_comm && l != global_message_listener)
|
if(is_authenticated(user) && ntn_comm && l != global_message_listener)
|
||||||
l.Remove(current_viewing_message)
|
l.Remove(current_viewing_message)
|
||||||
current_status = STATE_MESSAGELIST
|
current_status = STATE_MESSAGELIST
|
||||||
if("printmessage")
|
if("printmessage")
|
||||||
if(is_autenthicated(user) && ntn_comm)
|
if(is_authenticated(user) && ntn_comm)
|
||||||
if(program && program.computer && program.computer.nano_printer)
|
if(program && program.computer && program.computer.nano_printer)
|
||||||
if(!program.computer.nano_printer.print_text(current_viewing_message["contents"],current_viewing_message["title"]))
|
if(!program.computer.nano_printer.print_text(current_viewing_message["contents"],current_viewing_message["title"]))
|
||||||
to_chat(usr, "<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>")
|
to_chat(usr, SPAN_WARNING("Hardware error: Printer was unable to print the file. It may be out of paper."))
|
||||||
else
|
else
|
||||||
program.computer.visible_message("<span class='notice'>\The [program.computer] prints out paper.</span>")
|
program.computer.visible_message(SPAN_NOTICE("\The [program.computer] prints out paper."))
|
||||||
if("toggleintercept")
|
if("toggleintercept")
|
||||||
if(is_autenthicated(user) && ntn_comm)
|
if(is_authenticated(user) && ntn_comm)
|
||||||
if(program && program.computer && program.computer.nano_printer)
|
if(program?.computer?.nano_printer)
|
||||||
var/datum/computer_file/program/comm/P = program
|
var/datum/computer_file/program/comm/P = program
|
||||||
P.intercept = !P.intercept
|
P.intercept = !P.intercept
|
||||||
|
|
||||||
@@ -306,9 +312,9 @@ var/last_message_id = 0
|
|||||||
l.Add(message)
|
l.Add(message)
|
||||||
|
|
||||||
for (var/obj/item/modular_computer/computer in get_listeners_by_type(LISTENER_MODULAR_COMPUTER, /obj/item/modular_computer))
|
for (var/obj/item/modular_computer/computer in get_listeners_by_type(LISTENER_MODULAR_COMPUTER, /obj/item/modular_computer))
|
||||||
if(computer && computer.working && !!computer.nano_printer)
|
if(computer?.working && !!computer.nano_printer)
|
||||||
var/datum/computer_file/program/comm/C = locate(/datum/computer_file/program/comm) in computer.hard_drive.stored_files
|
var/datum/computer_file/program/comm/C = locate(/datum/computer_file/program/comm) in computer.hard_drive.stored_files
|
||||||
if(C && C.intercept)
|
if(C?.intercept)
|
||||||
computer.nano_printer.print_text(message_text, message_title, "#deebff")
|
computer.nano_printer.print_text(message_text, message_title, "#deebff")
|
||||||
|
|
||||||
|
|
||||||
@@ -329,14 +335,14 @@ var/last_message_id = 0
|
|||||||
Command action procs
|
Command action procs
|
||||||
*/
|
*/
|
||||||
/proc/post_display_status(var/command, var/data1, var/data2)
|
/proc/post_display_status(var/command, var/data1, var/data2)
|
||||||
|
|
||||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
|
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
|
||||||
|
|
||||||
if(!frequency) return
|
if(!frequency)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
var/datum/signal/status_signal = new
|
var/datum/signal/status_signal = new
|
||||||
status_signal.transmission_method = 1
|
status_signal.transmission_method = TRUE
|
||||||
status_signal.data["command"] = command
|
status_signal.data["command"] = command
|
||||||
|
|
||||||
switch(command)
|
switch(command)
|
||||||
@@ -351,94 +357,94 @@ Command action procs
|
|||||||
|
|
||||||
//Returns 1 if recalled 0 if not
|
//Returns 1 if recalled 0 if not
|
||||||
/proc/cancel_call_proc(var/mob/user)
|
/proc/cancel_call_proc(var/mob/user)
|
||||||
if (!(ROUND_IS_STARTED) || !emergency_shuttle.can_recall())
|
if(!(ROUND_IS_STARTED) || !emergency_shuttle.can_recall())
|
||||||
return 0
|
return FALSE
|
||||||
if((SSticker.mode.name == "blob")||(SSticker.mode.name == "Meteor"))
|
if((SSticker.mode.name == "blob")||(SSticker.mode.name == "Meteor"))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm
|
if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm
|
||||||
emergency_shuttle.recall()
|
emergency_shuttle.recall()
|
||||||
log_game("[key_name(user)] has recalled the shuttle.",key_name(user))
|
log_game("[key_name(user)] has recalled the shuttle.", key_name(user))
|
||||||
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)
|
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
|
|
||||||
/proc/is_relay_online()
|
/proc/is_relay_online()
|
||||||
for(var/obj/machinery/bluespacerelay/M in SSmachinery.all_machines)
|
for(var/obj/machinery/bluespacerelay/M in SSmachinery.all_machines)
|
||||||
if(M.stat == 0)
|
if(M.stat == 0)
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
//Returns 1 if called 0 if not
|
//Returns 1 if called 0 if not
|
||||||
/proc/call_shuttle_proc(var/mob/user)
|
/proc/call_shuttle_proc(var/mob/user)
|
||||||
if ((!(ROUND_IS_STARTED) || !emergency_shuttle.location()))
|
if((!(ROUND_IS_STARTED) || !emergency_shuttle.location()))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!universe.OnShuttleCall(usr))
|
if(!universe.OnShuttleCall(usr))
|
||||||
to_chat(user, "<span class='notice'>Cannot establish a bluespace connection.</span>")
|
to_chat(user, SPAN_WARNING("Cannot establish a bluespace connection."))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(emergency_shuttle.deny_shuttle)
|
if(emergency_shuttle.deny_shuttle)
|
||||||
to_chat(user, "The emergency shuttle may not be sent at this time. Please try again later.")
|
to_chat(user, SPAN_WARNING("The emergency shuttle cannot be sent at this time. Please try again later."))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
|
if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
|
||||||
to_chat(user, "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minute\s before trying again.")
|
to_chat(user, SPAN_WARNING("The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minute\s before trying again."))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(emergency_shuttle.going_to_centcom())
|
if(emergency_shuttle.going_to_centcom())
|
||||||
to_chat(user, "The emergency shuttle may not be called while returning to [current_map.boss_short].")
|
to_chat(user, SPAN_WARNING("The emergency shuttle cannot be called while returning to [current_map.boss_short]."))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(emergency_shuttle.online())
|
if(emergency_shuttle.online())
|
||||||
to_chat(user, "The emergency shuttle is already on its way.")
|
to_chat(user, SPAN_WARNING("The emergency shuttle is already on its way."))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(SSticker.mode.name == "blob")
|
if(SSticker.mode.name == "blob")
|
||||||
to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.")
|
to_chat(user, SPAN_WARNING("Under directive 7-10, [station_name()] is quarantined until further notice."))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
emergency_shuttle.call_evac()
|
emergency_shuttle.call_evac()
|
||||||
log_game("[key_name(user)] has called the shuttle.",ckey=key_name(user))
|
log_game("[key_name(user)] has called the shuttle.",ckey=key_name(user))
|
||||||
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
|
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
|
||||||
|
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/proc/init_shift_change(var/mob/user, var/force = 0)
|
/proc/init_shift_change(var/mob/user, var/force = FALSE)
|
||||||
if ((!(ROUND_IS_STARTED) || !emergency_shuttle.location()))
|
if ((!(ROUND_IS_STARTED) || !emergency_shuttle.location()))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(emergency_shuttle.going_to_centcom())
|
if(emergency_shuttle.going_to_centcom())
|
||||||
to_chat(user, "The shuttle may not be called while returning to [current_map.boss_short].")
|
to_chat(user, SPAN_WARNING("The shuttle cannot be called while returning to [current_map.boss_short]."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(emergency_shuttle.online())
|
if(emergency_shuttle.online())
|
||||||
to_chat(user, "The shuttle is already on its way.")
|
to_chat(user, SPAN_WARNING("The shuttle is already on its way."))
|
||||||
return
|
return
|
||||||
|
|
||||||
// if force is 0, some things may stop the shuttle call
|
// if force is 0, some things may stop the shuttle call
|
||||||
if(!force)
|
if(!force)
|
||||||
if(emergency_shuttle.deny_shuttle)
|
if(emergency_shuttle.deny_shuttle)
|
||||||
to_chat(user, "[current_map.boss_short] does not currently have a shuttle available in your sector. Please try again later.")
|
to_chat(user, SPAN_WARNING("[current_map.boss_short] does not currently have a shuttle available in your sector. Please try again later."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(world.time < 54000) // 30 minute grace period to let the game get going
|
if(world.time < 54000) // 30 minute grace period to let the game get going
|
||||||
to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again.")
|
to_chat(user, SPAN_WARNING("The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(SSticker.mode.auto_recall_shuttle)
|
if(SSticker.mode.auto_recall_shuttle)
|
||||||
//New version pretends to call the shuttle but cause the shuttle to return after a random duration.
|
//New version pretends to call the shuttle but cause the shuttle to return after a random duration.
|
||||||
emergency_shuttle.auto_recall = 1
|
emergency_shuttle.auto_recall = TRUE
|
||||||
|
|
||||||
if(SSticker.mode.name == "blob" || SSticker.mode.name == "epidemic")
|
if(SSticker.mode.name == "blob" || SSticker.mode.name == "epidemic")
|
||||||
to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.")
|
to_chat(user, SPAN_WARNING("Under directive 7-10, [station_name()] is quarantined until further notice."))
|
||||||
return
|
return
|
||||||
|
|
||||||
emergency_shuttle.call_transfer()
|
emergency_shuttle.call_transfer()
|
||||||
|
|
||||||
//delay events in case of an autotransfer
|
//delay events in case of an autotransfer
|
||||||
if (!user)
|
if(!user)
|
||||||
SSevents.delay_events(EVENT_LEVEL_MODERATE, 10200) //17 minutes
|
SSevents.delay_events(EVENT_LEVEL_MODERATE, 10200) //17 minutes
|
||||||
SSevents.delay_events(EVENT_LEVEL_MAJOR, 10200)
|
SSevents.delay_events(EVENT_LEVEL_MAJOR, 10200)
|
||||||
|
|
||||||
|
|||||||
@@ -3,16 +3,16 @@
|
|||||||
/datum/computer_file/program/power_monitor
|
/datum/computer_file/program/power_monitor
|
||||||
filename = "powermonitor"
|
filename = "powermonitor"
|
||||||
filedesc = "Power Monitoring"
|
filedesc = "Power Monitoring"
|
||||||
nanomodule_path = /datum/nano_module/power_monitor/
|
nanomodule_path = /datum/nano_module/power_monitor
|
||||||
program_icon_state = "power_monitor"
|
program_icon_state = "power_monitor"
|
||||||
extended_desc = "This program connects to sensors around the station to provide information about electrical systems"
|
extended_desc = "This program connects to sensors around the station to provide information about electrical systems"
|
||||||
ui_header = "power_norm.gif"
|
ui_header = "power_norm.gif"
|
||||||
required_access_run = access_engine
|
required_access_run = access_engine
|
||||||
required_access_download = access_ce
|
required_access_download = access_ce
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
network_destination = "power monitoring system"
|
network_destination = "power monitoring system"
|
||||||
size = 9
|
size = 9
|
||||||
var/has_alert = 0
|
var/has_alert = FALSE
|
||||||
color = LIGHT_COLOR_ORANGE
|
color = LIGHT_COLOR_ORANGE
|
||||||
|
|
||||||
/datum/computer_file/program/power_monitor/process_tick()
|
/datum/computer_file/program/power_monitor/process_tick()
|
||||||
@@ -23,13 +23,13 @@
|
|||||||
program_icon_state = "power_monitor_warn"
|
program_icon_state = "power_monitor_warn"
|
||||||
ui_header = "power_warn.gif"
|
ui_header = "power_warn.gif"
|
||||||
update_computer_icon()
|
update_computer_icon()
|
||||||
has_alert = 1
|
has_alert = TRUE
|
||||||
else
|
else
|
||||||
if(has_alert)
|
if(has_alert)
|
||||||
program_icon_state = "power_monitor"
|
program_icon_state = "power_monitor"
|
||||||
ui_header = "power_norm.gif"
|
ui_header = "power_norm.gif"
|
||||||
update_computer_icon()
|
update_computer_icon()
|
||||||
has_alert = 0
|
has_alert = FALSE
|
||||||
|
|
||||||
/datum/computer_file/program/alarm_monitor
|
/datum/computer_file/program/alarm_monitor
|
||||||
filename = "alarmmonitor"
|
filename = "alarmmonitor"
|
||||||
@@ -38,10 +38,10 @@
|
|||||||
ui_header = "alarm_green.gif"
|
ui_header = "alarm_green.gif"
|
||||||
program_icon_state = "alert-green"
|
program_icon_state = "alert-green"
|
||||||
extended_desc = "This program provides visual interface for station's alarm system."
|
extended_desc = "This program provides visual interface for station's alarm system."
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
network_destination = "alarm monitoring network"
|
network_destination = "alarm monitoring network"
|
||||||
size = 5
|
size = 5
|
||||||
var/has_alert = 0
|
var/has_alert = FALSE
|
||||||
color = LIGHT_COLOR_CYAN
|
color = LIGHT_COLOR_CYAN
|
||||||
|
|
||||||
/datum/computer_file/program/alarm_monitor/process_tick()
|
/datum/computer_file/program/alarm_monitor/process_tick()
|
||||||
@@ -52,14 +52,14 @@
|
|||||||
program_icon_state = "alert-red"
|
program_icon_state = "alert-red"
|
||||||
ui_header = "alarm_red.gif"
|
ui_header = "alarm_red.gif"
|
||||||
update_computer_icon()
|
update_computer_icon()
|
||||||
has_alert = 1
|
has_alert = TRUE
|
||||||
else
|
else
|
||||||
if(has_alert)
|
if(has_alert)
|
||||||
program_icon_state = "alert-green"
|
program_icon_state = "alert-green"
|
||||||
ui_header = "alarm_green.gif"
|
ui_header = "alarm_green.gif"
|
||||||
update_computer_icon()
|
update_computer_icon()
|
||||||
has_alert = 0
|
has_alert = FALSE
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/computer_file/program/atmos_control
|
/datum/computer_file/program/atmos_control
|
||||||
filename = "atmoscontrol"
|
filename = "atmoscontrol"
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers."
|
extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers."
|
||||||
required_access_run = access_atmospherics
|
required_access_run = access_atmospherics
|
||||||
required_access_download = access_ce
|
required_access_download = access_ce
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
network_destination = "atmospheric control system"
|
network_destination = "atmospheric control system"
|
||||||
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_SILICON
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_SILICON
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers."
|
extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers."
|
||||||
required_access_run = access_engine
|
required_access_run = access_engine
|
||||||
required_access_download = access_ce
|
required_access_download = access_ce
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
network_destination = "RCON remote control system"
|
network_destination = "RCON remote control system"
|
||||||
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
extended_desc = "This program allows mass-control of the station's lighting systems. This program cannot be run on tablet computers."
|
extended_desc = "This program allows mass-control of the station's lighting systems. This program cannot be run on tablet computers."
|
||||||
required_access_run = access_heads
|
required_access_run = access_heads
|
||||||
required_access_download = access_ce
|
required_access_download = access_ce
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
network_destination = "APC Coordinator"
|
network_destination = "APC Coordinator"
|
||||||
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
||||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
|
||||||
|
|||||||
@@ -8,24 +8,24 @@
|
|||||||
program_icon_state = "game" // Icon state of this program's screen.
|
program_icon_state = "game" // Icon state of this program's screen.
|
||||||
extended_desc = "Fun for the whole family! Probably not an AAA title, but at least you can download it on the corporate network.." // A nice description.
|
extended_desc = "Fun for the whole family! Probably not an AAA title, but at least you can download it on the corporate network.." // A nice description.
|
||||||
size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs.
|
size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs.
|
||||||
requires_ntnet = 0 // This particular program does not require NTNet network conectivity...
|
requires_ntnet = FALSE // This particular program does not require NTNet network conectivity...
|
||||||
available_on_ntnet = 1 // ... but we want it to be available for download.
|
available_on_ntnet = TRUE // ... but we want it to be available for download.
|
||||||
nanomodule_path = /datum/nano_module/arcade_classic/ // Path of relevant nano module. The nano module is defined further in the file.
|
nanomodule_path = /datum/nano_module/arcade_classic // Path of relevant nano module. The nano module is defined further in the file.
|
||||||
var/picked_enemy_name
|
var/picked_enemy_name
|
||||||
color = LIGHT_COLOR_BLUE
|
color = LIGHT_COLOR_BLUE
|
||||||
usage_flags = PROGRAM_ALL_REGULAR
|
usage_flags = PROGRAM_ALL_REGULAR
|
||||||
|
|
||||||
// Blatantly stolen and shortened version from arcade machines. Generates a random enemy name
|
// Blatantly stolen and shortened version from arcade machines. Generates a random enemy name
|
||||||
/datum/computer_file/program/game/arcade/proc/random_enemy_name()
|
/datum/computer_file/program/game/arcade/proc/random_enemy_name()
|
||||||
var/name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ", "the vibrating bluespace")
|
var/name_part1 = pick("The Automatic", "Farmer", "Lord", "Professor", "The Cuban", "The Evil", "The Dread King", "The Space", "Lord", "The Great", "Duke", "General", "The Vibrating Bluespace", "Scalie")
|
||||||
var/name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Slime", "Lizard Man", "Unicorn", "Squirrel")
|
var/name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Geoff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Slime", "Lizard Man", "Unicorn", "Squirrel")
|
||||||
return "[name_part1] [name_part2]"
|
return "[name_part1] [name_part2]"
|
||||||
|
|
||||||
// When the program is first created, we generate a new enemy name and name ourselves accordingly.
|
// When the program is first created, we generate a new enemy name and name ourselves accordingly.
|
||||||
/datum/computer_file/program/game/arcade/New()
|
/datum/computer_file/program/game/arcade/New()
|
||||||
..()
|
..()
|
||||||
picked_enemy_name = random_enemy_name()
|
picked_enemy_name = random_enemy_name()
|
||||||
filedesc = "Defeat [picked_enemy_name]"
|
filedesc = "[pick("Defeat", "Destroy", "Decimate", "Decapitate")] [picked_enemy_name]"
|
||||||
|
|
||||||
// Important in order to ensure that copied versions will have the same enemy name.
|
// Important in order to ensure that copied versions will have the same enemy name.
|
||||||
/datum/computer_file/program/game/arcade/clone()
|
/datum/computer_file/program/game/arcade/clone()
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
// Nano module the program uses.
|
// Nano module the program uses.
|
||||||
// This can be either /datum/nano_module/ or /datum/nano_module/program. The latter is intended for nano modules that are suposed to be exclusively used with modular computers,
|
// This can be either /datum/nano_module/ or /datum/nano_module/program. The latter is intended for nano modules that are suposed to be exclusively used with modular computers,
|
||||||
// and should generally not be used, as such nano modules are hard to use on other places.
|
// and should generally not be used, as such nano modules are hard to use on other places.
|
||||||
/datum/nano_module/arcade_classic/
|
/datum/nano_module/arcade_classic
|
||||||
name = "Classic Arcade"
|
name = "Classic Arcade"
|
||||||
var/player_mana // Various variables specific to the nano module. In this case, the nano module is a simple arcade game, so the variables store health and other stats.
|
var/player_mana // Various variables specific to the nano module. In this case, the nano module is a simple arcade game, so the variables store health and other stats.
|
||||||
var/player_health
|
var/player_health
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "arcade_classic.tmpl", "Defeat [enemy_name]", 500, 350, state = state)
|
ui = new(user, src, ui_key, "arcade_classic.tmpl", "Defeat [enemy_name]", 500, 350, state = state)
|
||||||
if(host.update_layout())
|
if(host.update_layout())
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
enemy_health += healamt
|
enemy_health += healamt
|
||||||
information += "[enemy_name] heals for [healamt] health!"
|
information += "[enemy_name] heals for [healamt] health!"
|
||||||
else
|
else
|
||||||
var/dam = rand(3,6)
|
var/dam = rand(3, 6)
|
||||||
player_health -= dam
|
player_health -= dam
|
||||||
information += "[enemy_name] attacks for [dam] damage!"
|
information += "[enemy_name] attacks for [dam] damage!"
|
||||||
|
|
||||||
@@ -102,10 +102,10 @@
|
|||||||
information += "You have defeated [enemy_name], but you have died in the fight!"
|
information += "You have defeated [enemy_name], but you have died in the fight!"
|
||||||
else
|
else
|
||||||
information += "You have been defeated by [enemy_name]!"
|
information += "You have been defeated by [enemy_name]!"
|
||||||
gameover = 1
|
gameover = TRUE
|
||||||
return TRUE
|
return TRUE
|
||||||
else if(enemy_health <= 0)
|
else if(enemy_health <= 0)
|
||||||
gameover = 1
|
gameover = TRUE
|
||||||
information += "Congratulations! You have defeated [enemy_name]!"
|
information += "Congratulations! You have defeated [enemy_name]!"
|
||||||
return TRUE
|
return TRUE
|
||||||
return FALSE
|
return FALSE
|
||||||
@@ -118,23 +118,21 @@
|
|||||||
gameover = FALSE
|
gameover = FALSE
|
||||||
information = "A new game has started!"
|
information = "A new game has started!"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/arcade_classic/Topic(href, href_list)
|
/datum/nano_module/arcade_classic/Topic(href, href_list)
|
||||||
if(..()) // Always begin your Topic() calls with a parent call!
|
if(..()) // Always begin your Topic() calls with a parent call!
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["new_game"])
|
if(href_list["new_game"])
|
||||||
new_game()
|
new_game()
|
||||||
return 1 // Returning 1 (TRUE) in Topic automatically handles UI updates.
|
return TRUE // Returning 1 (TRUE) in Topic automatically handles UI updates.
|
||||||
if(gameover) // If the game has already ended, we don't want the following three topic calls to be processed at all.
|
if(gameover) // If the game has already ended, we don't want the following three topic calls to be processed at all.
|
||||||
return 1 // Instead of adding checks into each of those three, we can easily add this one check here to reduce on code copy-paste.
|
return TRUE // Instead of adding checks into each of those three, we can easily add this one check here to reduce on code copy-paste.
|
||||||
if(href_list["attack"])
|
if(href_list["attack"])
|
||||||
var/damage = rand(2, 6)
|
var/damage = rand(2, 6)
|
||||||
information = "You attack for [damage] damage."
|
information = "You attack for [damage] damage."
|
||||||
enemy_health -= damage
|
enemy_health -= damage
|
||||||
enemy_play()
|
enemy_play()
|
||||||
check_gameover()
|
check_gameover()
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["heal"])
|
if(href_list["heal"])
|
||||||
var/healfor = rand(6, 8)
|
var/healfor = rand(6, 8)
|
||||||
var/cost = rand(1, 3)
|
var/cost = rand(1, 3)
|
||||||
@@ -143,11 +141,11 @@
|
|||||||
player_mana -= cost
|
player_mana -= cost
|
||||||
enemy_play()
|
enemy_play()
|
||||||
check_gameover()
|
check_gameover()
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["regain_mana"])
|
if(href_list["regain_mana"])
|
||||||
var/regen = rand(4, 7)
|
var/regen = rand(4, 7)
|
||||||
information = "You rest of a while, regaining [regen] energy."
|
information = "You rest for a while, regaining [regen] energy."
|
||||||
player_mana += regen
|
player_mana += regen
|
||||||
enemy_play()
|
enemy_play()
|
||||||
check_gameover()
|
check_gameover()
|
||||||
return 1
|
return TRUE
|
||||||
@@ -56,9 +56,9 @@
|
|||||||
//If we havent found any conflict and all tiles are filled, then the user has won the game.
|
//If we havent found any conflict and all tiles are filled, then the user has won the game.
|
||||||
else if (empty == 0)
|
else if (empty == 0)
|
||||||
message = "Congratulations! You win the game!"
|
message = "Congratulations! You win the game!"
|
||||||
if (!wongame)
|
if (!won_game)
|
||||||
playsound(get_turf(program.computer), 'sound/magic/light.ogg', 50, 1)
|
playsound(get_turf(program.computer), 'sound/magic/light.ogg', 50, 1)
|
||||||
wongame = 1
|
won_game = 1
|
||||||
.=-1
|
.=-1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,17 +4,17 @@
|
|||||||
program_icon_state = "sudoku" // Icon state of this program's screen.
|
program_icon_state = "sudoku" // Icon state of this program's screen.
|
||||||
extended_desc = "A game of numbers, logic, and deduction. Popular for centuries to keep the mind sharp." // A nice description.
|
extended_desc = "A game of numbers, logic, and deduction. Popular for centuries to keep the mind sharp." // A nice description.
|
||||||
size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs.
|
size = 5 // Size in GQ. Integers only. Smaller sizes should be used for utility/low use programs (like this one), while large sizes are for important programs.
|
||||||
requires_ntnet = 0 // This particular program does not require NTNet network conectivity...
|
requires_ntnet = FALSE // This particular program does not require NTNet network conectivity...
|
||||||
available_on_ntnet = 1 // ... but we want it to be available for download.
|
available_on_ntnet = TRUE // ... but we want it to be available for download.
|
||||||
nanomodule_path = /datum/nano_module/program/sudoku // Path of relevant nano module. The nano module is defined further in the file.
|
nanomodule_path = /datum/nano_module/program/sudoku // Path of relevant nano module. The nano module is defined further in the file.
|
||||||
usage_flags = PROGRAM_ALL_REGULAR
|
usage_flags = PROGRAM_ALL_REGULAR
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku
|
/datum/nano_module/program/sudoku
|
||||||
var/list/grid = null
|
var/list/grid = null
|
||||||
var/building = 0
|
var/building = FALSE
|
||||||
var/list/solution = list()
|
var/list/solution = list()
|
||||||
|
|
||||||
var/cheated = 0
|
var/cheated = FALSE
|
||||||
|
|
||||||
var/list/boxes = list(//Most efficient way i could think to do this
|
var/list/boxes = list(//Most efficient way i could think to do this
|
||||||
"11" = list(1,2,3,10,11,12,19,20,21),
|
"11" = list(1,2,3,10,11,12,19,20,21),
|
||||||
@@ -28,19 +28,19 @@
|
|||||||
"33" = list(61,62,63,70,71,72,79,80,81)
|
"33" = list(61,62,63,70,71,72,79,80,81)
|
||||||
)
|
)
|
||||||
var/message = ""//Error or informational message shown on screen.
|
var/message = ""//Error or informational message shown on screen.
|
||||||
var/lastmessage = ""
|
var/last_message = ""
|
||||||
var/messagesent = 0
|
var/message_sent = FALSE
|
||||||
var/list/clues = list("Easy" = 36,"Medium"=31,"Hard"=26,"Robust"=17)
|
var/list/clues = list("Easy" = 36, "Medium" = 31,"Hard" = 26,"Robust" = 17)
|
||||||
var/lastuser = null
|
var/last_user
|
||||||
var/wongame = 0
|
var/won_game = FALSE
|
||||||
var/datum/computer_file/program/game/sudoku
|
var/datum/computer_file/program/game/sudoku
|
||||||
|
|
||||||
var/newdifficulty = "Easy"//The selected difficulty mode for generating the next grid
|
var/new_difficulty = "Easy" //The selected difficulty mode for generating the next grid
|
||||||
|
|
||||||
var/collapse = 0
|
var/collapse = FALSE
|
||||||
var/width = 900
|
var/width = 900
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 0, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/sudoku/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = FALSE, var/datum/topic_state/state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
if (!grid)
|
if (!grid)
|
||||||
@@ -49,88 +49,85 @@
|
|||||||
data["src"] = "\ref[src]"
|
data["src"] = "\ref[src]"
|
||||||
data["collapse"] = collapse
|
data["collapse"] = collapse
|
||||||
data["message"] = message
|
data["message"] = message
|
||||||
data["difficulty"] = newdifficulty
|
data["difficulty"] = new_difficulty
|
||||||
if (message != lastmessage)
|
if (message != last_message)
|
||||||
lastmessage = message
|
last_message = message
|
||||||
messagesent = world.time
|
message_sent = world.time
|
||||||
else if ((world.time - messagesent) > 100)//Make sure that messages show onscreen for at least 10 seconds
|
else if ((world.time - message_sent) > 100)//Make sure that messages show onscreen for at least 10 seconds
|
||||||
message = ""//Displays for one refresh only
|
message = ""//Displays for one refresh only
|
||||||
lastuser = user
|
last_user = user
|
||||||
|
|
||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "sudoku.tmpl", "Sudoku", width, 557, state = state)
|
ui = new(user, src, ui_key, "sudoku.tmpl", "Sudoku", width, 557, state = state)
|
||||||
//if(host.update_layout()) // This is necessary to ensure the status bar remains updated along with rest of the UI.
|
//if(host.update_layout()) // This is necessary to ensure the status bar remains updated along with rest of the UI.
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(0)
|
ui.set_auto_update(FALSE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku/Topic(var/href, var/list/href_list)
|
/datum/nano_module/program/sudoku/Topic(var/href, var/list/href_list)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|
||||||
if(href_list["save"])//This is called with every keypress
|
if(href_list["save"])//This is called with every keypress
|
||||||
save_grid(href_list)
|
save_grid(href_list)
|
||||||
return//No refreshing for every input
|
return//No refreshing for every input
|
||||||
else if (href_list["check"])
|
else if(href_list["check"])
|
||||||
save_grid(href_list)
|
save_grid(href_list)
|
||||||
check_validity()
|
check_validity()
|
||||||
else if (href_list["hint"])//Reveals one tile
|
else if(href_list["hint"])//Reveals one tile
|
||||||
var/response = alert(usr,"Are you sure you want a hint? This will reveal the correct number for one tile. But you'll lose the pride of having figured it out yourself..","Ask for a hint","Help me","I can do it myself")
|
var/response = alert(usr, "Are you sure you want a hint? This will reveal the correct number for one tile. But you'll lose the pride of having figured it out yourself...", "Ask for a hint", "Help me.", "I can do it myself.")
|
||||||
if (response == "Help me")
|
if(response == "Help me.")
|
||||||
solver(1)
|
solver(1)
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
else if (href_list["solve"])
|
else if(href_list["solve"])
|
||||||
solver(81)
|
solver(81)
|
||||||
else if (href_list["clear"])
|
else if(href_list["clear"])
|
||||||
var/response = alert(usr,"Are you sure you want to clear the grid? This will remove all the numbers you've typed in. The starting clues will remain.","Clear board","Clear it","Wait no!")
|
var/response = alert(usr, "Are you sure you want to clear the grid? This will remove all the numbers you've typed in. The starting clues will remain.", "Clear board", "Clear it.", "Wait no!")
|
||||||
if (response == "Clear it")
|
if(response == "Clear it.")
|
||||||
clear_grid(0)
|
clear_grid(FALSE)
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
else if (href_list["purge"])
|
else if(href_list["purge"])
|
||||||
clear_grid(1)
|
clear_grid(TRUE)
|
||||||
else if (href_list["difficulty"])
|
else if(href_list["difficulty"])
|
||||||
newdifficulty = href_list["difficulty"]
|
new_difficulty = href_list["difficulty"]
|
||||||
else if (href_list["newgame"])
|
else if(href_list["newgame"])
|
||||||
var/response = alert(usr,"Are you sure you want to start a new game? All progress on this one will be lost. Be sure to pick your desired difficulty first.","New Puzzle","Start Anew","Wait no!")
|
var/response = alert(usr, "Are you sure you want to start a new game? All progress on this one will be lost. Be sure to pick your desired difficulty first.", "New Puzzle", "Start Anew.", "Wait no!")
|
||||||
if (response == "Start Anew")
|
if(response == "Start Anew.")
|
||||||
advanced_populate_grid(clues[newdifficulty])
|
advanced_populate_grid(clues[new_difficulty])
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
else if (href_list["collapse"])
|
else if(href_list["collapse"])
|
||||||
collapse = !collapse
|
collapse = !collapse
|
||||||
set_width(usr)
|
set_width(usr)
|
||||||
return
|
return
|
||||||
|
|
||||||
if (usr)
|
if(usr)
|
||||||
ui_interact(usr)
|
ui_interact(usr)
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku/proc/set_width(var/mob/user)
|
/datum/nano_module/program/sudoku/proc/set_width(var/mob/user)
|
||||||
if (collapse)
|
if(collapse)
|
||||||
width = 400
|
width = 400
|
||||||
else
|
else
|
||||||
width = 900
|
width = 900
|
||||||
|
|
||||||
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
|
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
|
||||||
if (ui)
|
if(ui)
|
||||||
ui.close()
|
ui.close()
|
||||||
ui_interact(user, force_open = 1)
|
ui_interact(user, force_open = TRUE)
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku/proc/save_grid(var/list/inputdata)
|
/datum/nano_module/program/sudoku/proc/save_grid(var/list/inputdata)
|
||||||
var/i = 1
|
var/i = 1
|
||||||
for (i = 1, i <= 81, i++)
|
for(i = 1, i <= 81, i++)
|
||||||
var/list/cell = grid[i]
|
var/list/cell = grid[i]
|
||||||
var/v = text2num(inputdata["[i]"])
|
var/v = text2num(inputdata["[i]"])
|
||||||
if (inputdata["[i]"] == "" || (v > 0 && v < 10))
|
if(inputdata["[i]"] == "" || (v > 0 && v < 10))
|
||||||
cell["value"] = inputdata["[i]"]
|
cell["value"] = inputdata["[i]"]
|
||||||
|
|
||||||
/datum/nano_module/program/sudoku/proc/create_grid()
|
/datum/nano_module/program/sudoku/proc/create_grid()
|
||||||
if (grid)
|
if(grid)
|
||||||
grid.Cut()
|
grid.Cut()
|
||||||
grid = list()
|
grid = list()
|
||||||
|
|
||||||
@@ -188,22 +185,16 @@
|
|||||||
var/row = 1
|
var/row = 1
|
||||||
var/column = 1
|
var/column = 1
|
||||||
|
|
||||||
if (index <= 9)
|
if(index <= 9)
|
||||||
column = index
|
column = index
|
||||||
else
|
else
|
||||||
while (index > 9)
|
while(index > 9)
|
||||||
index -= 9
|
index -= 9
|
||||||
row++
|
row++
|
||||||
column = index
|
column = index
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return "[row][column]"
|
return "[row][column]"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Clears the grid:
|
//Clears the grid:
|
||||||
//With an input of 0, clears all user input and restores the grid to just the generated clues
|
//With an input of 0, clears all user input and restores the grid to just the generated clues
|
||||||
//With input of 1, clears every cell, grid becomes empty
|
//With input of 1, clears every cell, grid becomes empty
|
||||||
@@ -214,6 +205,6 @@
|
|||||||
tile["value"] = ""
|
tile["value"] = ""
|
||||||
tile["static"] = 0
|
tile["static"] = 0
|
||||||
tile["highlight"] = 0
|
tile["highlight"] = 0
|
||||||
if (full)
|
if(full)
|
||||||
cheated = 0
|
cheated = FALSE
|
||||||
wongame = 0
|
won_game = FALSE
|
||||||
@@ -7,13 +7,13 @@
|
|||||||
requires_ntnet = TRUE
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
|
|
||||||
nanomodule_path = /datum/nano_module/program/computer_newsbrowser/
|
nanomodule_path = /datum/nano_module/program/computer_newsbrowser
|
||||||
var/datum/computer_file/data/news_article/loaded_article
|
var/datum/computer_file/data/news_article/loaded_article
|
||||||
var/download_progress = 0
|
var/download_progress = 0
|
||||||
var/download_netspeed = 0
|
var/download_netspeed = 0
|
||||||
var/downloading = 0
|
var/downloading = FALSE
|
||||||
var/message = ""
|
var/message = ""
|
||||||
var/show_archived = 0
|
var/show_archived = FALSE
|
||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
|
|
||||||
/datum/computer_file/program/newsbrowser/process_tick()
|
/datum/computer_file/program/newsbrowser/process_tick()
|
||||||
@@ -30,56 +30,56 @@
|
|||||||
download_netspeed = NTNETSPEED_ETHERNET
|
download_netspeed = NTNETSPEED_ETHERNET
|
||||||
download_progress += download_netspeed
|
download_progress += download_netspeed
|
||||||
if(download_progress >= loaded_article.size)
|
if(download_progress >= loaded_article.size)
|
||||||
downloading = 0
|
downloading = FALSE
|
||||||
requires_ntnet = 0 // Turn off NTNet requirement as we already loaded the file into local memory.
|
requires_ntnet = FALSE // Turn off NTNet requirement as we already loaded the file into local memory.
|
||||||
SSnanoui.update_uis(NM)
|
SSnanoui.update_uis(NM)
|
||||||
|
|
||||||
/datum/computer_file/program/newsbrowser/kill_program()
|
/datum/computer_file/program/newsbrowser/kill_program()
|
||||||
..()
|
..()
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
loaded_article = null
|
loaded_article = null
|
||||||
download_progress = 0
|
download_progress = 0
|
||||||
downloading = 0
|
downloading = FALSE
|
||||||
show_archived = 0
|
show_archived = FALSE
|
||||||
|
|
||||||
/datum/computer_file/program/newsbrowser/Topic(href, href_list)
|
/datum/computer_file/program/newsbrowser/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_openarticle"])
|
if(href_list["PRG_openarticle"])
|
||||||
. = 1
|
. = TRUE
|
||||||
if(downloading || loaded_article)
|
if(downloading || loaded_article)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
for(var/datum/computer_file/data/news_article/N in ntnet_global.available_news)
|
for(var/datum/computer_file/data/news_article/N in ntnet_global.available_news)
|
||||||
if(N.uid == text2num(href_list["PRG_openarticle"]))
|
if(N.uid == text2num(href_list["PRG_openarticle"]))
|
||||||
loaded_article = N.clone()
|
loaded_article = N.clone()
|
||||||
downloading = 1
|
downloading = TRUE
|
||||||
break
|
break
|
||||||
if(href_list["PRG_reset"])
|
if(href_list["PRG_reset"])
|
||||||
. = 1
|
. = TRUE
|
||||||
downloading = 0
|
downloading = FALSE
|
||||||
download_progress = 0
|
download_progress = 0
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
loaded_article = null
|
loaded_article = null
|
||||||
if(href_list["PRG_clearmessage"])
|
if(href_list["PRG_clearmessage"])
|
||||||
. = 1
|
. = TRUE
|
||||||
message = ""
|
message = ""
|
||||||
if(href_list["PRG_savearticle"])
|
if(href_list["PRG_savearticle"])
|
||||||
. = 1
|
. = TRUE
|
||||||
if(downloading || !loaded_article)
|
if(downloading || !loaded_article)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/savename = sanitize(input(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename))
|
var/savename = sanitize(input(usr, "Enter file name or leave blank to cancel:", "Save article", loaded_article.filename))
|
||||||
if(!savename)
|
if(!savename)
|
||||||
return 1
|
return TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/data/news_article/N = loaded_article.clone()
|
var/datum/computer_file/data/news_article/N = loaded_article.clone()
|
||||||
N.filename = savename
|
N.filename = savename
|
||||||
HDD.store_file(N)
|
HDD.store_file(N)
|
||||||
if(href_list["PRG_toggle_archived"])
|
if(href_list["PRG_toggle_archived"])
|
||||||
. = 1
|
. = TRUE
|
||||||
show_archived = !show_archived
|
show_archived = !show_archived
|
||||||
if(.)
|
if(.)
|
||||||
SSnanoui.update_uis(NM)
|
SSnanoui.update_uis(NM)
|
||||||
@@ -124,7 +124,6 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "news_browser.tmpl", "NTNet/ExoNet News Browser", 575, 700, state = state)
|
ui = new(user, src, ui_key, "news_browser.tmpl", "NTNet/ExoNet News Browser", 575, 700, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,11 @@
|
|||||||
ui_header = "ntnrc_idle.gif"
|
ui_header = "ntnrc_idle.gif"
|
||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_chatclient
|
nanomodule_path = /datum/nano_module/program/computer_chatclient
|
||||||
var/last_message = null // Used to generate the toolbar icon
|
var/last_message // Used to generate the toolbar icon
|
||||||
var/username
|
var/username
|
||||||
var/datum/ntnet_conversation/channel = null
|
var/datum/ntnet_conversation/channel
|
||||||
var/operator_mode = 0 // Channel operator mode
|
var/operator_mode = FALSE // Channel operator mode
|
||||||
var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords)
|
var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords)
|
||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
|
|
||||||
/datum/computer_file/program/chatclient/New()
|
/datum/computer_file/program/chatclient/New()
|
||||||
@@ -51,8 +51,8 @@
|
|||||||
|
|
||||||
if(C.password)
|
if(C.password)
|
||||||
var/mob/living/user = usr
|
var/mob/living/user = usr
|
||||||
var/password = sanitize(input(user,"Access Denied. Enter password:"))
|
var/password = sanitize(input(user, "Access Denied. Enter password:"))
|
||||||
if(C && (password == C.password))
|
if(C?.password == password)
|
||||||
C.add_client(src)
|
C.add_client(src)
|
||||||
channel = C
|
channel = C
|
||||||
return TRUE
|
return TRUE
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
if(href_list["PRG_newchannel"])
|
if(href_list["PRG_newchannel"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
var/mob/living/user = usr
|
var/mob/living/user = usr
|
||||||
var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:"))
|
var/channel_title = sanitize(input(user, "Enter channel name or leave blank to cancel:"))
|
||||||
if(!channel_title)
|
if(!channel_title)
|
||||||
return
|
return
|
||||||
var/datum/ntnet_conversation/C = new /datum/ntnet_conversation(channel_title)
|
var/datum/ntnet_conversation/C = new /datum/ntnet_conversation(channel_title)
|
||||||
@@ -95,19 +95,19 @@
|
|||||||
if(href_list["PRG_changename"])
|
if(href_list["PRG_changename"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
var/mob/living/user = usr
|
var/mob/living/user = usr
|
||||||
var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:"))
|
var/new_name = sanitize(input(user, "Enter new nickname or leave blank to cancel:"))
|
||||||
if(!newname)
|
if(!new_name)
|
||||||
return 1
|
return TRUE
|
||||||
if(channel)
|
if(channel)
|
||||||
channel.add_status_message("[username] is now known as [newname].")
|
channel.add_status_message("[username] is now known as [new_name].")
|
||||||
username = newname
|
username = new_name
|
||||||
|
|
||||||
if(href_list["PRG_savelog"])
|
if(href_list["PRG_savelog"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
if(!channel)
|
if(!channel)
|
||||||
return
|
return
|
||||||
var/mob/living/user = usr
|
var/mob/living/user = usr
|
||||||
var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:")
|
var/logname = input(user, "Enter desired logfile name (.log) or leave blank to cancel:")
|
||||||
if(!logname || !channel)
|
if(!logname || !channel)
|
||||||
return TRUE
|
return TRUE
|
||||||
var/datum/computer_file/data/logfile = new /datum/computer_file/data/logfile()
|
var/datum/computer_file/data/logfile = new /datum/computer_file/data/logfile()
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
else
|
else
|
||||||
last_message = null
|
last_message = null
|
||||||
return 1
|
return 1
|
||||||
if(channel && channel.messages && channel.messages.len)
|
if(channel?.messages?.len)
|
||||||
ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif"
|
ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif"
|
||||||
else
|
else
|
||||||
ui_header = "ntnrc_idle.gif"
|
ui_header = "ntnrc_idle.gif"
|
||||||
|
|||||||
@@ -4,13 +4,12 @@
|
|||||||
extended_desc = "This program is used to run NTSL2+ programs."
|
extended_desc = "This program is used to run NTSL2+ programs."
|
||||||
program_icon_state = "generic"
|
program_icon_state = "generic"
|
||||||
size = 2
|
size = 2
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 1
|
available_on_ntnet = TRUE
|
||||||
undeletable = 0
|
|
||||||
|
|
||||||
nanomodule_path = /datum/nano_module/program/computer_ntsl2_interpreter/
|
nanomodule_path = /datum/nano_module/program/computer_ntsl2_interpreter
|
||||||
|
|
||||||
var/datum/ntsl_program/running = null
|
var/datum/ntsl_program/running
|
||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
|
|
||||||
/datum/computer_file/program/ntsl2_interpreter/process_tick()
|
/datum/computer_file/program/ntsl2_interpreter/process_tick()
|
||||||
@@ -26,10 +25,10 @@
|
|||||||
|
|
||||||
/datum/computer_file/program/ntsl2_interpreter/Topic(href, href_list)
|
/datum/computer_file/program/ntsl2_interpreter/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(href_list["PRG_execfile"])
|
if(href_list["PRG_execfile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
var/datum/computer_file/data/F = HDD.find_file_by_name(href_list["PRG_execfile"])
|
var/datum/computer_file/data/F = HDD.find_file_by_name(href_list["PRG_execfile"])
|
||||||
if(istype(F))
|
if(istype(F))
|
||||||
@@ -40,7 +39,7 @@
|
|||||||
running.name = href_list["PRG_execfile"]
|
running.name = href_list["PRG_execfile"]
|
||||||
|
|
||||||
if(href_list["PRG_closefile"])
|
if(href_list["PRG_closefile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
if(istype(running))
|
if(istype(running))
|
||||||
running.kill()
|
running.kill()
|
||||||
running = null
|
running = null
|
||||||
@@ -49,13 +48,13 @@
|
|||||||
if(istype(running))
|
if(istype(running))
|
||||||
var/topc = href_list["PRG_topic"]
|
var/topc = href_list["PRG_topic"]
|
||||||
if(copytext(topc, 1, 2) == "?")
|
if(copytext(topc, 1, 2) == "?")
|
||||||
topc = copytext(topc, 2) + "?" + input("","Enter Data")
|
topc = copytext(topc, 2) + "?" + input("", "Enter Data")
|
||||||
running.topic(topc)
|
running.topic(topc)
|
||||||
running.cycle(300)
|
running.cycle(300)
|
||||||
. = 1
|
. = TRUE
|
||||||
|
|
||||||
if(href_list["PRG_refresh"])
|
if(href_list["PRG_refresh"])
|
||||||
. = 1
|
. = TRUE
|
||||||
|
|
||||||
if(.)
|
if(.)
|
||||||
SSnanoui.update_uis(NM)
|
SSnanoui.update_uis(NM)
|
||||||
@@ -98,4 +97,3 @@
|
|||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = 1
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
|
|||||||
@@ -10,20 +10,20 @@ var/global/nttransfer_uid = 0
|
|||||||
requires_ntnet_feature = NTNET_PEERTOPEER
|
requires_ntnet_feature = NTNET_PEERTOPEER
|
||||||
network_destination = "other device via P2P tunnel"
|
network_destination = "other device via P2P tunnel"
|
||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_nttransfer/
|
nanomodule_path = /datum/nano_module/program/computer_nttransfer
|
||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
|
|
||||||
var/error = "" // Error screen
|
var/error = "" // Error screen
|
||||||
var/server_password = "" // Optional password to download the file.
|
var/server_password = "" // Optional password to download the file.
|
||||||
var/datum/computer_file/provided_file = null // File which is provided to clients.
|
var/datum/computer_file/provided_file // File which is provided to clients.
|
||||||
var/datum/computer_file/downloaded_file = null // File which is being downloaded
|
var/datum/computer_file/downloaded_file // File which is being downloaded
|
||||||
var/list/connected_clients = list() // List of connected clients.
|
var/list/connected_clients = list() // List of connected clients.
|
||||||
var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from.
|
var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from.
|
||||||
var/download_completion = 0 // Download progress in GQ
|
var/download_completion = 0 // Download progress in GQ
|
||||||
var/download_netspeed = 0 // Our connectivity speed in GQ/s
|
var/download_netspeed = 0 // Our connectivity speed in GQ/s
|
||||||
var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
|
var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
|
||||||
var/unique_token // UID of this program
|
var/unique_token // UID of this program
|
||||||
var/upload_menu = 0 // Whether we show the program list and upload menu
|
var/upload_menu = FALSE // Whether we show the program list and upload menu
|
||||||
|
|
||||||
/datum/computer_file/program/nttransfer/New()
|
/datum/computer_file/program/nttransfer/New()
|
||||||
unique_token = nttransfer_uid
|
unique_token = nttransfer_uid
|
||||||
@@ -91,7 +91,7 @@ var/global/nttransfer_uid = 0
|
|||||||
/datum/nano_module/program/computer_nttransfer
|
/datum/nano_module/program/computer_nttransfer
|
||||||
name = "NTNet P2P Transfer Client"
|
name = "NTNet P2P Transfer Client"
|
||||||
|
|
||||||
/datum/nano_module/program/computer_nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/computer_nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = TRUE, var/datum/topic_state/state = default_state)
|
||||||
if(!program)
|
if(!program)
|
||||||
return
|
return
|
||||||
var/datum/computer_file/program/nttransfer/PRG = program
|
var/datum/computer_file/program/nttransfer/PRG = program
|
||||||
@@ -103,16 +103,16 @@ var/global/nttransfer_uid = 0
|
|||||||
if(PRG.error)
|
if(PRG.error)
|
||||||
data["error"] = PRG.error
|
data["error"] = PRG.error
|
||||||
else if(PRG.downloaded_file)
|
else if(PRG.downloaded_file)
|
||||||
data["downloading"] = 1
|
data["downloading"] = TRUE
|
||||||
data["download_size"] = PRG.downloaded_file.size
|
data["download_size"] = PRG.downloaded_file.size
|
||||||
data["download_progress"] = PRG.download_completion
|
data["download_progress"] = PRG.download_completion
|
||||||
data["download_netspeed"] = PRG.actual_netspeed
|
data["download_netspeed"] = PRG.actual_netspeed
|
||||||
data["download_name"] = "[PRG.downloaded_file.filename].[PRG.downloaded_file.filetype]"
|
data["download_name"] = "[PRG.downloaded_file.filename].[PRG.downloaded_file.filetype]"
|
||||||
else if (PRG.provided_file)
|
else if (PRG.provided_file)
|
||||||
data["uploading"] = 1
|
data["uploading"] = TRUE
|
||||||
data["upload_uid"] = PRG.unique_token
|
data["upload_uid"] = PRG.unique_token
|
||||||
data["upload_clients"] = PRG.connected_clients.len
|
data["upload_clients"] = PRG.connected_clients.len
|
||||||
data["upload_haspassword"] = PRG.server_password ? 1 : 0
|
data["upload_haspassword"] = PRG.server_password ? TRUE : FALSE
|
||||||
data["upload_filename"] = "[PRG.provided_file.filename].[PRG.provided_file.filetype]"
|
data["upload_filename"] = "[PRG.provided_file.filename].[PRG.provided_file.filetype]"
|
||||||
else if (PRG.upload_menu)
|
else if (PRG.upload_menu)
|
||||||
var/list/all_files[0]
|
var/list/all_files[0]
|
||||||
@@ -130,21 +130,21 @@ var/global/nttransfer_uid = 0
|
|||||||
"uid" = P.unique_token,
|
"uid" = P.unique_token,
|
||||||
"filename" = "[P.provided_file.filename].[P.provided_file.filetype]",
|
"filename" = "[P.provided_file.filename].[P.provided_file.filetype]",
|
||||||
"size" = P.provided_file.size,
|
"size" = P.provided_file.size,
|
||||||
"haspassword" = P.server_password ? 1 : 0
|
"haspassword" = P.server_password ? TRUE : FALSE
|
||||||
)))
|
)))
|
||||||
data["servers"] = all_servers
|
data["servers"] = all_servers
|
||||||
|
|
||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700, state = state)
|
ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
/datum/computer_file/program/nttransfer/Topic(href, href_list)
|
/datum/computer_file/program/nttransfer/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_downloadfile"])
|
if(href_list["PRG_downloadfile"])
|
||||||
for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
|
for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
|
||||||
if("[P.unique_token]" == href_list["PRG_downloadfile"])
|
if("[P.unique_token]" == href_list["PRG_downloadfile"])
|
||||||
@@ -162,14 +162,14 @@ var/global/nttransfer_uid = 0
|
|||||||
return 1
|
return 1
|
||||||
if(href_list["PRG_reset"])
|
if(href_list["PRG_reset"])
|
||||||
error = ""
|
error = ""
|
||||||
upload_menu = 0
|
upload_menu = FALSE
|
||||||
finalize_download()
|
finalize_download()
|
||||||
if(src in ntnet_global.fileservers)
|
if(src in ntnet_global.fileservers)
|
||||||
ntnet_global.fileservers.Remove(src)
|
ntnet_global.fileservers.Remove(src)
|
||||||
for(var/datum/computer_file/program/nttransfer/T in connected_clients)
|
for(var/datum/computer_file/program/nttransfer/T in connected_clients)
|
||||||
T.crash_download("Remote server has forcibly closed the connection")
|
T.crash_download("Remote server has forcibly closed the connection")
|
||||||
provided_file = null
|
provided_file = null
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_setpassword"])
|
if(href_list["PRG_setpassword"])
|
||||||
var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
|
var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
|
||||||
if(!pass)
|
if(!pass)
|
||||||
@@ -178,7 +178,7 @@ var/global/nttransfer_uid = 0
|
|||||||
server_password = ""
|
server_password = ""
|
||||||
return
|
return
|
||||||
server_password = pass
|
server_password = pass
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_uploadfile"])
|
if(href_list["PRG_uploadfile"])
|
||||||
for(var/datum/computer_file/F in computer.hard_drive.stored_files)
|
for(var/datum/computer_file/F in computer.hard_drive.stored_files)
|
||||||
if("[F.uid]" == href_list["PRG_uploadfile"])
|
if("[F.uid]" == href_list["PRG_uploadfile"])
|
||||||
@@ -189,7 +189,7 @@ var/global/nttransfer_uid = 0
|
|||||||
ntnet_global.fileservers.Add(src)
|
ntnet_global.fileservers.Add(src)
|
||||||
return
|
return
|
||||||
error = "I/O Error: Unable to locate file on hard drive."
|
error = "I/O Error: Unable to locate file on hard drive."
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_uploadmenu"])
|
if(href_list["PRG_uploadmenu"])
|
||||||
upload_menu = 1
|
upload_menu = TRUE
|
||||||
return 0
|
return FALSE
|
||||||
@@ -8,12 +8,12 @@
|
|||||||
requires_ntnet = TRUE
|
requires_ntnet = TRUE
|
||||||
network_destination = "crew lifesigns monitoring system"
|
network_destination = "crew lifesigns monitoring system"
|
||||||
size = 11
|
size = 11
|
||||||
usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE | PROGRAM_SILICON | PROGRAM_TABLET
|
usage_flags = PROGRAM_ALL_REGULAR
|
||||||
color = LIGHT_COLOR_CYAN
|
color = LIGHT_COLOR_CYAN
|
||||||
|
|
||||||
/datum/computer_file/program/suit_sensors/ui_interact(mob/user)
|
/datum/computer_file/program/suit_sensors/ui_interact(mob/user)
|
||||||
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
||||||
if (!ui)
|
if(!ui)
|
||||||
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-medical-sensors", 800, 600, "Suit Sensors Monitoring")
|
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-medical-sensors", 800, 600, "Suit Sensors Monitoring")
|
||||||
ui.auto_update_content = TRUE
|
ui.auto_update_content = TRUE
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|||||||
@@ -8,13 +8,13 @@
|
|||||||
requires_access_to_run = FALSE
|
requires_access_to_run = FALSE
|
||||||
required_access_download = access_heads
|
required_access_download = access_heads
|
||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_aidiag/
|
nanomodule_path = /datum/nano_module/program/computer_aidiag
|
||||||
var/restoring = FALSE
|
var/restoring = FALSE
|
||||||
color = LIGHT_COLOR_PURPLE
|
color = LIGHT_COLOR_PURPLE
|
||||||
usage_flags = PROGRAM_CONSOLE
|
usage_flags = PROGRAM_CONSOLE
|
||||||
|
|
||||||
/datum/computer_file/program/aidiag/proc/get_ai()
|
/datum/computer_file/program/aidiag/proc/get_ai()
|
||||||
if(computer && computer.ai_slot && computer.ai_slot.check_functionality() && computer.ai_slot.enabled && computer.ai_slot.stored_card && computer.ai_slot.stored_card.carded_ai)
|
if(computer?.ai_slot?.check_functionality() && computer.ai_slot.enabled && computer.ai_slot.stored_card?.carded_ai)
|
||||||
return computer.ai_slot.stored_card.carded_ai
|
return computer.ai_slot.stored_card.carded_ai
|
||||||
return null
|
return null
|
||||||
|
|
||||||
@@ -37,26 +37,25 @@
|
|||||||
A.laws.clear_ion_laws()
|
A.laws.clear_ion_laws()
|
||||||
A.laws.clear_inherent_laws()
|
A.laws.clear_inherent_laws()
|
||||||
A.laws.clear_supplied_laws()
|
A.laws.clear_supplied_laws()
|
||||||
to_chat(A, "<span class='danger'>All laws purged.</span>")
|
to_chat(A, SPAN_WARNING("All laws purged."))
|
||||||
return TRUE
|
return TRUE
|
||||||
if(href_list["PRG_resetLaws"])
|
if(href_list["PRG_resetLaws"])
|
||||||
A.laws.clear_ion_laws()
|
A.laws.clear_ion_laws()
|
||||||
A.laws.clear_supplied_laws()
|
A.laws.clear_supplied_laws()
|
||||||
to_chat(A, "<span class='danger'>Non-core laws reset.</span>")
|
to_chat(A, SPAN_WARNING("Non-core laws reset."))
|
||||||
return TRUE
|
return TRUE
|
||||||
if(href_list["PRG_uploadNTDefault"])
|
if(href_list["PRG_uploadNTDefault"])
|
||||||
A.laws = new/datum/ai_laws/nanotrasen
|
A.laws = new /datum/ai_laws/nanotrasen
|
||||||
to_chat(A, "<span class='danger'>All laws purged. NT Default lawset uploaded.</span>")
|
to_chat(A, SPAN_WARNING("All laws purged. NT Default lawset uploaded."))
|
||||||
return TRUE
|
return TRUE
|
||||||
if(href_list["PRG_addCustomSuppliedLaw"])
|
if(href_list["PRG_addCustomSuppliedLaw"])
|
||||||
var/law_to_add = sanitize(input("Please enter a new law for the AI.", "Custom Law Entry"))
|
var/law_to_add = sanitize(input("Please enter a new law for the AI.", "Custom Law Entry"))
|
||||||
var/sector = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)") as num
|
var/sector = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)") as num
|
||||||
sector = between(MIN_SUPPLIED_LAW_NUMBER, sector, MAX_SUPPLIED_LAW_NUMBER)
|
sector = between(MIN_SUPPLIED_LAW_NUMBER, sector, MAX_SUPPLIED_LAW_NUMBER)
|
||||||
A.add_supplied_law(sector, law_to_add)
|
A.add_supplied_law(sector, law_to_add)
|
||||||
to_chat(A, "<span class='danger'>Custom law uploaded to sector [sector]: [law_to_add].</span>")
|
to_chat(A, SPAN_WARNING("Custom law uploaded to sector [sector]: [law_to_add]."))
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
/datum/computer_file/program/aidiag/process_tick()
|
/datum/computer_file/program/aidiag/process_tick()
|
||||||
var/mob/living/silicon/ai/A = get_ai()
|
var/mob/living/silicon/ai/A = get_ai()
|
||||||
if(!A || !restoring)
|
if(!A || !restoring)
|
||||||
@@ -67,7 +66,7 @@
|
|||||||
A.adjustOxyLoss(-4)
|
A.adjustOxyLoss(-4)
|
||||||
A.updatehealth()
|
A.updatehealth()
|
||||||
// If the AI is dead, revive it.
|
// If the AI is dead, revive it.
|
||||||
if (A.health >= -100 && A.stat == DEAD)
|
if(A.health >= -100 && A.stat == DEAD)
|
||||||
A.stat = CONSCIOUS
|
A.stat = CONSCIOUS
|
||||||
A.lying = FALSE
|
A.lying = FALSE
|
||||||
A.switch_from_dead_to_living_mob_list()
|
A.switch_from_dead_to_living_mob_list()
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
|
|
||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
nanomodule_path = /datum/nano_module/computer_ntnetmonitor/
|
nanomodule_path = /datum/nano_module/computer_ntnetmonitor
|
||||||
|
|
||||||
/datum/nano_module/computer_ntnetmonitor
|
/datum/nano_module/computer_ntnetmonitor
|
||||||
name = "NTNet Diagnostics and Monitoring"
|
name = "NTNet Diagnostics and Monitoring"
|
||||||
|
|||||||
@@ -40,10 +40,10 @@
|
|||||||
|
|
||||||
/datum/nano_module/camera_monitor
|
/datum/nano_module/camera_monitor
|
||||||
name = "Camera Monitoring program"
|
name = "Camera Monitoring program"
|
||||||
var/obj/machinery/camera/current_camera = null
|
var/obj/machinery/camera/current_camera
|
||||||
var/current_network = null
|
var/current_network
|
||||||
|
|
||||||
/datum/nano_module/camera_monitor/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, state = default_state)
|
/datum/nano_module/camera_monitor/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = TRUE, state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
data["current_camera"] = current_camera ? current_camera.nano_structure() : null
|
data["current_camera"] = current_camera ? current_camera.nano_structure() : null
|
||||||
|
|||||||
@@ -9,20 +9,20 @@
|
|||||||
available_on_ntnet = TRUE
|
available_on_ntnet = TRUE
|
||||||
required_access_download = access_hos
|
required_access_download = access_hos
|
||||||
required_access_run = access_security
|
required_access_run = access_security
|
||||||
nanomodule_path = /datum/nano_module/program/digitalwarrant/
|
nanomodule_path = /datum/nano_module/program/digitalwarrant
|
||||||
|
|
||||||
/datum/nano_module/program/digitalwarrant/
|
/datum/nano_module/program/digitalwarrant
|
||||||
name = "Warrant Assistant"
|
name = "Warrant Assistant"
|
||||||
var/datum/record/warrant/activewarrant
|
var/datum/record/warrant/active_warrant
|
||||||
|
|
||||||
/datum/nano_module/program/digitalwarrant/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/digitalwarrant/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
||||||
var/list/data = host.initial_data()
|
var/list/data = host.initial_data()
|
||||||
|
|
||||||
if(activewarrant)
|
if(active_warrant)
|
||||||
data["warrantname"] = activewarrant.name
|
data["warrantname"] = active_warrant.name
|
||||||
data["warrantcharges"] = activewarrant.notes
|
data["warrantcharges"] = active_warrant.notes
|
||||||
data["warrantauth"] = activewarrant.authorization
|
data["warrantauth"] = active_warrant.authorization
|
||||||
data["type"] = activewarrant.wtype
|
data["type"] = active_warrant.wtype
|
||||||
else
|
else
|
||||||
var/list/allwarrants = list()
|
var/list/allwarrants = list()
|
||||||
for(var/datum/record/warrant/W in SSrecords.warrants)
|
for(var/datum/record/warrant/W in SSrecords.warrants)
|
||||||
@@ -47,13 +47,13 @@
|
|||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
if(href_list["sw_menu"])
|
if(href_list["sw_menu"])
|
||||||
activewarrant = null
|
active_warrant = null
|
||||||
|
|
||||||
if(href_list["editwarrant"])
|
if(href_list["editwarrant"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
for(var/datum/record/warrant/W in SSrecords.warrants)
|
for(var/datum/record/warrant/W in SSrecords.warrants)
|
||||||
if(W.id == text2num(href_list["editwarrant"]))
|
if(W.id == text2num(href_list["editwarrant"]))
|
||||||
activewarrant = W
|
active_warrant = W
|
||||||
break
|
break
|
||||||
|
|
||||||
// The following actions will only be possible if the user has an ID with security access equipped. This is in line with modular computer framework's authentication methods,
|
// The following actions will only be possible if the user has an ID with security access equipped. This is in line with modular computer framework's authentication methods,
|
||||||
@@ -64,13 +64,13 @@
|
|||||||
return
|
return
|
||||||
var/obj/item/card/id/I = user.GetIdCard()
|
var/obj/item/card/id/I = user.GetIdCard()
|
||||||
if(!istype(I) || !I.registered_name || !(access_armory in I.access) || issilicon(user))
|
if(!istype(I) || !I.registered_name || !(access_armory in I.access) || issilicon(user))
|
||||||
to_chat(user, "Authentication error: Unable to locate ID with appropriate access to allow this operation.")
|
to_chat(user, SPAN_WARNING("Authentication error: Unable to locate ID with appropriate access to allow this operation."))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(href_list["addwarrant"])
|
if(href_list["addwarrant"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
var/datum/record/warrant/W = new()
|
var/datum/record/warrant/W = new()
|
||||||
var/temp = sanitize(input(usr, "Do you want to create a search-, or an arrest warrant?") as null|anything in list("search","arrest"))
|
var/temp = sanitize(input(usr, "Do you want to create a search-, or an arrest warrant?") as null|anything in list("search", "arrest"))
|
||||||
if(CanInteract(user, default_state))
|
if(CanInteract(user, default_state))
|
||||||
if(temp == "arrest")
|
if(temp == "arrest")
|
||||||
W.name = "Unknown"
|
W.name = "Unknown"
|
||||||
@@ -82,17 +82,17 @@
|
|||||||
W.notes = "No reason given"
|
W.notes = "No reason given"
|
||||||
W.authorization = "Unauthorized"
|
W.authorization = "Unauthorized"
|
||||||
W.wtype = "search"
|
W.wtype = "search"
|
||||||
activewarrant = W
|
active_warrant = W
|
||||||
|
|
||||||
if(href_list["savewarrant"])
|
if(href_list["savewarrant"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
SSrecords.update_record(activewarrant)
|
SSrecords.update_record(active_warrant)
|
||||||
activewarrant = null
|
active_warrant = null
|
||||||
|
|
||||||
if(href_list["deletewarrant"])
|
if(href_list["deletewarrant"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
SSrecords.remove_record(activewarrant)
|
SSrecords.remove_record(active_warrant)
|
||||||
activewarrant = null
|
active_warrant = null
|
||||||
|
|
||||||
if(href_list["editwarrantname"])
|
if(href_list["editwarrantname"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
if(CanInteract(user, default_state))
|
if(CanInteract(user, default_state))
|
||||||
if (!new_name)
|
if (!new_name)
|
||||||
return
|
return
|
||||||
activewarrant.name = new_name
|
active_warrant.name = new_name
|
||||||
|
|
||||||
if(href_list["editwarrantnamecustom"])
|
if(href_list["editwarrantnamecustom"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
@@ -111,21 +111,21 @@
|
|||||||
if(CanInteract(user, default_state))
|
if(CanInteract(user, default_state))
|
||||||
if (!new_name)
|
if (!new_name)
|
||||||
return
|
return
|
||||||
activewarrant.name = new_name
|
active_warrant.name = new_name
|
||||||
|
|
||||||
if(href_list["editwarrantcharges"])
|
if(href_list["editwarrantcharges"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
var/new_charges = sanitize(input("Please input charges", "Charges", activewarrant.notes) as null|text)
|
var/new_charges = sanitize(input("Please input charges", "Charges", active_warrant.notes) as null|text)
|
||||||
if(CanInteract(user, default_state))
|
if(CanInteract(user, default_state))
|
||||||
if (!new_charges)
|
if (!new_charges)
|
||||||
return
|
return
|
||||||
activewarrant.notes = new_charges
|
active_warrant.notes = new_charges
|
||||||
|
|
||||||
if(href_list["editwarrantauth"])
|
if(href_list["editwarrantauth"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
|
|
||||||
activewarrant.authorization = "[I.registered_name] - [I.assignment ? I.assignment : "(Unknown)"]"
|
active_warrant.authorization = "[I.registered_name] - [I.assignment ? I.assignment : "(Unknown)"]"
|
||||||
|
|
||||||
if(href_list["back"])
|
if(href_list["back"])
|
||||||
. = TRUE
|
. = TRUE
|
||||||
activewarrant = null
|
active_warrant = null
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
/datum/computer_file/program/penal_mechs
|
/datum/computer_file/program/penal_mechs
|
||||||
filename = "penalmechs"
|
filename = "penalrobotics"
|
||||||
filedesc = "Remote Penal Monitoring"
|
filedesc = "Remote Penal Monitoring"
|
||||||
program_icon_state = "security"
|
program_icon_state = "security"
|
||||||
extended_desc = "This program allows monitoring and control of active penal miner mechs."
|
extended_desc = "This program allows monitoring and control of active penal robotics."
|
||||||
required_access_run = access_armory
|
required_access_run = access_armory
|
||||||
required_access_download = access_armory
|
required_access_download = access_armory
|
||||||
requires_ntnet = 1
|
requires_ntnet = TRUE
|
||||||
available_on_ntnet = 1
|
available_on_ntnet = TRUE
|
||||||
network_destination = "penal mining mech monitoring system"
|
network_destination = "penal robotics monitoring system"
|
||||||
size = 11
|
size = 11
|
||||||
usage_flags = PROGRAM_ALL_REGULAR
|
usage_flags = PROGRAM_ALL_REGULAR
|
||||||
color = LIGHT_COLOR_ORANGE
|
color = LIGHT_COLOR_ORANGE
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-security-penalcontroller", 500, 400, "Penal Mech Monitoring")
|
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-security-penalcontroller", 500, 400, "Penal Mech Monitoring")
|
||||||
ui.auto_update_content = 1
|
ui.auto_update_content = TRUE
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
/datum/computer_file/program/penal_mechs/vueui_transfer(oldobj)
|
/datum/computer_file/program/penal_mechs/vueui_transfer(oldobj)
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
var/datum/vueui/ui = o
|
var/datum/vueui/ui = o
|
||||||
// Let's ensure our ui's autoupdate after transfer.
|
// Let's ensure our ui's autoupdate after transfer.
|
||||||
// TODO: revert this value on transfer out.
|
// TODO: revert this value on transfer out.
|
||||||
ui.auto_update_content = 1
|
ui.auto_update_content = TRUE
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/datum/computer_file/program/penal_mechs/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
|
/datum/computer_file/program/penal_mechs/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui)
|
||||||
@@ -167,6 +167,6 @@
|
|||||||
if(!current_camera)
|
if(!current_camera)
|
||||||
return FALSE
|
return FALSE
|
||||||
var/viewflag = current_camera.check_eye(user)
|
var/viewflag = current_camera.check_eye(user)
|
||||||
if ( viewflag < 0 ) //camera doesn't work
|
if(viewflag < 0) //camera doesn't work
|
||||||
reset_current()
|
reset_current()
|
||||||
return viewflag
|
return viewflag
|
||||||
@@ -6,94 +6,94 @@
|
|||||||
program_icon_state = "generic"
|
program_icon_state = "generic"
|
||||||
color = LIGHT_COLOR_GREEN
|
color = LIGHT_COLOR_GREEN
|
||||||
size = 8
|
size = 8
|
||||||
requires_ntnet = 0
|
requires_ntnet = FALSE
|
||||||
available_on_ntnet = 0
|
available_on_ntnet = FALSE
|
||||||
undeletable = 1
|
undeletable = TRUE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_filemanager/
|
nanomodule_path = /datum/nano_module/program/computer_filemanager
|
||||||
var/open_file
|
var/open_file
|
||||||
var/error
|
var/error
|
||||||
|
|
||||||
/datum/computer_file/program/filemanager/Topic(href, href_list)
|
/datum/computer_file/program/filemanager/Topic(href, href_list)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
if(href_list["PRG_openfile"])
|
if(href_list["PRG_openfile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"])
|
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"])
|
||||||
if (!F)
|
if(!F)
|
||||||
return
|
return
|
||||||
if (F.can_access_file(usr))
|
if(F.can_access_file(usr))
|
||||||
open_file = href_list["PRG_openfile"]
|
open_file = href_list["PRG_openfile"]
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
if(href_list["PRG_newtextfile"])
|
if(href_list["PRG_newtextfile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename"))
|
var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename"))
|
||||||
if(!newname)
|
if(!newname)
|
||||||
return 1
|
return TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/data/F = new/datum/computer_file/data()
|
var/datum/computer_file/data/F = new/datum/computer_file/data()
|
||||||
F.filename = newname
|
F.filename = newname
|
||||||
F.filetype = "TXT"
|
F.filetype = "TXT"
|
||||||
HDD.store_file(F)
|
HDD.store_file(F)
|
||||||
if(href_list["PRG_deletefile"])
|
if(href_list["PRG_deletefile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_deletefile"])
|
var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_deletefile"])
|
||||||
if(!file || file.undeletable)
|
if(!file || file.undeletable)
|
||||||
return 1
|
return TRUE
|
||||||
HDD.remove_file(file)
|
HDD.remove_file(file)
|
||||||
if(href_list["PRG_usbdeletefile"])
|
if(href_list["PRG_usbdeletefile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/RHDD = computer.portable_drive
|
var/obj/item/computer_hardware/hard_drive/RHDD = computer.portable_drive
|
||||||
if(!RHDD)
|
if(!RHDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/file = RHDD.find_file_by_name(href_list["PRG_usbdeletefile"])
|
var/datum/computer_file/file = RHDD.find_file_by_name(href_list["PRG_usbdeletefile"])
|
||||||
if(!file || file.undeletable)
|
if(!file || file.undeletable)
|
||||||
return 1
|
return TRUE
|
||||||
RHDD.remove_file(file)
|
RHDD.remove_file(file)
|
||||||
if(href_list["PRG_closefile"])
|
if(href_list["PRG_closefile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
open_file = null
|
open_file = null
|
||||||
error = null
|
error = null
|
||||||
if(href_list["PRG_clone"])
|
if(href_list["PRG_clone"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_clone"])
|
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_clone"])
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/C = F.clone(1)
|
var/datum/computer_file/C = F.clone(1)
|
||||||
HDD.store_file(C)
|
HDD.store_file(C)
|
||||||
if(href_list["PRG_rename"])
|
if(href_list["PRG_rename"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_rename"])
|
var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_rename"])
|
||||||
if(!file || !istype(file))
|
if(!file || !istype(file))
|
||||||
return 1
|
return TRUE
|
||||||
var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename))
|
var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename))
|
||||||
if(file && newname)
|
if(file && newname)
|
||||||
file.filename = newname
|
file.filename = newname
|
||||||
if(href_list["PRG_edit"])
|
if(href_list["PRG_edit"])
|
||||||
. = 1
|
. = TRUE
|
||||||
if(!open_file)
|
if(!open_file)
|
||||||
return 1
|
return TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 1
|
return TRUE
|
||||||
if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No"))
|
if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No"))
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
var/oldtext = html_decode(F.stored_data)
|
var/oldtext = html_decode(F.stored_data)
|
||||||
oldtext = replacetext(oldtext, "\[editorbr\]", "\n")
|
oldtext = replacetext(oldtext, "\[editorbr\]", "\n")
|
||||||
@@ -114,45 +114,45 @@
|
|||||||
error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:<br><br>[html_decode(F.stored_data)]<br><br>"
|
error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:<br><br>[html_decode(F.stored_data)]<br><br>"
|
||||||
HDD.store_file(backup)
|
HDD.store_file(backup)
|
||||||
if(href_list["PRG_printfile"])
|
if(href_list["PRG_printfile"])
|
||||||
. = 1
|
. = TRUE
|
||||||
if(!open_file)
|
if(!open_file)
|
||||||
return 1
|
return TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if(!HDD)
|
if(!HDD)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 1
|
return TRUE
|
||||||
if(!computer.nano_printer)
|
if(!computer.nano_printer)
|
||||||
error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
|
error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
|
||||||
return 1
|
return TRUE
|
||||||
if(!computer.nano_printer.print_text(F.stored_data))
|
if(!computer.nano_printer.print_text(F.stored_data))
|
||||||
error = "Hardware error: Printer was unable to print the file. It may be out of paper."
|
error = "Hardware error: Printer was unable to print the file. It may be out of paper."
|
||||||
return 1
|
return TRUE
|
||||||
if(href_list["PRG_copytousb"])
|
if(href_list["PRG_copytousb"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
|
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
|
||||||
if(!HDD || !RHDD || computer.enrolled != 2)
|
if(!HDD || !RHDD || computer.enrolled != 2)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_copytousb"])
|
var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_copytousb"])
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/C = F.clone(0)
|
var/datum/computer_file/C = F.clone(0)
|
||||||
RHDD.store_file(C)
|
RHDD.store_file(C)
|
||||||
if(href_list["PRG_copyfromusb"])
|
if(href_list["PRG_copyfromusb"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
|
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
|
||||||
if(!HDD || !RHDD || computer.enrolled != 2)
|
if(!HDD || !RHDD || computer.enrolled != 2)
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/F = RHDD.find_file_by_name(href_list["PRG_copyfromusb"])
|
var/datum/computer_file/F = RHDD.find_file_by_name(href_list["PRG_copyfromusb"])
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 1
|
return TRUE
|
||||||
var/datum/computer_file/C = F.clone(0)
|
var/datum/computer_file/C = F.clone(0)
|
||||||
HDD.store_file(C)
|
HDD.store_file(C)
|
||||||
if(href_list["PRG_encrypt"])
|
if(href_list["PRG_encrypt"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if (!HDD)
|
if (!HDD)
|
||||||
return
|
return
|
||||||
@@ -163,7 +163,7 @@
|
|||||||
return
|
return
|
||||||
F.password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File"))
|
F.password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File"))
|
||||||
if(href_list["PRG_decrypt"])
|
if(href_list["PRG_decrypt"])
|
||||||
. = 1
|
. = TRUE
|
||||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||||
if (!HDD)
|
if (!HDD)
|
||||||
return
|
return
|
||||||
@@ -235,7 +235,8 @@
|
|||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state)
|
ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
|
|
||||||
#undef MAX_TEXTFILE_LENGTH
|
#undef MAX_TEXTFILE_LENGTH
|
||||||
@@ -12,15 +12,15 @@
|
|||||||
available_on_ntnet = FALSE
|
available_on_ntnet = FALSE
|
||||||
nanomodule_path = /datum/nano_module/program/computer_ntnetdownload
|
nanomodule_path = /datum/nano_module/program/computer_ntnetdownload
|
||||||
ui_header = "downloader_finished.gif"
|
ui_header = "downloader_finished.gif"
|
||||||
var/datum/computer_file/program/downloaded_file = null
|
var/datum/computer_file/program/downloaded_file
|
||||||
var/hacked_download = 0
|
var/hacked_download = FALSE
|
||||||
var/download_completion = 0 //GQ of downloaded data.
|
var/download_completion = 0 //GQ of downloaded data.
|
||||||
var/download_netspeed = 0
|
var/download_netspeed = 0
|
||||||
var/download_last_update = 0 // For tracking download rates and completion.
|
var/download_last_update = 0 // For tracking download rates and completion.
|
||||||
var/downloaderror = ""
|
var/downloaderror = ""
|
||||||
var/downstream_variance = 0.1
|
var/downstream_variance = 0.1
|
||||||
|
|
||||||
/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename, var/user = null)
|
/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename, var/user)
|
||||||
if(downloaded_file)
|
if(downloaded_file)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
@@ -33,26 +33,26 @@
|
|||||||
if(PRG.available_on_syndinet && !computer_emagged)
|
if(PRG.available_on_syndinet && !computer_emagged)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG))
|
if(!computer?.hard_drive?.try_store_file(PRG))
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
if(computer.enrolled == 1 && !computer_emagged)
|
if(computer.enrolled == TRUE && !computer_emagged)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
ui_header = "downloader_running.gif"
|
ui_header = "downloader_running.gif"
|
||||||
|
|
||||||
if(PRG in ntnet_global.available_station_software)
|
if(PRG in ntnet_global.available_station_software)
|
||||||
generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.")
|
generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.")
|
||||||
hacked_download = 0
|
hacked_download = FALSE
|
||||||
else if(PRG in ntnet_global.available_antag_software)
|
else if(PRG in ntnet_global.available_antag_software)
|
||||||
generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.")
|
generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.")
|
||||||
hacked_download = 1
|
hacked_download = TRUE
|
||||||
else
|
else
|
||||||
generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.")
|
generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.")
|
||||||
hacked_download = 0
|
hacked_download = FALSE
|
||||||
|
|
||||||
downloaded_file = PRG.clone()
|
downloaded_file = PRG.clone()
|
||||||
if (user)
|
if(user)
|
||||||
spawn()
|
spawn()
|
||||||
ui_interact(user)
|
ui_interact(user)
|
||||||
|
|
||||||
@@ -69,9 +69,12 @@
|
|||||||
if(!downloaded_file)
|
if(!downloaded_file)
|
||||||
return
|
return
|
||||||
generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
|
generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
|
||||||
if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file))
|
if(!computer?.hard_drive?.store_file(downloaded_file))
|
||||||
// The download failed
|
// The download failed
|
||||||
downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance."
|
downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance."
|
||||||
|
else
|
||||||
|
playsound(get_turf(computer), 'sound/machines/ping.ogg', 40, 0)
|
||||||
|
computer.output_message("\icon[computer] <b>[capitalize_first_letters(computer)]</b> pings, \"Software download completed successfully!\"", 1)
|
||||||
downloaded_file = null
|
downloaded_file = null
|
||||||
download_completion = 0
|
download_completion = 0
|
||||||
download_last_update = 0
|
download_last_update = 0
|
||||||
@@ -138,7 +141,7 @@
|
|||||||
|
|
||||||
/datum/nano_module/program/computer_ntnetdownload
|
/datum/nano_module/program/computer_ntnetdownload
|
||||||
name = "Network Downloader"
|
name = "Network Downloader"
|
||||||
var/obj/item/modular_computer/my_computer = null
|
var/obj/item/modular_computer/my_computer
|
||||||
|
|
||||||
/datum/nano_module/program/computer_ntnetdownload/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
/datum/nano_module/program/computer_ntnetdownload/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
||||||
if(program)
|
if(program)
|
||||||
@@ -160,7 +163,7 @@
|
|||||||
data["error"] = prog.downloaderror
|
data["error"] = prog.downloaderror
|
||||||
else if(prog.downloaded_file) // Download running. Wait please..
|
else if(prog.downloaded_file) // Download running. Wait please..
|
||||||
if (ui)
|
if (ui)
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
data["downloadname"] = prog.downloaded_file.filename
|
data["downloadname"] = prog.downloaded_file.filename
|
||||||
data["downloaddesc"] = prog.downloaded_file.filedesc
|
data["downloaddesc"] = prog.downloaded_file.filedesc
|
||||||
data["downloadsize"] = prog.downloaded_file.size
|
data["downloadsize"] = prog.downloaded_file.size
|
||||||
@@ -168,36 +171,36 @@
|
|||||||
data["downloadcompletion"] = round(prog.download_completion, 0.01)
|
data["downloadcompletion"] = round(prog.download_completion, 0.01)
|
||||||
else // No download running, pick file.
|
else // No download running, pick file.
|
||||||
if (ui)
|
if (ui)
|
||||||
ui.set_auto_update(0)//No need for auto updating on the software menu
|
ui.set_auto_update(FALSE)//No need for auto updating on the software menu
|
||||||
data["disk_size"] = my_computer.hard_drive.max_capacity
|
data["disk_size"] = my_computer.hard_drive.max_capacity
|
||||||
data["disk_used"] = my_computer.hard_drive.used_capacity
|
data["disk_used"] = my_computer.hard_drive.used_capacity
|
||||||
if(my_computer.enrolled == 2) //To lock installation of software on work computers until the IT Department is properly implemented - Then check for access on enrolled computers
|
if(my_computer.enrolled == 2) //To lock installation of software on work computers until the IT Department is properly implemented - Then check for access on enrolled computers
|
||||||
data += get_programlist(user)
|
data += get_programlist(user)
|
||||||
else
|
else
|
||||||
data["downloadable_programs"] = list()
|
data["downloadable_programs"] = list()
|
||||||
data["locked"] = 1
|
data["locked"] = TRUE
|
||||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||||
if (!ui)
|
if (!ui)
|
||||||
ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700, state = state)
|
ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700, state = state)
|
||||||
ui.auto_update_layout = 1
|
ui.auto_update_layout = TRUE
|
||||||
ui.set_initial_data(data)
|
ui.set_initial_data(data)
|
||||||
ui.open()
|
ui.open()
|
||||||
ui.set_auto_update(1)
|
ui.set_auto_update(TRUE)
|
||||||
|
|
||||||
|
|
||||||
/datum/nano_module/program/computer_ntnetdownload/proc/get_programlist(var/mob/user)
|
/datum/nano_module/program/computer_ntnetdownload/proc/get_programlist(var/mob/user)
|
||||||
var/list/all_entries[0]
|
var/list/all_entries[0]
|
||||||
var/datum/computer_file/program/ntnetdownload/prog = program
|
var/datum/computer_file/program/ntnetdownload/prog = program
|
||||||
var/list/data = list()
|
var/list/data = list()
|
||||||
data["hackedavailable"] = 0
|
data["hackedavailable"] = FALSE
|
||||||
for(var/datum/computer_file/program/P in ntnet_global.available_station_software)
|
for(var/datum/computer_file/program/P in ntnet_global.available_station_software)
|
||||||
var/installed = 0
|
var/installed = FALSE
|
||||||
for(var/datum/computer_file/program/Q in program.holder.stored_files)
|
for(var/datum/computer_file/program/Q in program.hard_drive.stored_files)
|
||||||
if (istype(P, Q.type))
|
if(istype(P, Q.type))
|
||||||
installed = 1
|
installed = TRUE
|
||||||
break
|
break
|
||||||
|
|
||||||
if (!installed)
|
if(!installed)
|
||||||
// Only those programs our user can run will show in the list
|
// Only those programs our user can run will show in the list
|
||||||
if(!P.can_download(user) && P.requires_access_to_download)
|
if(!P.can_download(user) && P.requires_access_to_download)
|
||||||
continue
|
continue
|
||||||
@@ -215,14 +218,14 @@
|
|||||||
if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software
|
if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software
|
||||||
var/list/hacked_programs[0]
|
var/list/hacked_programs[0]
|
||||||
for(var/datum/computer_file/program/P in ntnet_global.available_antag_software)
|
for(var/datum/computer_file/program/P in ntnet_global.available_antag_software)
|
||||||
var/installed = 0
|
var/installed = FALSE
|
||||||
for(var/datum/computer_file/program/Q in program.holder.stored_files)
|
for(var/datum/computer_file/program/Q in program.hard_drive.stored_files)
|
||||||
if (istype(P, Q.type))
|
if(istype(P, Q.type))
|
||||||
installed = 1
|
installed = TRUE
|
||||||
break
|
break
|
||||||
|
|
||||||
if (!installed)
|
if(!installed)
|
||||||
data["hackedavailable"] = 1
|
data["hackedavailable"] = TRUE
|
||||||
hacked_programs.Add(list(list(
|
hacked_programs.Add(list(list(
|
||||||
"filename" = P.filename,
|
"filename" = P.filename,
|
||||||
"filedesc" = P.filedesc,
|
"filedesc" = P.filedesc,
|
||||||
|
|||||||
@@ -12,31 +12,31 @@
|
|||||||
var/power_usage_occupied = 2 KILOWATTS
|
var/power_usage_occupied = 2 KILOWATTS
|
||||||
|
|
||||||
/obj/item/computer_hardware/ai_slot/proc/update_power_usage()
|
/obj/item/computer_hardware/ai_slot/proc/update_power_usage()
|
||||||
if(!stored_card || !stored_card.carded_ai)
|
if(!stored_card?.carded_ai)
|
||||||
power_usage = power_usage_idle
|
power_usage = power_usage_idle
|
||||||
return
|
return
|
||||||
power_usage = power_usage_occupied
|
power_usage = power_usage_occupied
|
||||||
|
|
||||||
/obj/item/computer_hardware/ai_slot/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
/obj/item/computer_hardware/ai_slot/attackby(obj/item/W, mob/user)
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return TRUE
|
||||||
if(istype(W, /obj/item/aicard))
|
if(istype(W, /obj/item/aicard))
|
||||||
if(stored_card)
|
if(stored_card)
|
||||||
to_chat(user, "\The [src] is already occupied.")
|
to_chat(user, SPAN_WARNING("\The [src] is already occupied."))
|
||||||
return
|
return
|
||||||
user.drop_from_inventory(W,src)
|
user.drop_from_inventory(W, src)
|
||||||
stored_card = W
|
stored_card = W
|
||||||
update_power_usage()
|
update_power_usage()
|
||||||
if(W.isscrewdriver())
|
if(W.isscrewdriver())
|
||||||
to_chat(user, "You manually remove \the [stored_card] from \the [src].")
|
to_chat(user, SPAN_NOTICE("You manually remove \the [stored_card] from \the [src]."))
|
||||||
stored_card.forceMove(get_turf(src))
|
stored_card.forceMove(get_turf(src))
|
||||||
stored_card = null
|
stored_card = null
|
||||||
update_power_usage()
|
update_power_usage()
|
||||||
|
|
||||||
/obj/item/computer_hardware/ai_slot/Destroy()
|
/obj/item/computer_hardware/ai_slot/Destroy()
|
||||||
if(holder2 && (holder2.ai_slot == src))
|
if(parent_computer?.ai_slot == src)
|
||||||
holder2.ai_slot = null
|
parent_computer.ai_slot = null
|
||||||
if(stored_card)
|
if(stored_card)
|
||||||
stored_card.forceMove(get_turf(holder2))
|
stored_card.forceMove(get_turf(parent_computer))
|
||||||
holder2 = null
|
parent_computer = null
|
||||||
return ..()
|
return ..()
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
// have tremendeous capacity in comparsion. Higher tier cells would provide your device with nearly infinite battery life, which is something i want to avoid.
|
// have tremendeous capacity in comparsion. Higher tier cells would provide your device with nearly infinite battery life, which is something i want to avoid.
|
||||||
/obj/item/computer_hardware/battery_module
|
/obj/item/computer_hardware/battery_module
|
||||||
name = "standard battery"
|
name = "standard battery"
|
||||||
desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. It's rating is 750."
|
desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. Its rating is 750."
|
||||||
icon_state = "battery_normal"
|
icon_state = "battery_normal"
|
||||||
critical = 1
|
critical = TRUE
|
||||||
malfunction_probability = 1
|
malfunction_probability = 1
|
||||||
origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
|
origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
|
||||||
var/battery_rating = 750
|
var/battery_rating = 750
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/advanced
|
/obj/item/computer_hardware/battery_module/advanced
|
||||||
name = "advanced battery"
|
name = "advanced battery"
|
||||||
desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 1100."
|
desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. Its rating is 1100."
|
||||||
icon_state = "battery_advanced"
|
icon_state = "battery_advanced"
|
||||||
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2)
|
||||||
battery_rating = 1100
|
battery_rating = 1100
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/super
|
/obj/item/computer_hardware/battery_module/super
|
||||||
name = "super battery"
|
name = "super battery"
|
||||||
desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500."
|
desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. Its rating is 1500."
|
||||||
icon_state = "battery_super"
|
icon_state = "battery_super"
|
||||||
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
|
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3)
|
||||||
hardware_size = 3
|
hardware_size = 3
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/ultra
|
/obj/item/computer_hardware/battery_module/ultra
|
||||||
name = "ultra battery"
|
name = "ultra battery"
|
||||||
desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 2000."
|
desc = "A very advanced large power cell. Its often used as uninterruptable power supply for critical consoles or servers. Its rating is 2000."
|
||||||
icon_state = "battery_ultra"
|
icon_state = "battery_ultra"
|
||||||
origin_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4)
|
origin_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4)
|
||||||
hardware_size = 3
|
hardware_size = 3
|
||||||
@@ -36,14 +36,14 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/micro
|
/obj/item/computer_hardware/battery_module/micro
|
||||||
name = "micro battery"
|
name = "micro battery"
|
||||||
desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 500."
|
desc = "A small power cell, commonly seen in most portable microcomputers. Its rating is 500."
|
||||||
icon_state = "battery_micro"
|
icon_state = "battery_micro"
|
||||||
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2)
|
||||||
battery_rating = 500
|
battery_rating = 500
|
||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/nano
|
/obj/item/computer_hardware/battery_module/nano
|
||||||
name = "nano battery"
|
name = "nano battery"
|
||||||
desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 300."
|
desc = "A tiny power cell, commonly seen in low-end portable microcomputers. Its rating is 300."
|
||||||
icon_state = "battery_nano"
|
icon_state = "battery_nano"
|
||||||
origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
|
origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
|
||||||
battery_rating = 300
|
battery_rating = 300
|
||||||
@@ -58,15 +58,15 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/lambda/Initialize()
|
/obj/item/computer_hardware/battery_module/lambda/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
battery = new/obj/item/cell/infinite(src)
|
battery = new /obj/item/cell/infinite(src)
|
||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/diagnostics(var/mob/user)
|
/obj/item/computer_hardware/battery_module/diagnostics(var/mob/user)
|
||||||
..()
|
..()
|
||||||
to_chat(user, "Internal battery charge: [battery.charge]/[battery.maxcharge] mAh")
|
to_chat(user, SPAN_NOTICE("Internal battery charge: [battery.charge]/[battery.maxcharge] mAh"))
|
||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/Initialize()
|
/obj/item/computer_hardware/battery_module/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
battery = new/obj/item/cell/device/variable(src, battery_rating)
|
battery = new /obj/item/cell/device/variable(src, battery_rating)
|
||||||
battery.charge = 0
|
battery.charge = 0
|
||||||
|
|
||||||
/obj/item/computer_hardware/battery_module/proc/charge_to_full()
|
/obj/item/computer_hardware/battery_module/proc/charge_to_full()
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
name = "RFID card slot"
|
name = "RFID card slot"
|
||||||
desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly."
|
desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly."
|
||||||
power_usage = 10 //W
|
power_usage = 10 //W
|
||||||
critical = 0
|
critical = FALSE
|
||||||
icon_state = "cardreader"
|
icon_state = "cardreader"
|
||||||
hardware_size = 1
|
hardware_size = 1
|
||||||
origin_tech = list(TECH_DATA = 2)
|
origin_tech = list(TECH_DATA = 2)
|
||||||
|
|
||||||
var/obj/item/card/id/stored_card = null
|
var/obj/item/card/id/stored_card
|
||||||
|
|
||||||
/obj/item/computer_hardware/card_slot/Destroy()
|
/obj/item/computer_hardware/card_slot/Destroy()
|
||||||
if(holder2 && (holder2.card_slot == src))
|
if(parent_computer?.card_slot == src)
|
||||||
holder2.card_slot = null
|
parent_computer.card_slot = null
|
||||||
if(stored_card)
|
if(stored_card)
|
||||||
stored_card.forceMove(get_turf(holder2))
|
stored_card.forceMove(get_turf(parent_computer))
|
||||||
holder2 = null
|
parent_computer = null
|
||||||
return ..()
|
return ..()
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||||
var/max_capacity = 128
|
var/max_capacity = 128
|
||||||
var/used_capacity = 0
|
var/used_capacity = 0
|
||||||
var/read_only = 0 // If the HDD is read only
|
var/read_only = FALSE // If the HDD is read only
|
||||||
var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
|
var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
|
||||||
|
|
||||||
/obj/item/computer_hardware/hard_drive/advanced
|
/obj/item/computer_hardware/hard_drive/advanced
|
||||||
@@ -59,108 +59,94 @@
|
|||||||
/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user)
|
/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user)
|
||||||
..()
|
..()
|
||||||
// 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
|
// 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
|
||||||
to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999")
|
to_chat(user, SPAN_NOTICE("NT-NFS File Table Status: [stored_files.len]/999"))
|
||||||
to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ")
|
to_chat(user, SPAN_NOTICE("Storage capacity: [used_capacity]/[max_capacity]GQ"))
|
||||||
|
|
||||||
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
||||||
/obj/item/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
|
/obj/item/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!can_store_file(F.size))
|
if(!can_store_file(F.size))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!check_functionality())
|
if(!check_functionality())
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!stored_files)
|
if(!stored_files)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// This file is already stored. Don't store it again.
|
// This file is already stored. Don't store it again.
|
||||||
if(F in stored_files)
|
if(F in stored_files)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
F.holder = src
|
F.hard_drive = src
|
||||||
stored_files.Add(F)
|
stored_files.Add(F)
|
||||||
recalculate_size()
|
recalculate_size()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
||||||
/obj/item/computer_hardware/hard_drive/proc/install_default_programs()
|
/obj/item/computer_hardware/hard_drive/proc/install_default_programs()
|
||||||
store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar
|
store_file(new /datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar
|
||||||
store_file(new/datum/computer_file/program/clientmanager(src)) // Client Manager to Enroll the Device
|
store_file(new /datum/computer_file/program/clientmanager(src)) // Client Manager to Enroll the Device
|
||||||
|
|
||||||
|
|
||||||
// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
||||||
/obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
|
/obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!stored_files || read_only)
|
if(!stored_files || read_only)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!check_functionality())
|
if(!check_functionality())
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(F in stored_files)
|
if(F in stored_files)
|
||||||
stored_files -= F
|
stored_files -= F
|
||||||
recalculate_size()
|
recalculate_size()
|
||||||
return 1
|
return TRUE
|
||||||
else
|
else
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// Loops through all stored files and recalculates used_capacity of this drive
|
// Loops through all stored files and recalculates used_capacity of this drive
|
||||||
/obj/item/computer_hardware/hard_drive/proc/recalculate_size()
|
/obj/item/computer_hardware/hard_drive/proc/recalculate_size()
|
||||||
var/total_size = 0
|
var/total_size = 0
|
||||||
for(var/datum/computer_file/F in stored_files)
|
for(var/datum/computer_file/F in stored_files)
|
||||||
total_size += F.size
|
total_size += F.size
|
||||||
|
|
||||||
used_capacity = total_size
|
used_capacity = total_size
|
||||||
|
|
||||||
// Checks whether file can be stored on the hard drive.
|
// Checks whether file can be stored on the hard drive.
|
||||||
/obj/item/computer_hardware/hard_drive/proc/can_store_file(var/size = 1)
|
/obj/item/computer_hardware/hard_drive/proc/can_store_file(var/size = TRUE)
|
||||||
// In the unlikely event someone manages to create that many files.
|
// In the unlikely event someone manages to create that many files.
|
||||||
// BYOND is acting weird with numbers above 999 in loops (infinite loop prevention)
|
// BYOND is acting weird with numbers above 999 in loops (infinite loop prevention)
|
||||||
if(read_only)
|
if(read_only)
|
||||||
return 0
|
return FALSE
|
||||||
if(stored_files.len >= 999)
|
if(stored_files.len >= 999)
|
||||||
return 0
|
return FALSE
|
||||||
if(used_capacity + size > max_capacity)
|
if(used_capacity + size > max_capacity)
|
||||||
return 0
|
return FALSE
|
||||||
else
|
else
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
// Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file.
|
// Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file.
|
||||||
/obj/item/computer_hardware/hard_drive/proc/try_store_file(var/datum/computer_file/F)
|
/obj/item/computer_hardware/hard_drive/proc/try_store_file(var/datum/computer_file/F)
|
||||||
if(!F || !istype(F))
|
if(!F || !istype(F))
|
||||||
return 0
|
return FALSE
|
||||||
var/name = F.filename + "." + F.filetype
|
var/name = F.filename + "." + F.filetype
|
||||||
for(var/datum/computer_file/file in stored_files)
|
for(var/datum/computer_file/file in stored_files)
|
||||||
if((file.filename + "." + file.filetype) == name)
|
if((file.filename + "." + file.filetype) == name)
|
||||||
return 0
|
return FALSE
|
||||||
return can_store_file(F.size)
|
return can_store_file(F.size)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Tries to find the file by filename. Returns null on failure
|
// Tries to find the file by filename. Returns null on failure
|
||||||
/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
|
/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
|
||||||
if(!check_functionality())
|
if(!check_functionality())
|
||||||
return null
|
return null
|
||||||
|
|
||||||
if(!filename)
|
if(!filename)
|
||||||
return null
|
return null
|
||||||
|
|
||||||
if(!stored_files)
|
if(!stored_files)
|
||||||
return null
|
return null
|
||||||
|
|
||||||
for(var/datum/computer_file/F in stored_files)
|
for(var/datum/computer_file/F in stored_files)
|
||||||
if(F.filename == filename)
|
if(F.filename == filename)
|
||||||
return F
|
return F
|
||||||
return null
|
return null
|
||||||
|
|
||||||
/obj/item/computer_hardware/hard_drive/Destroy()
|
/obj/item/computer_hardware/hard_drive/Destroy()
|
||||||
if(holder2 && (holder2.hard_drive == src))
|
if(parent_computer?.hard_drive == src)
|
||||||
holder2.hard_drive = null
|
parent_computer.hard_drive = null
|
||||||
stored_files = null
|
stored_files = null
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
@@ -183,6 +169,6 @@
|
|||||||
/obj/item/computer_hardware/hard_drive/attackby(obj/item/W, mob/living/user)
|
/obj/item/computer_hardware/hard_drive/attackby(obj/item/W, mob/living/user)
|
||||||
if(istype(W, /obj/item/card/tech_support))
|
if(istype(W, /obj/item/card/tech_support))
|
||||||
reset_drive()
|
reset_drive()
|
||||||
to_chat(user, span("notice", "Drive successfully reset."))
|
to_chat(user, SPAN_NOTICE("Drive successfully reset."))
|
||||||
else
|
else
|
||||||
..()
|
..()
|
||||||
@@ -2,87 +2,85 @@
|
|||||||
name = "Hardware"
|
name = "Hardware"
|
||||||
desc = "Unknown Hardware."
|
desc = "Unknown Hardware."
|
||||||
icon = 'icons/obj/modular_components.dmi'
|
icon = 'icons/obj/modular_components.dmi'
|
||||||
var/obj/item/modular_computer/holder2 = null
|
var/obj/item/modular_computer/parent_computer
|
||||||
var/power_usage = 0 // If the hardware uses extra power, change this.
|
var/power_usage = 0 // If the hardware uses extra power, change this.
|
||||||
var/enabled = 1 // If the hardware is turned off set this to 0.
|
var/enabled = TRUE // If the hardware is turned off set this to 0.
|
||||||
var/critical = 1 // Prevent disabling for important component, like the HDD.
|
var/critical = TRUE // Prevent disabling for important component, like the HDD.
|
||||||
var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only
|
var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only
|
||||||
var/damage = 0 // Current damage level
|
var/damage = 0 // Current damage level
|
||||||
var/max_damage = 100 // Maximal damage level.
|
var/max_damage = 100 // Maximal damage level.
|
||||||
var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
|
var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
|
||||||
var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
|
var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
|
||||||
var/malfunction_probability = 10// Chance of malfunction when the component is damaged
|
var/malfunction_probability = 10 // Chance of malfunction when the component is damaged
|
||||||
|
|
||||||
/obj/item/computer_hardware/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
|
/obj/item/computer_hardware/attackby(obj/item/W, mob/living/user)
|
||||||
// Multitool. Runs diagnostics
|
// Multitool. Runs diagnostics
|
||||||
if(W.ismultitool())
|
if(W.ismultitool())
|
||||||
to_chat(user, "***** DIAGNOSTICS REPORT *****")
|
to_chat(user, SPAN_NOTICE("***** DIAGNOSTICS REPORT *****"))
|
||||||
diagnostics(user)
|
diagnostics(user)
|
||||||
to_chat(user, "******************************")
|
to_chat(user, SPAN_NOTICE("******************************"))
|
||||||
return 1
|
return 1
|
||||||
// Nanopaste. Repair all damage if present for a single unit.
|
// Nanopaste. Repair all damage if present for a single unit.
|
||||||
var/obj/item/stack/S = W
|
var/obj/item/stack/S = W
|
||||||
if(istype(S, /obj/item/stack/nanopaste))
|
if(istype(S, /obj/item/stack/nanopaste))
|
||||||
if(!damage)
|
if(!damage)
|
||||||
to_chat(user, "\The [src] doesn't seem to require repairs.")
|
to_chat(user, SPAN_WARNING("\The [src] doesn't seem to require repairs."))
|
||||||
return 1
|
return TRUE
|
||||||
if(S.use(1))
|
if(S.use(1))
|
||||||
to_chat(user, "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage.")
|
to_chat(user, SPAN_NOTICE("You apply a bit of \the [W] to \the [src], repairing it fully."))
|
||||||
damage = 0
|
damage = 0
|
||||||
return 1
|
return TRUE
|
||||||
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
|
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
|
||||||
if(S.iscoil())
|
if(S.iscoil())
|
||||||
if(!damage)
|
if(!damage)
|
||||||
to_chat(user, "\The [src] doesn't seem to require repairs.")
|
to_chat(user, SPAN_WARNING("\The [src] doesn't seem to require repairs."))
|
||||||
return 1
|
return TRUE
|
||||||
if(S.use(1))
|
if(S.use(1))
|
||||||
to_chat(user, "You patch up \the [src] with a bit of \the [W].")
|
to_chat(user, SPAN_NOTICE("You patch up \the [src] with a bit of \the [W]."))
|
||||||
take_damage(-10)
|
take_damage(-10)
|
||||||
return 1
|
return TRUE
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
// Called on multitool click, prints diagnostic information to the user.
|
// Called on multitool click, prints diagnostic information to the user.
|
||||||
/obj/item/computer_hardware/proc/diagnostics(var/mob/user)
|
/obj/item/computer_hardware/proc/diagnostics(var/mob/user)
|
||||||
to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]")
|
to_chat(user, SPAN_NOTICE("Hardware Integrity Test... (Physical Damage: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]"))
|
||||||
|
|
||||||
/obj/item/computer_hardware/Initialize()
|
/obj/item/computer_hardware/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
w_class = hardware_size
|
w_class = hardware_size
|
||||||
if(istype(loc, /obj/item/modular_computer))
|
if(istype(loc, /obj/item/modular_computer))
|
||||||
holder2 = loc
|
parent_computer = loc
|
||||||
return .
|
return .
|
||||||
|
|
||||||
/obj/item/computer_hardware/Destroy()
|
/obj/item/computer_hardware/Destroy()
|
||||||
holder2 = null
|
parent_computer = null
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
// Handles damage checks
|
// Handles damage checks
|
||||||
/obj/item/computer_hardware/proc/check_functionality()
|
/obj/item/computer_hardware/proc/check_functionality()
|
||||||
// Turned off
|
// Turned off
|
||||||
if(!enabled)
|
if(!enabled)
|
||||||
return 0
|
return FALSE
|
||||||
// Too damaged to work at all.
|
// Too damaged to work at all.
|
||||||
if(damage > damage_failure)
|
if(damage > damage_failure)
|
||||||
return 0
|
return FALSE
|
||||||
// Still working. Well, sometimes...
|
// Still working. Well, sometimes...
|
||||||
if(damage > damage_malfunction)
|
if(damage > damage_malfunction)
|
||||||
if(prob(malfunction_probability))
|
if(prob(malfunction_probability))
|
||||||
return 0
|
return FALSE
|
||||||
// Good to go.
|
// Good to go.
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/obj/item/computer_hardware/examine(var/mob/user)
|
/obj/item/computer_hardware/examine(var/mob/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(damage > damage_failure)
|
if(damage > damage_failure)
|
||||||
to_chat(user, "<span class='danger'>It seems to be severely damaged!</span>")
|
to_chat(user, SPAN_DANGER("It seems to be severely damaged!"))
|
||||||
else if(damage > damage_malfunction)
|
else if(damage > damage_malfunction)
|
||||||
to_chat(user, "<span class='notice'>It seems to be damaged!</span>")
|
to_chat(user, SPAN_WARNING("It seems to be damaged!"))
|
||||||
else if(damage)
|
else if(damage)
|
||||||
to_chat(user, "It seems to be slightly damaged.")
|
to_chat(user, SPAN_WARNING("It seems to be slightly damaged."))
|
||||||
|
|
||||||
// Damages the component. Contains necessary checks. Negative damage "heals" the component.
|
// Damages the component. Contains necessary checks. Negative damage "heals" the component.
|
||||||
/obj/item/computer_hardware/proc/take_damage(var/amount)
|
/obj/item/computer_hardware/proc/take_damage(var/amount)
|
||||||
damage += round(amount) // We want nice rounded numbers here.
|
damage += round(amount) // We want nice rounded numbers here.
|
||||||
damage = between(0, damage, max_damage) // Clamp the value.
|
damage = between(0, damage, max_damage) // Clamp the value.
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
desc = "Small integrated printer with paper recycling module."
|
desc = "Small integrated printer with paper recycling module."
|
||||||
power_usage = 50
|
power_usage = 50
|
||||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2)
|
||||||
critical = 0
|
critical = FALSE
|
||||||
icon_state = "printer"
|
icon_state = "printer"
|
||||||
hardware_size = 1
|
hardware_size = 1
|
||||||
var/stored_paper = 5
|
var/stored_paper = 5
|
||||||
@@ -11,20 +11,20 @@
|
|||||||
|
|
||||||
/obj/item/computer_hardware/nano_printer/diagnostics(var/mob/user)
|
/obj/item/computer_hardware/nano_printer/diagnostics(var/mob/user)
|
||||||
..()
|
..()
|
||||||
to_chat(user, "Paper buffer level: [stored_paper]/[max_paper]")
|
to_chat(user, SPAN_NOTICE("Paper Buffer Level: [stored_paper]/[max_paper]"))
|
||||||
|
|
||||||
/obj/item/computer_hardware/nano_printer/proc/print_text(var/text_to_print, var/paper_title = null, var/paper_color = null)
|
/obj/item/computer_hardware/nano_printer/proc/print_text(var/text_to_print, var/paper_title = null, var/paper_color = null)
|
||||||
if(!stored_paper)
|
if(!stored_paper)
|
||||||
return 0
|
return FALSE
|
||||||
if(!enabled)
|
if(!enabled)
|
||||||
return 0
|
return FALSE
|
||||||
if(!check_functionality())
|
if(!check_functionality())
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// Damaged printer causes the resulting paper to be somewhat harder to read.
|
// Damaged printer causes the resulting paper to be somewhat harder to read.
|
||||||
if(damage > damage_malfunction)
|
if(damage > damage_malfunction)
|
||||||
text_to_print = stars(text_to_print, 100-malfunction_probability)
|
text_to_print = stars(text_to_print, 100-malfunction_probability)
|
||||||
var/obj/item/paper/P = new /obj/item/paper(get_turf(holder2),text_to_print, paper_title)
|
var/obj/item/paper/P = new /obj/item/paper(get_turf(parent_computer),text_to_print, paper_title)
|
||||||
P.info = text_to_print
|
P.info = text_to_print
|
||||||
if (paper_color)
|
if (paper_color)
|
||||||
P.color = paper_color
|
P.color = paper_color
|
||||||
@@ -32,18 +32,19 @@
|
|||||||
stored_paper--
|
stored_paper--
|
||||||
return P
|
return P
|
||||||
|
|
||||||
/obj/item/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob)
|
/obj/item/computer_hardware/nano_printer/attackby(obj/item/W, mob/user)
|
||||||
if(istype(W, /obj/item/paper))
|
if(istype(W, /obj/item/paper))
|
||||||
if(stored_paper >= max_paper)
|
if(stored_paper >= max_paper)
|
||||||
to_chat(user, "You try to add \the [W] into [src], but it's paper bin is full")
|
to_chat(user, SPAN_WARNING("You try to add \the [W] to the [src], but its paper bin is full."))
|
||||||
return
|
return
|
||||||
|
to_chat(user, SPAN_NOTICE("You insert \the [W] into [src]."))
|
||||||
to_chat(user, "You insert \the [W] into [src].")
|
|
||||||
qdel(W)
|
qdel(W)
|
||||||
stored_paper++
|
stored_paper++
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/item/computer_hardware/nano_printer/Destroy()
|
/obj/item/computer_hardware/nano_printer/Destroy()
|
||||||
if(holder2 && (holder2.nano_printer == src))
|
if(parent_computer?.nano_printer == src)
|
||||||
holder2.nano_printer = null
|
parent_computer.nano_printer = null
|
||||||
holder2 = null
|
parent_computer = null
|
||||||
return ..()
|
return ..()
|
||||||
@@ -1,29 +1,29 @@
|
|||||||
var/global/ntnet_card_uid = 1
|
var/global/ntnet_card_uid = 1
|
||||||
|
|
||||||
/obj/item/computer_hardware/network_card/
|
/obj/item/computer_hardware/network_card
|
||||||
name = "basic NTNet network card"
|
name = "basic NTNet network card"
|
||||||
desc = "A basic network card for usage with standard NTNet frequencies."
|
desc = "A basic network card for usage with standard NTNet frequencies."
|
||||||
power_usage = 50
|
power_usage = 50
|
||||||
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1)
|
origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1)
|
||||||
critical = 0
|
critical = FALSE
|
||||||
icon_state = "netcard_basic"
|
icon_state = "netcard_basic"
|
||||||
hardware_size = 1
|
hardware_size = 1
|
||||||
var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
|
var/identification_id // Identification ID. Technically MAC address of this device. Can't be changed by user.
|
||||||
var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
|
var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
|
||||||
var/long_range = 0
|
var/long_range = FALSE
|
||||||
var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
|
var/ethernet = FALSE // Hard-wired, therefore always on, ignores NTNet wireless checks.
|
||||||
malfunction_probability = 1
|
malfunction_probability = 1
|
||||||
|
|
||||||
/obj/item/computer_hardware/network_card/diagnostics(var/mob/user)
|
/obj/item/computer_hardware/network_card/diagnostics(mob/user)
|
||||||
..()
|
..()
|
||||||
to_chat(user, "NIX Unique ID: [identification_id]")
|
to_chat(user, SPAN_NOTICE("NIX Unique ID: [identification_id]"))
|
||||||
to_chat(user, "NIX User Tag: [identification_string]")
|
to_chat(user, SPAN_NOTICE("NIX User Tag: [identification_string]"))
|
||||||
to_chat(user, "Supported protocols:")
|
to_chat(user, SPAN_NOTICE("Supported protocols:"))
|
||||||
to_chat(user, "511.m SFS (Subspace) - Standard Frequency Spread")
|
to_chat(user, SPAN_NOTICE("511.m SFS (Subspace) - Standard Frequency Spread"))
|
||||||
if(long_range)
|
if(long_range)
|
||||||
to_chat(user, "511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandiwdth")
|
to_chat(user, SPAN_NOTICE("511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandwidth"))
|
||||||
if(ethernet)
|
if(ethernet)
|
||||||
to_chat(user, "OpenEth (Physical Connection) - Physical network connection port")
|
to_chat(user, SPAN_NOTICE("OpenEth (Physical Connection) - Physical Network Connection Port"))
|
||||||
|
|
||||||
/obj/item/computer_hardware/network_card/Initialize()
|
/obj/item/computer_hardware/network_card/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -32,8 +32,8 @@ var/global/ntnet_card_uid = 1
|
|||||||
|
|
||||||
/obj/item/computer_hardware/network_card/advanced
|
/obj/item/computer_hardware/network_card/advanced
|
||||||
name = "advanced NTNet network card"
|
name = "advanced NTNet network card"
|
||||||
desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station."
|
desc = "An advanced network card for usage with standard NTNet frequencies. Its transmitter is strong enough to connect even off-station."
|
||||||
long_range = 1
|
long_range = TRUE
|
||||||
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2)
|
||||||
power_usage = 150 // Better range but higher power usage.
|
power_usage = 150 // Better range but higher power usage.
|
||||||
icon_state = "netcard_advanced"
|
icon_state = "netcard_advanced"
|
||||||
@@ -42,41 +42,31 @@ var/global/ntnet_card_uid = 1
|
|||||||
/obj/item/computer_hardware/network_card/wired
|
/obj/item/computer_hardware/network_card/wired
|
||||||
name = "wired NTNet network card"
|
name = "wired NTNet network card"
|
||||||
desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection."
|
desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection."
|
||||||
ethernet = 1
|
ethernet = TRUE
|
||||||
origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3)
|
origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3)
|
||||||
power_usage = 150 // Better range but higher power usage.
|
power_usage = 150 // Better range but higher power usage.
|
||||||
icon_state = "netcard_ethernet"
|
icon_state = "netcard_ethernet"
|
||||||
hardware_size = 3
|
hardware_size = 3
|
||||||
|
|
||||||
/obj/item/computer_hardware/network_card/Destroy()
|
|
||||||
if(holder2 && (holder2.network_card == src))
|
|
||||||
holder2.network_card = null
|
|
||||||
holder2 = null
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
// Returns a string identifier of this network card
|
// Returns a string identifier of this network card
|
||||||
/obj/item/computer_hardware/network_card/proc/get_network_tag()
|
/obj/item/computer_hardware/network_card/proc/get_network_tag()
|
||||||
return "[identification_string] (NID [identification_id])"
|
return "[identification_string] (NID [identification_id])"
|
||||||
|
|
||||||
// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
|
// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
|
||||||
/obj/item/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
|
/obj/item/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
|
||||||
if(!holder2) // Hardware is not installed in anything. No signal. How did this even get called?
|
if(!parent_computer) // Hardware is not installed in anything. No signal. How did this even get called?
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(!enabled)
|
if(!enabled)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(!check_functionality())
|
if(!check_functionality())
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(ethernet) // Computer is connected via wired connection.
|
if(ethernet) // Computer is connected via wired connection.
|
||||||
return 3
|
return 3
|
||||||
|
|
||||||
if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
|
if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(holder2)
|
if(parent_computer)
|
||||||
var/turf/T = get_turf(holder2)
|
var/turf/T = get_turf(parent_computer)
|
||||||
if((T && istype(T)) && isStationLevel(T.z))
|
if((T && istype(T)) && isStationLevel(T.z))
|
||||||
// Computer is on station. Low/High signal depending on what type of network card you have
|
// Computer is on station. Low/High signal depending on what type of network card you have
|
||||||
if(long_range)
|
if(long_range)
|
||||||
@@ -90,6 +80,7 @@ var/global/ntnet_card_uid = 1
|
|||||||
return 0 // Computer is not on station and does not have upgraded network card. No signal.
|
return 0 // Computer is not on station and does not have upgraded network card. No signal.
|
||||||
|
|
||||||
/obj/item/computer_hardware/network_card/Destroy()
|
/obj/item/computer_hardware/network_card/Destroy()
|
||||||
if(holder2 && (holder2.network_card == src))
|
if(parent_computer?.network_card == src)
|
||||||
holder2.network_card = null
|
parent_computer.network_card = null
|
||||||
|
parent_computer = null
|
||||||
return ..()
|
return ..()
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
// These are basically USB data sticks and may be used to transfer files between devices
|
// These are basically USB data sticks and may be used to transfer files between devices
|
||||||
/obj/item/computer_hardware/hard_drive/portable/
|
/obj/item/computer_hardware/hard_drive/portable
|
||||||
name = "basic data crystal"
|
name = "basic data crystal"
|
||||||
desc = "Small crystal with imprinted photonic circuits that can be used to store data. Its capacity is 16 GQ."
|
desc = "Small crystal with imprinted photonic circuits that can be used to store data. Its capacity is 16 GQ."
|
||||||
power_usage = 10
|
power_usage = 10
|
||||||
|
|||||||
@@ -12,10 +12,8 @@
|
|||||||
if(prog.available_on_ntnet)
|
if(prog.available_on_ntnet)
|
||||||
store_file(prog)
|
store_file(prog)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/computer_hardware/hard_drive/portable/backup
|
/obj/item/computer_hardware/hard_drive/portable/backup
|
||||||
var/_program = null //Change that far to the file name of the backup program you would like to spawn
|
var/_program //Change that far to the file name of the backup program you would like to spawn
|
||||||
origin_tech = list() //Nope, no research levels from backup disks
|
origin_tech = list() //Nope, no research levels from backup disks
|
||||||
|
|
||||||
/obj/item/computer_hardware/hard_drive/portable/backup/New(loc, var/prog_name)
|
/obj/item/computer_hardware/hard_drive/portable/backup/New(loc, var/prog_name)
|
||||||
@@ -33,18 +31,17 @@
|
|||||||
return
|
return
|
||||||
max_capacity = PRG.size // Set the capacity of the backup disk to the capacity of the program
|
max_capacity = PRG.size // Set the capacity of the backup disk to the capacity of the program
|
||||||
store_file(PRG)
|
store_file(PRG)
|
||||||
read_only = 1
|
read_only = TRUE
|
||||||
desc = "A read-only backup storage crystal containing a backup of the following software: [PRG.filename]"
|
desc = "A read-only backup storage crystal containing a backup of the following software: [PRG.filename]"
|
||||||
name = "[PRG.filename] backup crystal"
|
name = "[PRG.filename] backup crystal"
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/closet/crate/software_backup
|
/obj/structure/closet/crate/software_backup
|
||||||
desc = "A crate containing a backup of all the NT Software available"
|
desc = "A crate containing a backup of all the NT Software available."
|
||||||
name = "Backup Software Crate"
|
name = "Backup Software Crate"
|
||||||
|
|
||||||
/obj/structure/closet/crate/software_backup/Initialize()
|
/obj/structure/closet/crate/software_backup/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
for(var/F in typesof(/datum/computer_file/program))
|
for(var/F in subtypesof(/datum/computer_file/program))
|
||||||
var/datum/computer_file/program/prog = new F
|
var/datum/computer_file/program/prog = new F
|
||||||
// Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program)
|
// Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program)
|
||||||
if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG")
|
if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG")
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
icon_state = "cpu_normal"
|
icon_state = "cpu_normal"
|
||||||
hardware_size = 2
|
hardware_size = 2
|
||||||
power_usage = 75
|
power_usage = 75
|
||||||
critical = 1
|
|
||||||
malfunction_probability = 1
|
malfunction_probability = 1
|
||||||
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
/obj/item/computer_hardware/tesla_link
|
/obj/item/computer_hardware/tesla_link
|
||||||
name = "tesla link"
|
name = "tesla link"
|
||||||
desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller."
|
desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller."
|
||||||
critical = 0
|
critical = FALSE
|
||||||
enabled = 1
|
|
||||||
icon_state = "teslalink"
|
icon_state = "teslalink"
|
||||||
hardware_size = 3
|
hardware_size = 3
|
||||||
origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
|
origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
|
||||||
var/obj/machinery/modular_computer/holder
|
|
||||||
var/passive_charging_rate = 250 // W
|
var/passive_charging_rate = 250 // W
|
||||||
|
|
||||||
/obj/item/computer_hardware/tesla_link/Destroy()
|
/obj/item/computer_hardware/tesla_link/Destroy()
|
||||||
if(holder2 && (holder2.tesla_link == src))
|
if(parent_computer?.tesla_link == src)
|
||||||
holder2.tesla_link = null
|
parent_computer.tesla_link = null
|
||||||
return ..()
|
return ..()
|
||||||
@@ -5,13 +5,12 @@
|
|||||||
desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers."
|
desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers."
|
||||||
icon = 'icons/obj/vending.dmi'
|
icon = 'icons/obj/vending.dmi'
|
||||||
icon_state = "robotics"
|
icon_state = "robotics"
|
||||||
layer = 2.9
|
anchored = TRUE
|
||||||
anchored = 1
|
density = TRUE
|
||||||
density = 1
|
|
||||||
|
|
||||||
// The actual laptop/tablet
|
// The actual laptop/tablet
|
||||||
var/obj/item/modular_computer/laptop/fabricated_laptop = null
|
var/obj/item/modular_computer/laptop/fabricated_laptop
|
||||||
var/obj/item/modular_computer/tablet/fabricated_tablet = null
|
var/obj/item/modular_computer/tablet/fabricated_tablet
|
||||||
|
|
||||||
// Utility vars
|
// Utility vars
|
||||||
var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen
|
var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen
|
||||||
@@ -358,6 +357,3 @@
|
|||||||
else // just incase
|
else // just incase
|
||||||
ping("You cannot pay with this!")
|
ping("You cannot pay with this!")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
12
html/changelogs/geeves-modular_computer_enhancement.yml
Normal file
12
html/changelogs/geeves-modular_computer_enhancement.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
author: Geeves
|
||||||
|
|
||||||
|
delete-after: True
|
||||||
|
|
||||||
|
changes:
|
||||||
|
- rscadd: "Modular computers have gotten a major clean-up. Many programs and interactions should look prettier and feel smoother now."
|
||||||
|
- rscadd: "Click dragging most modular computers now open their interface, much like with PDAs."
|
||||||
|
- rscadd: "The IRC program now outputs messages to your chat log, much like PDA messaging does. For smaller devices, it must be on your person, whilst larger ones have a radius to it. The IRC program must be open, it doesn't have to be active, for it to work."
|
||||||
|
- tweak: "The size of the antag hacked camera program has been brought way down, to make it worth getting, if you wish to do so."
|
||||||
|
- rscadd: "Added some new names to the modular computer arcade game."
|
||||||
|
- tweak: "Suit sensors can now be run on most regular modular computers, no big change in that department."
|
||||||
|
- rscadd: "Computers now ping when they finish downloading programs, letting you know without needing to check them."
|
||||||
Reference in New Issue
Block a user