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:
Karolis
2021-02-05 16:05:21 +02:00
committed by GitHub
parent 12bb01ad57
commit 607b0eeeb8
38 changed files with 762 additions and 557 deletions
@@ -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]"