mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-11 07:58:57 +01:00
NTSL2++ sucessor to NTSL2+ (#9321)
This drastcly is meant to rework DM and Daemon code to allow further expansion and replacement of custom engine with JavaScript language based engine. Daemon PR - Aurorastation/ByondInterpretedLanguage#7 Forums topic for discussion - https://forums.aurorastation.org/topic/14570-ntsl2-and-its-future/ Superseeds #8817
This commit is contained in:
@@ -1,100 +1,142 @@
|
||||
/datum/computer_file/program/ntsl2_interpreter
|
||||
filename = "ntslinterpreter"
|
||||
filedesc = "NTSL2+ Interpreter"
|
||||
extended_desc = "This program is used to run NTSL2+ programs."
|
||||
filedesc = "NTSL2++ Interpreter"
|
||||
extended_desc = "This program is used to run NTSL2++ scripts."
|
||||
program_icon_state = "generic"
|
||||
usage_flags = PROGRAM_ALL
|
||||
size = 8
|
||||
requires_ntnet = TRUE
|
||||
available_on_ntnet = TRUE
|
||||
|
||||
nanomodule_path = /datum/nano_module/program/computer_ntsl2_interpreter
|
||||
|
||||
var/datum/ntsl_program/running
|
||||
var/datum/ntsl2_program/computer/running
|
||||
var/is_running = FALSE
|
||||
var/datum/computer_file/script/opened
|
||||
color = LIGHT_COLOR_GREEN
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/process_tick()
|
||||
if(istype(running))
|
||||
running.cycle(30000)
|
||||
..()
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/kill_program()
|
||||
..()
|
||||
. = ..()
|
||||
if(istype(running))
|
||||
running.kill()
|
||||
running = null
|
||||
opened = null
|
||||
is_running = FALSE
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/run_program(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
running = SSntsl2.new_program_computer(CALLBACK(src, .proc/buffer_callback_handler))
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/Topic(href, href_list)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if(href_list["PRG_execfile"])
|
||||
var/datum/vueui/ui = href_list["vueui"]
|
||||
if(!istype(ui))
|
||||
return
|
||||
|
||||
if(href_list["execute_file"])
|
||||
. = TRUE
|
||||
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/script/F = HDD.find_file_by_name(href_list["execute_file"])
|
||||
if(istype(F))
|
||||
var/oldtext = html_decode(F.stored_data)
|
||||
oldtext = replacetext(oldtext, "\[editorbr\]", "\n")
|
||||
running = ntsl2.new_program(oldtext, src, usr)
|
||||
var/code = F.code
|
||||
|
||||
if(istype(running))
|
||||
running.name = href_list["PRG_execfile"]
|
||||
running.execute(code, usr)
|
||||
is_running = TRUE
|
||||
|
||||
if(href_list["PRG_closefile"])
|
||||
if(href_list["stop"])
|
||||
. = TRUE
|
||||
if(istype(running))
|
||||
running.kill()
|
||||
running = null
|
||||
// Prepare for next execution
|
||||
running = SSntsl2.new_program_computer(CALLBACK(src, .proc/buffer_callback_handler))
|
||||
is_running = FALSE
|
||||
|
||||
if(href_list["PRG_topic"])
|
||||
if(istype(running))
|
||||
var/topc = href_list["PRG_topic"]
|
||||
if(copytext(topc, 1, 2) == "?")
|
||||
topc = copytext(topc, 2) + "?" + input("", "Enter Data")
|
||||
running.topic(topc)
|
||||
running.cycle(5000)
|
||||
. = 1
|
||||
|
||||
if(href_list["PRG_refresh"])
|
||||
if(href_list["edit_file"])
|
||||
. = TRUE
|
||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||
var/datum/computer_file/script/F = HDD.find_file_by_name(href_list["edit_file"])
|
||||
if(istype(F))
|
||||
opened = F
|
||||
|
||||
if(href_list["close"])
|
||||
. = TRUE
|
||||
if(istype(opened))
|
||||
opened.code = href_list["code"]
|
||||
opened.calculate_size()
|
||||
opened = null
|
||||
|
||||
if(href_list["new"])
|
||||
. = TRUE
|
||||
if(!opened)
|
||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||
|
||||
opened = new()
|
||||
opened.filename = sanitize(href_list["new"])
|
||||
HDD.store_file(opened)
|
||||
|
||||
if(href_list["execute"])
|
||||
. = TRUE
|
||||
if(istype(opened))
|
||||
opened.code = href_list["code"]
|
||||
opened.calculate_size()
|
||||
|
||||
if(istype(running))
|
||||
running.execute(opened.code, usr)
|
||||
is_running = TRUE
|
||||
|
||||
if(href_list["terminal_topic"])
|
||||
if(istype(running))
|
||||
running.handle_topic(href_list["terminal_topic"])
|
||||
. = TRUE
|
||||
|
||||
if(.)
|
||||
SSnanoui.update_uis(NM)
|
||||
SSvueui.check_uis_for_change(src)
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/nano_module/program/computer_ntsl2_interpreter
|
||||
name = "NTSL2+ Interpreter"
|
||||
|
||||
/datum/nano_module/program/computer_ntsl2_interpreter/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/datum/computer_file/program/ntsl2_interpreter/PRG
|
||||
if(program)
|
||||
PRG = program
|
||||
else
|
||||
return
|
||||
|
||||
var/obj/item/computer_hardware/hard_drive/HDD
|
||||
|
||||
if(!PRG.computer || !PRG.computer.hard_drive)
|
||||
data["error"] = "I/O ERROR: Unable to access hard drive."
|
||||
else if(istype(PRG.running))
|
||||
data["running"] = PRG.running.name
|
||||
data["terminal"] = PRG.running.get_terminal()
|
||||
else
|
||||
HDD = PRG.computer.hard_drive
|
||||
var/list/files[0]
|
||||
for(var/datum/computer_file/F in HDD.stored_files)
|
||||
if(F.filetype == "TXT" && !F.password)
|
||||
files.Add(list(list(
|
||||
"name" = F.filename,
|
||||
"type" = F.filetype,
|
||||
"size" = F.size,
|
||||
"undeletable" = F.undeletable
|
||||
)))
|
||||
data["files"] = files
|
||||
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
/datum/computer_file/program/ntsl2_interpreter/ui_interact(mob/user)
|
||||
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "ntsl_interpreter.tmpl", "NTSL2+ Interpreter", 575, 700, state = state)
|
||||
ui.auto_update_layout = 1
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui = new /datum/vueui/modularcomputer(user, src, "mcomputer-ntsl-main", 600, 520, filedesc)
|
||||
ui.open()
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/vueui_transfer(oldobj)
|
||||
SSvueui.transfer_uis(oldobj, src, "mcomputer-ntsl-main", 600, 520, filedesc)
|
||||
return TRUE
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/vueui_data_change(list/data, mob/user, datum/vueui/ui)
|
||||
. = ..()
|
||||
data = . || data || list("mode" = "list", "terminal" = "", "code" = "", "files" = list())
|
||||
// Gather data for computer header
|
||||
var/headerdata = get_header_data(data["_PC"])
|
||||
if(headerdata)
|
||||
data["_PC"] = headerdata
|
||||
. = data
|
||||
|
||||
var/obj/item/computer_hardware/hard_drive/hdd = computer?.hard_drive
|
||||
|
||||
if(is_running && istype(running))
|
||||
data["mode"] = "program"
|
||||
data["terminal"] = running.buffer
|
||||
. = data
|
||||
else if (istype(opened))
|
||||
VUEUI_SET_CHECK(data["mode"], "edit", ., data)
|
||||
VUEUI_SET_CHECK(data["code"], opened.code, ., data)
|
||||
else
|
||||
VUEUI_SET_CHECK(data["mode"], "list", ., data)
|
||||
|
||||
|
||||
data["files"] = list()
|
||||
for(var/datum/computer_file/script/F in hdd?.stored_files)
|
||||
if(F.filetype == "NTS" && !F.password)
|
||||
data["files"] += list(list(
|
||||
"name" = F.filename,
|
||||
"type" = F.filetype,
|
||||
"size" = F.size,
|
||||
"undeletable" = F.undeletable
|
||||
))
|
||||
|
||||
|
||||
/datum/computer_file/program/ntsl2_interpreter/proc/buffer_callback_handler()
|
||||
SSvueui.check_uis_for_change(src)
|
||||
@@ -120,15 +120,21 @@
|
||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||
if(!HDD)
|
||||
return TRUE
|
||||
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
||||
if(!F || !istype(F))
|
||||
return TRUE
|
||||
if(!computer.nano_printer)
|
||||
error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
|
||||
return TRUE
|
||||
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."
|
||||
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
|
||||
var/datum/computer_file/script/S = F
|
||||
if(!F)
|
||||
return TRUE
|
||||
if(istype(F))
|
||||
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."
|
||||
return TRUE
|
||||
else if(istype(S))
|
||||
if(!computer.nano_printer.print_text(S.code))
|
||||
error = "Hardware error: Printer was unable to print the file. It may be out of paper."
|
||||
return TRUE
|
||||
if(href_list["PRG_copytousb"])
|
||||
. = TRUE
|
||||
var/obj/item/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||
@@ -226,14 +232,20 @@
|
||||
data["error"] = PRG.error
|
||||
if(PRG.open_file)
|
||||
var/datum/computer_file/data/file
|
||||
var/datum/computer_file/script/script
|
||||
|
||||
if(!PRG.computer || !PRG.computer.hard_drive)
|
||||
data["error"] = "I/O ERROR: Unable to access hard drive."
|
||||
else
|
||||
HDD = PRG.computer.hard_drive
|
||||
file = HDD.find_file_by_name(PRG.open_file)
|
||||
script = file
|
||||
if(!istype(file))
|
||||
data["error"] = "I/O ERROR: Unable to open file."
|
||||
if(!istype(script))
|
||||
data["error"] = "I/O ERROR: Unable to open file."
|
||||
else
|
||||
data["scriptdata"] = html_encode(script.code)
|
||||
data["filename"] = "[script.filename].[script.filetype]"
|
||||
else
|
||||
data["filedata"] = pencode2html(file.stored_data)
|
||||
data["filename"] = "[file.filename].[file.filetype]"
|
||||
|
||||
Reference in New Issue
Block a user