mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-27 10:32:08 +00:00
Modular PDA tweaks and bugfixes (#10440)
rscadd: "Handheld modular computers now use flashlights as a light source. They may be turned on/off via a button in the PC header, and have their brightness adjusted in Hardware Configuration."
tweak: Message notifications should be much larger.
tweak: "Chat messages are now logged to the NTNet Monitoring program."
bugfix: "IDs are now unregistered from computers when the computer is destroyed."
bugfix: "Fix Eject Battery having a global view range."
bugfix: "Chat Clients are no longer set to 'silent' by default."
backend: "Added a new slider component for VueUIs."
Closes #10439
This commit is contained in:
@@ -2223,6 +2223,7 @@
|
||||
#include "code\modules\modular_computers\hardware\card_slot.dm"
|
||||
#include "code\modules\modular_computers\hardware\hard_drive.dm"
|
||||
#include "code\modules\modular_computers\hardware\hardware.dm"
|
||||
#include "code\modules\modular_computers\hardware\misc.dm"
|
||||
#include "code\modules\modular_computers\hardware\nano_printer.dm"
|
||||
#include "code\modules\modular_computers\hardware\network_card.dm"
|
||||
#include "code\modules\modular_computers\hardware\portable_hard_drive.dm"
|
||||
|
||||
@@ -24,11 +24,13 @@ var/global/ntnrc_uid = 0
|
||||
|
||||
for(var/datum/computer_file/program/chatclient/C in clients)
|
||||
if(C.program_state > PROGRAM_STATE_KILLED)
|
||||
C.computer.output_message(FONT_SMALL("<b>([get_title(C)]) <i>[username]</i>:</b> [message] (<a href='byond://?src=\ref[C];Reply=1;target=[src.title]'>Reply</a>)"), 0)
|
||||
C.computer.output_message("<b>([get_title(C)]) <i>[username]</i>:</b> [message] (<a href='byond://?src=\ref[C];Reply=1;target=[src.title]'>Reply</a>)", 0)
|
||||
if(!C.silent && C.username != username && C.program_state == PROGRAM_STATE_BACKGROUND)
|
||||
for (var/mob/O in hearers(2, get_turf(C.computer)))
|
||||
playsound(C.computer, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
O.show_message(text("[icon2html(C.computer, O)] *[C.ringtone]*"))
|
||||
C.computer.output_message(text("[icon2html(C.computer, O)] *[C.ringtone]*"))
|
||||
else if(C.username == username)
|
||||
ntnet_global.add_log(message, C.computer.network_card, TRUE)
|
||||
|
||||
message = "[worldtime2text()] [username]: [message]"
|
||||
messages.Add(message)
|
||||
|
||||
@@ -5,6 +5,7 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
/datum/ntnet
|
||||
var/list/relays = list()
|
||||
var/list/logs = list()
|
||||
var/list/messages = list()
|
||||
var/list/available_station_software = list()
|
||||
var/list/available_antag_software = list()
|
||||
var/list/available_software = list()
|
||||
@@ -44,14 +45,17 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
new /datum/ntnet_conversation("NTNet Relay", TRUE)
|
||||
|
||||
// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional.
|
||||
/datum/ntnet/proc/add_log(var/log_string, var/obj/item/computer_hardware/network_card/source = null)
|
||||
/datum/ntnet/proc/add_log(var/log_string, var/obj/item/computer_hardware/network_card/source = null, var/messaging=FALSE)
|
||||
var/log_text = "[worldtime2text()] - "
|
||||
if(source)
|
||||
log_text += "[source.get_network_tag()] - "
|
||||
else
|
||||
log_text += "*SYSTEM* - "
|
||||
log_text += log_string
|
||||
if(!messaging)
|
||||
logs.Add(log_text)
|
||||
else
|
||||
messages.Add(log_text)
|
||||
|
||||
if(logs.len > setting_maxlogcount)
|
||||
// We have too many logs, remove the oldest entries until we get into the limit
|
||||
@@ -134,6 +138,7 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
// Removes all logs
|
||||
/datum/ntnet/proc/purge_logs()
|
||||
logs = list()
|
||||
messages = list()
|
||||
add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-")
|
||||
|
||||
// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks.
|
||||
|
||||
@@ -97,6 +97,9 @@
|
||||
|
||||
/obj/item/modular_computer/Destroy()
|
||||
kill_program(TRUE)
|
||||
if(registered_id)
|
||||
registered_id.chat_registered = FALSE
|
||||
registered_id = null
|
||||
for(var/obj/item/computer_hardware/CH in src.get_all_components())
|
||||
uninstall_component(null, CH)
|
||||
qdel(CH)
|
||||
@@ -133,8 +136,8 @@
|
||||
else
|
||||
add_overlay(icon_state_screensaver)
|
||||
|
||||
if (screensaver_light_range && working)
|
||||
set_light(screensaver_light_range, 1, screensaver_light_color ? screensaver_light_color : "#FFFFFF")
|
||||
if (screensaver_light_range && working && !flashlight)
|
||||
set_light(screensaver_light_range, light_power, screensaver_light_color ? screensaver_light_color : "#FFFFFF")
|
||||
else
|
||||
set_light(0)
|
||||
return
|
||||
@@ -144,13 +147,15 @@
|
||||
holographic_overlay(src, src.icon, state)
|
||||
else
|
||||
add_overlay(state)
|
||||
set_light(light_strength, l_color = active_program.color)
|
||||
if(!flashlight)
|
||||
set_light(light_range, light_power, l_color = active_program.color)
|
||||
else
|
||||
if (is_holographic)
|
||||
holographic_overlay(src, src.icon, icon_state_menu)
|
||||
else
|
||||
add_overlay(icon_state_menu)
|
||||
set_light(light_strength, l_color = menu_light_color)
|
||||
if(!flashlight)
|
||||
set_light(light_range, light_power, l_color = menu_light_color)
|
||||
|
||||
/obj/item/modular_computer/proc/turn_on(var/mob/user)
|
||||
if(tesla_link)
|
||||
@@ -425,18 +430,18 @@
|
||||
/obj/item/modular_computer/proc/register_account(var/datum/computer_file/program/PRG = null)
|
||||
var/obj/item/card/id/id = GetID()
|
||||
if(PRG)
|
||||
output_message(SPAN_NOTICE("\The [src] shows a notice: \"[PRG.filedesc] requires a registered NTNRC account. Registering automatically...\""))
|
||||
output_notice("[PRG.filedesc] requires a registered NTNRC account. Registering automatically...")
|
||||
if(!istype(id))
|
||||
output_message(SPAN_WARNING("\The [src] shows an error: \"No ID card found!\""))
|
||||
output_error("No ID card found!")
|
||||
return FALSE
|
||||
if(id.chat_registered)
|
||||
output_message(SPAN_WARNING("\The [src] shows an error: \"This card is already registered to another account!\""))
|
||||
output_error("This card is already registered to another account!")
|
||||
return FALSE
|
||||
|
||||
id.chat_registered = TRUE
|
||||
registered_id = id
|
||||
output_message(SPAN_NOTICE("\The [src] beeps: \"Registration successful!\""))
|
||||
playsound(get_turf(src), 'sound/machines/ping.ogg', 20, 0)
|
||||
output_notice("Registration successful!")
|
||||
playsound(get_turf(src), 'sound/machines/ping.ogg', 10, 0)
|
||||
return registered_id
|
||||
|
||||
/obj/item/modular_computer/proc/unregister_account()
|
||||
|
||||
@@ -110,6 +110,9 @@
|
||||
else if(tesla_link == H)
|
||||
tesla_link = null
|
||||
found = TRUE
|
||||
else if(flashlight == H)
|
||||
flashlight = null
|
||||
found = TRUE
|
||||
else if(personal_ai == H)
|
||||
if(user)
|
||||
to_chat(user, SPAN_NOTICE("You remove \the [H] from \the [src]."))
|
||||
@@ -156,6 +159,8 @@
|
||||
return personal_ai
|
||||
if(tesla_link && (initial(tesla_link.name) == name))
|
||||
return tesla_link
|
||||
if(flashlight && initial(flashlight.name) == name)
|
||||
return flashlight
|
||||
return null
|
||||
|
||||
// Returns list of all components
|
||||
@@ -181,4 +186,6 @@
|
||||
all_components.Add(personal_ai)
|
||||
if(tesla_link)
|
||||
all_components.Add(tesla_link)
|
||||
if(flashlight)
|
||||
all_components.Add(flashlight)
|
||||
return all_components
|
||||
@@ -70,7 +70,7 @@
|
||||
verbs -= /obj/item/modular_computer/proc/eject_item
|
||||
to_chat(usr, SPAN_NOTICE("You remove \the [I] from \the [src]."))
|
||||
|
||||
/obj/item/modular_computer/proc/eject_battery(mob/usr = usr)
|
||||
/obj/item/modular_computer/proc/eject_battery()
|
||||
set name = "Eject Battery"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
@@ -68,12 +68,16 @@
|
||||
if(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)
|
||||
H.enabled = TRUE
|
||||
H.enable()
|
||||
. = TRUE
|
||||
if(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)
|
||||
H.enabled = 0
|
||||
H.disable()
|
||||
. = TRUE
|
||||
if(href_list["PC_togglelight"])
|
||||
if(flashlight)
|
||||
flashlight.toggle()
|
||||
. = TRUE
|
||||
if(href_list["PC_shutdown"])
|
||||
shutdown_computer()
|
||||
|
||||
@@ -47,7 +47,8 @@
|
||||
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/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.
|
||||
light_range = 0 // Tile range of lighting emitted by the computer.
|
||||
light_power = 0 // Intensity of lighting emitted by the computer. Valid range between 0 and 1.
|
||||
var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with.
|
||||
var/list/enabled_services = list() // Enabled services that run in background and handle things pasively. Supported on all CPUs.
|
||||
var/power_has_failed = FALSE
|
||||
@@ -71,6 +72,7 @@
|
||||
var/obj/item/computer_hardware/ai_slot/ai_slot // AI slot, an intellicard housing that allows modifications of AIs.
|
||||
var/obj/item/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
|
||||
var/obj/item/device/paicard/personal_ai // Personal AI, can control the device via a verb when installed
|
||||
var/obj/item/computer_hardware/flashlight/flashlight
|
||||
|
||||
var/listener/listener //Listener needed for things
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
base_active_power_usage = 500
|
||||
max_hardware_size = 3
|
||||
steel_sheet_cost = 20
|
||||
light_strength = 2
|
||||
light_range = 2
|
||||
screensaver_light_range = 1.4
|
||||
screensaver_light_color = "#0099ff"
|
||||
is_holographic = TRUE
|
||||
@@ -11,7 +11,6 @@
|
||||
hardware_flag = PROGRAM_TABLET
|
||||
max_hardware_size = 1
|
||||
w_class = ITEMSIZE_SMALL
|
||||
light_strength = 2 // Same as PDAs
|
||||
|
||||
/obj/item/modular_computer/handheld/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
base_active_power_usage = 200
|
||||
message_output_range = 1
|
||||
max_hardware_size = 2
|
||||
light_strength = 3
|
||||
light_range = 3
|
||||
max_damage = 50
|
||||
broken_damage = 25
|
||||
var/icon_state_closed = "laptop-closed"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/modular_computer/handheld/pda
|
||||
name = "\improper PDA"
|
||||
name = "PDA"
|
||||
desc = "The latest in portable microcomputer solutions from Thinktronic Systems, LTD."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pda"
|
||||
|
||||
@@ -53,4 +53,29 @@
|
||||
/obj/item/modular_computer/silicon/install_default_programs()
|
||||
hard_drive.store_file(new /datum/computer_file/program/filemanager(src))
|
||||
hard_drive.store_file(new /datum/computer_file/program/ntnetdownload(src))
|
||||
hard_drive.store_file(new /datum/computer_file/program/chatclient(src))
|
||||
hard_drive.remove_file(hard_drive.find_file_by_name("clientmanager"))
|
||||
addtimer(CALLBACK(src, .proc/register_chat), 1 SECOND)
|
||||
|
||||
/obj/item/modular_computer/silicon/proc/register_chat()
|
||||
set_autorun("ntnrc_client")
|
||||
enable_computer(null, TRUE) // passing null because we don't want the UI to open
|
||||
minimize_program()
|
||||
|
||||
/obj/item/modular_computer/silicon/verb/send_pda_message()
|
||||
set category = "AI IM"
|
||||
set name = "Send Direct Message"
|
||||
set src in usr
|
||||
if (usr.stat == DEAD)
|
||||
to_chat(usr, "You can't send PDA messages because you are dead!")
|
||||
return
|
||||
var/datum/computer_file/program/chatclient/CL = hard_drive.find_file_by_name("ntnrc_client")
|
||||
if(!istype(CL))
|
||||
output_error("Chat client not installed!")
|
||||
return
|
||||
else if(CL.program_state == PROGRAM_STATE_KILLED)
|
||||
run_program("ntnrc_client")
|
||||
|
||||
CL.direct_message()
|
||||
if(CL.channel)
|
||||
CL.add_message(CL.send_message())
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
message_output_range = 1
|
||||
max_hardware_size = 2
|
||||
steel_sheet_cost = 10
|
||||
light_strength = 4
|
||||
light_range = 4
|
||||
w_class = ITEMSIZE_HUGE
|
||||
is_holographic = TRUE
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
slot_flags = SLOT_GLOVES|SLOT_ID
|
||||
can_reset = TRUE
|
||||
max_hardware_size = 1
|
||||
light_strength = 1
|
||||
menu_light_color = COLOR_GREEN
|
||||
|
||||
/obj/item/modular_computer/handheld/wristbound/set_icon()
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||
card_slot.stored_item = new /obj/item/pen
|
||||
tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src)
|
||||
flashlight = new /obj/item/computer_hardware/flashlight(src)
|
||||
battery_module.charge_to_full()
|
||||
|
||||
/obj/item/modular_computer/handheld/preset/civilian
|
||||
|
||||
@@ -7,8 +7,12 @@
|
||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||
card_slot.stored_item = new /obj/item/pen
|
||||
tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src)
|
||||
flashlight = new /obj/item/computer_hardware/flashlight(src)
|
||||
battery_module.charge_to_full()
|
||||
|
||||
/obj/item/modular_computer/handheld/pda
|
||||
_app_preset_type = /datum/modular_computer_app_presets/civilian
|
||||
|
||||
// Civilian
|
||||
|
||||
/obj/item/modular_computer/handheld/pda/civilian
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
network_card = new /obj/item/computer_hardware/network_card(src)
|
||||
battery_module = new /obj/item/computer_hardware/battery_module/nano(src)
|
||||
tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src)
|
||||
flashlight = new /obj/item/computer_hardware/flashlight(src)
|
||||
battery_module.charge_to_full()
|
||||
|
||||
/obj/item/modular_computer/handheld/wristbound/preset/cheap/generic
|
||||
@@ -19,6 +20,7 @@
|
||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||
battery_module = new /obj/item/computer_hardware/battery_module/hotswap(src)
|
||||
tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src)
|
||||
flashlight = new /obj/item/computer_hardware/flashlight(src)
|
||||
battery_module.charge_to_full()
|
||||
|
||||
/obj/item/modular_computer/handheld/wristbound/preset/advanced/cargo
|
||||
@@ -87,6 +89,7 @@
|
||||
card_slot = new /obj/item/computer_hardware/card_slot(src)
|
||||
card_slot.stored_item = new /obj/item/pen
|
||||
tesla_link = new /obj/item/computer_hardware/tesla_link/charging_cable(src)
|
||||
flashlight = new /obj/item/computer_hardware/flashlight(src)
|
||||
battery_module.charge_to_full()
|
||||
|
||||
/obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
available_on_ntnet = TRUE
|
||||
nanomodule_path = /datum/nano_module/program/computer_chatclient
|
||||
color = LIGHT_COLOR_GREEN
|
||||
silent = TRUE
|
||||
silent = FALSE
|
||||
|
||||
var/last_message // Used to generate the toolbar icon
|
||||
var/username
|
||||
@@ -57,33 +57,18 @@
|
||||
|
||||
if(href_list["PRG_speak"])
|
||||
. = TRUE
|
||||
if(!channel)
|
||||
return TRUE
|
||||
var/mob/living/user = usr
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
|
||||
var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
|
||||
if(!message || !channel)
|
||||
return
|
||||
channel.add_message(message, username, usr)
|
||||
message_dead(FONT_SMALL("<b>([channel.get_dead_title()]) [username]:</b> [message]"))
|
||||
add_message(send_message())
|
||||
|
||||
if(href_list["Reply"])
|
||||
. = TRUE
|
||||
if(!channel || channel.title != href_list["target"])
|
||||
to_chat(usr, SPAN_WARNING("The target chat isn't active on your program anymore!"))
|
||||
return
|
||||
var/mob/living/user = usr
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
|
||||
var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
|
||||
if(!message)
|
||||
return
|
||||
var/message = send_message()
|
||||
if(!channel || channel.title != href_list["target"])
|
||||
to_chat(usr, SPAN_WARNING("The target chat isn't active on your program anymore!"))
|
||||
return
|
||||
channel.add_message(message, username, usr)
|
||||
message_dead(FONT_SMALL("<b>([channel.get_dead_title()]) [username]:</b> [message]"))
|
||||
add_message(message)
|
||||
|
||||
if(href_list["PRG_joinchannel"])
|
||||
. = TRUE
|
||||
@@ -221,6 +206,26 @@
|
||||
channel.password = newpassword
|
||||
if(href_list["PRG_directmessage"])
|
||||
. = TRUE
|
||||
direct_message()
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/send_message()
|
||||
if(!channel)
|
||||
return
|
||||
var/mob/living/user = usr
|
||||
if(ishuman(user))
|
||||
user.visible_message("[SPAN_BOLD("\The [user]")] taps on [user.get_pronoun("his")] computer's screen.")
|
||||
var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
|
||||
if(!message || !channel)
|
||||
return
|
||||
return message
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/add_message(var/message)
|
||||
if(!message)
|
||||
return
|
||||
channel.add_message(message, username, usr)
|
||||
message_dead(FONT_SMALL("<b>([channel.get_dead_title()]) [username]:</b> [message]"))
|
||||
|
||||
/datum/computer_file/program/chatclient/proc/direct_message()
|
||||
var/clients = list()
|
||||
var/names = list()
|
||||
for(var/cl in ntnet_global.chat_clients)
|
||||
@@ -304,9 +309,8 @@
|
||||
|
||||
/datum/computer_file/program/chatclient/event_silentmode()
|
||||
..()
|
||||
if(silent == computer.silent)
|
||||
silent = !silent
|
||||
|
||||
if(computer.silent != silent)
|
||||
silent = computer.silent
|
||||
/datum/nano_module/program/computer_chatclient
|
||||
name = "Chat Client"
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
data["config_systemcontrol"] = ntnet_global.setting_systemcontrol
|
||||
|
||||
data["ntnetlogs"] = ntnet_global.logs
|
||||
data["ntnetmessages"] = ntnet_global.messages
|
||||
data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount
|
||||
|
||||
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
VUEUI_SET_CHECK(data["card_slot"], computer.card_slot, ., data)
|
||||
if(computer.registered_id)
|
||||
VUEUI_SET_CHECK(data["registered"], computer.registered_id.registered_name, ., data)
|
||||
else
|
||||
VUEUI_SET_CHECK(data["registered"], 0, ., data)
|
||||
if(!computer.battery_module)
|
||||
VUEUI_SET_CHECK(data["battery"], 0, ., data)
|
||||
else
|
||||
@@ -51,6 +53,14 @@
|
||||
VUEUI_SET_CHECK(data["battery"]["rating"], computer.battery_module.battery.maxcharge, ., data)
|
||||
VUEUI_SET_CHECK(data["battery"]["percent"], round(computer.battery_module.battery.percent()), ., data)
|
||||
|
||||
if(computer.flashlight)
|
||||
var/brightness = Clamp(0, round(computer.flashlight.power) * 10, 10)
|
||||
VUEUI_SET_CHECK_IFNOTSET(data["brightness"], brightness, ., data)
|
||||
|
||||
if(data["brightness"])
|
||||
var/new_brightness = Clamp(0, data["brightness"]/10, 1)
|
||||
computer.flashlight.tweak_brightness(new_brightness)
|
||||
|
||||
LAZYINITLIST(data["hardware"])
|
||||
for(var/obj/item/computer_hardware/H in hardware)
|
||||
LAZYINITLIST(data["hardware"][H.name])
|
||||
|
||||
@@ -13,6 +13,19 @@
|
||||
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
|
||||
|
||||
// Default handling of hardware enable/disable. Override for specific functionality.
|
||||
|
||||
/obj/item/computer_hardware/proc/enable()
|
||||
. = enabled = TRUE
|
||||
|
||||
/obj/item/computer_hardware/proc/disable()
|
||||
. = enabled = FALSE
|
||||
|
||||
/obj/item/computer_hardware/proc/toggle()
|
||||
if(enabled)
|
||||
return disable()
|
||||
return enable()
|
||||
|
||||
/obj/item/computer_hardware/attackby(obj/item/W, mob/living/user)
|
||||
// Multitool. Runs diagnostics
|
||||
if(W.ismultitool())
|
||||
|
||||
35
code/modules/modular_computers/hardware/misc.dm
Normal file
35
code/modules/modular_computers/hardware/misc.dm
Normal file
@@ -0,0 +1,35 @@
|
||||
/obj/item/computer_hardware/flashlight
|
||||
name = "flashlight"
|
||||
desc = "A small pen-sized flashlight used to illuminate a small area."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "headlights"
|
||||
power_usage = 50
|
||||
enabled = FALSE
|
||||
critical = FALSE
|
||||
var/range = 2
|
||||
var/power = 1
|
||||
var/flashlight_color = LIGHT_COLOR_HALOGEN
|
||||
|
||||
/obj/item/computer_hardware/flashlight/enable()
|
||||
. = ..()
|
||||
if(parent_computer)
|
||||
parent_computer.light_range = range
|
||||
parent_computer.light_power = power
|
||||
tweak_light(parent_computer)
|
||||
|
||||
/obj/item/computer_hardware/flashlight/disable()
|
||||
. = ..()
|
||||
if(parent_computer)
|
||||
parent_computer.light_range = initial(parent_computer.light_range)
|
||||
parent_computer.light_power = initial(parent_computer.light_power)
|
||||
tweak_light(parent_computer)
|
||||
|
||||
/obj/item/computer_hardware/flashlight/proc/tweak_brightness(var/new_power)
|
||||
. = power = Clamp(0, new_power, 1)
|
||||
parent_computer.light_power = power
|
||||
tweak_light(parent_computer)
|
||||
|
||||
/obj/item/computer_hardware/flashlight/proc/tweak_light(var/obj/item/modular_computer/C)
|
||||
if(!istype(C))
|
||||
return
|
||||
C.set_light(C.light_range, C.light_power, l_color = flashlight_color)
|
||||
@@ -29,7 +29,7 @@
|
||||
deactivate()
|
||||
return ..()
|
||||
|
||||
/obj/item/computer_hardware/tesla_link/charging_cable/proc/toggle(var/obj/machinery/power/power_source, mob/user)
|
||||
/obj/item/computer_hardware/tesla_link/charging_cable/toggle(var/obj/machinery/power/power_source, mob/user)
|
||||
if(!source)
|
||||
if(in_range(power_source, src))
|
||||
to_chat(user, SPAN_NOTICE("You connect \the [src] to \the [power_source]."))
|
||||
|
||||
@@ -179,3 +179,11 @@
|
||||
build_type = IMPRINTER
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
build_path = /obj/item/computer_hardware/ai_slot
|
||||
|
||||
// Flashlight
|
||||
|
||||
/datum/design/item/modularcomponent/flashlight
|
||||
req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
|
||||
build_type = IMPRINTER
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 1000, MATERIAL_GLASS = 500)
|
||||
build_path = /obj/item/computer_hardware/flashlight
|
||||
12
html/changelogs/johnwildkins-pctweaks.yml
Normal file
12
html/changelogs/johnwildkins-pctweaks.yml
Normal file
@@ -0,0 +1,12 @@
|
||||
author: JohnWildkins
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscadd: "Handheld modular computers now use flashlights as a light source. They may be turned on/off via a button in the PC header, and have their brightness adjusted in Hardware Configuration."
|
||||
- tweak: "Chat messages are now logged to the NTNet Monitoring program."
|
||||
- tweak: "PDA mesasge notifications should now appear much larger."
|
||||
- bugfix: "IDs are now unregistered from computers when the computer is destroyed."
|
||||
- bugfix: "Fix Eject Battery having a global view range."
|
||||
- bugfix: "Chat Clients are no longer set to 'silent' by default."
|
||||
- backend: "Added a new slider component for VueUIs."
|
||||
@@ -99,3 +99,13 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<b>Message Logs</b>
|
||||
<div class="statusDisplay" style="overflow: auto;">
|
||||
<div class="item">
|
||||
<div class="itemContent" style="width: 100%;">
|
||||
{{for data.ntnetmessages}}
|
||||
{{:value}}<br>
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -6,6 +6,7 @@
|
||||
<img img class="valign" v-if="state._PC.ntneticon" :src="state._PC.ntneticon">
|
||||
<img img class="valign" v-if="state._PC.apclinkicon" :src="state._PC.apclinkicon">
|
||||
<div style="float: right;">
|
||||
<vui-button :params="{ PC_togglelight: 1}" icon="lightbulb"/>
|
||||
<template v-if="state._PC.showexitprogram">
|
||||
<vui-button :params="{ PC_minimize: 1}" icon="chevron-down">Minimize</vui-button>
|
||||
<vui-button class="danger" :params="{ PC_exit: 1}" icon="window-close">Exit</vui-button>
|
||||
|
||||
@@ -16,10 +16,13 @@
|
||||
<vui-item v-if="battery" label="Used Capacity:">
|
||||
<vui-progress :value="disk_used" min="0" :max="disk_size">{{disk_used}} GQ / {{disk_size}} GQ</vui-progress>
|
||||
</vui-item>
|
||||
<h2>Registered ID</h2>
|
||||
<h2>Misc. Settings</h2>
|
||||
<vui-item label="Registered ID:">
|
||||
<vui-button :params="{ PC_register: 1}" :disabled="!card_slot">{{ registered ? registered : "Unregistered" }}</vui-button>
|
||||
</vui-item>
|
||||
<vui-item v-if="brightness !== null" label="Brightness:">
|
||||
<vui-input-slider :min="0" :max="10" v-model="brightness"/>
|
||||
</vui-item>
|
||||
<h2>Computer Components</h2>
|
||||
<div v-for="(h, name) in hardware" :key="name">
|
||||
<h3>{{name}}</h3>
|
||||
|
||||
128
vueui/src/components/vui/input/slider.vue
Normal file
128
vueui/src/components/vui/input/slider.vue
Normal file
@@ -0,0 +1,128 @@
|
||||
<template>
|
||||
<div>
|
||||
<input type="range" :min="min" :max="max" :style="{width: width}" ref="input" :value="val" @change="onFieldUpdate($event.target)">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Store from '../../../store.js'
|
||||
export default {
|
||||
props: {
|
||||
value: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
min: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
max: {
|
||||
type: Number,
|
||||
default: 100
|
||||
},
|
||||
pushState: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: '10em'
|
||||
},
|
||||
decimalPlaces: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
val: this.value
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onFieldUpdate(field) {
|
||||
var _inival = this.val
|
||||
var int = Number(field.value)
|
||||
if(isNaN(int)) {
|
||||
int = this.val
|
||||
}
|
||||
console.log(int, field.value, this.value, this.val)
|
||||
this.UpdateValue(int)
|
||||
if(_inival == this.val && !(field.value.endsWith("."))) {
|
||||
this.$refs.input.value = this.val
|
||||
}
|
||||
},
|
||||
onUpdatedValue(diff) {
|
||||
var int = this.value
|
||||
if(diff) {
|
||||
int += diff
|
||||
}
|
||||
this.UpdateValue(int)
|
||||
},
|
||||
UpdateValue(int) {
|
||||
int = +(Math.round(int + 'e+' + this.decimalPlaces) + 'e-' + this.decimalPlaces)
|
||||
if(int > this.max) int = this.max
|
||||
if(int < this.min) int = this.min
|
||||
this.val = int
|
||||
this.$emit('input', int);
|
||||
if(this.pushState) Store.pushState()
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
value() {
|
||||
this.val = this.value
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
div {
|
||||
display: inline-block;
|
||||
}
|
||||
input {
|
||||
text-align: center;
|
||||
}
|
||||
input[type=range] {
|
||||
width: 100%;
|
||||
border: none;
|
||||
}
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
}
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
height: 8.4px;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border-color: transparent;
|
||||
border-width: 16px 0;
|
||||
color: transparent;
|
||||
}
|
||||
input[type=range]::-ms-fill-lower {
|
||||
background: #2a6495;
|
||||
border: 0.2px solid #010101;
|
||||
border-radius: 2.6px;
|
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
|
||||
}
|
||||
input[type=range]::-ms-fill-upper {
|
||||
background: #3071a9;
|
||||
border: 0.2px solid #010101;
|
||||
border-radius: 2.6px;
|
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
|
||||
}
|
||||
input[type=range]::-ms-thumb {
|
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
|
||||
border: 1px solid #000000;
|
||||
height: 16px;
|
||||
width: 8px;
|
||||
border-radius: 2px;
|
||||
background: #ffffff;
|
||||
cursor: pointer;
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-lower {
|
||||
background: #3071a9;
|
||||
}
|
||||
input[type=range]:focus::-ms-fill-upper {
|
||||
background: #367ebd;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user