diff --git a/code/game/machinery/telecomms/server.dm b/code/game/machinery/telecomms/server.dm
index ea7c5de0d0b..a3564c45bb3 100644
--- a/code/game/machinery/telecomms/server.dm
+++ b/code/game/machinery/telecomms/server.dm
@@ -16,10 +16,6 @@
var/max_logs = 400 // maximum number of logs
var/log_cull_count = 10 // number of logs to cull at a time
var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
- var/list/memory = list() // stored memory
- var/rawcode = "" // the code to compile (raw text)
- var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code
- var/autoruncode = FALSE // TRUE if the code is set to run every time a signal is picked up
var/encryption = "null" // encryption key: ie "password"
var/salt = "null" // encryption salt: ie "123comsat"
var/obj/item/radio/headset/server_radio
@@ -27,14 +23,11 @@
/obj/machinery/telecomms/server/Destroy()
QDEL_NULL_LIST(log_entries)
- QDEL_NULL(Compiler)
QDEL_NULL(server_radio)
return ..()
/obj/machinery/telecomms/server/Initialize()
- Compiler = new
- Compiler.Holder = src
server_radio = new
return ..()
@@ -94,8 +87,6 @@
signal.data["server"] = src
var/identifier = num2text(rand(-1000, 1000) + world.time)
log.name = "data packet ([sha1(identifier)])"
- if (autoruncode && Compiler)
- Compiler.Run(signal)
var/send_success = relay_information(signal, /obj/machinery/telecomms/hub)
if (!send_success)
relay_information(signal, /obj/machinery/telecomms/broadcaster)
@@ -112,15 +103,6 @@
update_logs()
-/obj/machinery/telecomms/server/proc/compile()
- return Compiler?.Compile(rawcode)
-
-
-/obj/machinery/telecomms/server/proc/setcode(text)
- if (istext(text))
- rawcode = text
-
-
/obj/machinery/telecomms/server/proc/update_logs()
if (logs >= max_logs)
log_entries.Cut(0, log_cull_count)
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
deleted file mode 100644
index e1717b8ad9d..00000000000
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ /dev/null
@@ -1,177 +0,0 @@
-/obj/machinery/computer/telecomms/traffic
- name = "Telecommunications Traffic Control"
- desc = "Used to upload code to telecommunication consoles for execution."
- icon_screen = "generic"
- icon_keyboard = "tech_key"
- circuit = /obj/item/circuitboard/comm_traffic
- req_access = list(access_tcomsat)
- var/const/SCREEN_MAIN_MENU = 0
- var/const/SCREEN_VIEW_SERVER = 1
- var/screen = SCREEN_MAIN_MENU
- var/list/servers = list() // the servers located by the computer
- var/mob/editingcode
- var/mob/lasteditor
- var/list/viewingcode = list()
- var/obj/machinery/telecomms/server/SelectedServer
- var/network = "NULL" // the network to probe
- var/temp = "" // temporary feedback messages
- var/storedcode = "" // code stored
-
-
-/obj/machinery/computer/telecomms/traffic/Destroy()
- if (editingcode)
- winshow(editingcode, "Telecomms IDE", FALSE)
- editingcode.unset_machine()
- editingcode = null
- for (var/mob/viewer in viewingcode)
- winshow(viewer, "Telecomms IDE", FALSE)
- viewer.unset_machine()
- LAZYCLEARLIST(viewingcode)
- SelectedServer = null
- return ..()
-
-
-/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user)
- if (stat & (BROKEN|NOPOWER))
- return
- user.set_machine(src)
- var/dat = "
Telecommunication Traffic ControlTelecommunications Traffic Control"
- switch(screen)
- if (SCREEN_MAIN_MENU) // Main Menu
- dat += "
[temp]
"
- dat += "
Current Network: [network]
"
- if(length(servers))
- dat += "
Detected Telecommunication Servers:"
- dat += "
\[Flush Buffer\]"
- else
- dat += "
No servers detected. Scan for servers: \[Scan\]"
- if (SCREEN_VIEW_SERVER) // Viewing Server
- dat += "
[temp]
"
- dat += "\[Main Menu\] \[Refresh\]"
- dat += "
Current Network: [network]"
- dat += "
Selected Server: [SelectedServer.id]
"
- dat += "
\[Edit Code\]"
- dat += "
Signal Execution: "
- if (SelectedServer.autoruncode)
- dat += "ALWAYS"
- else
- dat += "NEVER"
- user << browse(dat, "window=traffic_control;size=575x400")
- onclose(user, "server_control")
- temp = ""
- return
-
-
-/obj/machinery/computer/telecomms/traffic/emag_act(remaining_charges, mob/user)
- if (emagged)
- return
- playsound(src, 'sound/effects/sparks4.ogg', 75, TRUE)
- emagged = TRUE
- to_chat(user, SPAN_NOTICE("You you disable the security protocols"))
- updateUsrDialog()
- return 1
-
-
-/obj/machinery/computer/telecomms/traffic/Topic(href, href_list)
- if (..())
- return
- add_fingerprint(usr)
- usr.set_machine(src)
- if (!emagged && !allowed(usr))
- to_chat(usr, "ACCESS DENIED.")
- return
- if (href_list["viewserver"])
- screen = SCREEN_VIEW_SERVER
- for (var/obj/machinery/telecomms/machine in servers)
- if(machine.id == href_list["viewserver"])
- SelectedServer = machine
- break
- if (href_list["operation"])
- switch (href_list["operation"])
- if ("release")
- servers = list()
- screen = SCREEN_MAIN_MENU
- if ("mainmenu")
- screen = SCREEN_MAIN_MENU
- if ("scan")
- if(length(servers))
- temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -"
- else
- for (var/obj/machinery/telecomms/server/server in range(25, src))
- if (server.network == network)
- servers += server
- if(!length(servers))
- temp = "- 0 SERVERS PROBED & BUFFERED -"
- else
- temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -"
- screen = SCREEN_MAIN_MENU
- if ("editcode")
- if (editingcode == usr)
- return
- if (usr in viewingcode)
- return
- if (!editingcode)
- lasteditor = usr
- editingcode = usr
- winshow(editingcode, "Telecomms IDE", TRUE)
- winset(editingcode, "tcscode", "is-disabled=false")
- winset(editingcode, "tcscode", "text=\"\"")
- var/showcode = replacetext(storedcode, "\\\"", "\\\\\"")
- showcode = replacetext(storedcode, "\"", "\\\"")
- winset(editingcode, "tcscode", "text=\"[showcode]\"")
- spawn()
- update_ide()
- else
- viewingcode += usr
- winshow(usr, "Telecomms IDE", TRUE)
- winset(usr, "tcscode", "is-disabled=true")
- winset(editingcode, "tcscode", "text=\"\"")
- var/showcode = replacetext(storedcode, "\"", "\\\"")
- winset(usr, "tcscode", "text=\"[showcode]\"")
- if ("togglerun")
- SelectedServer.autoruncode = !(SelectedServer.autoruncode)
- if (href_list["network"])
- var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null | text
- if(newnet && (issilicon(usr) || (usr in range(1, src))))
- if(length(newnet) > 15)
- temp = "- FAILED: NETWORK TAG STRING TOO LENGHTY -"
- else
- network = newnet
- screen = SCREEN_MAIN_MENU
- servers = list()
- temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -"
- updateUsrDialog()
-
-
-/obj/machinery/computer/telecomms/traffic/proc/update_ide()
- while (editingcode)
- if (!editingcode.client)
- editingcode = null
- break
- if (editingcode)
- storedcode = "[winget(editingcode, "tcscode", "text")]"
- if (editingcode)
- winset(editingcode, "tcscode", "is-disabled=false")
- if (!issilicon(editingcode) && (editingcode.machine != src || !(editingcode in range(1, src))))
- if (editingcode)
- winshow(editingcode, "Telecomms IDE", FALSE)
- editingcode = null
- break
- if (length(viewingcode))
- var/showcode = replacetext(storedcode, "\\\"", "\\\\\"")
- showcode = replacetext(storedcode, "\"", "\\\"")
- for (var/mob/viewer in viewingcode)
- if (issilicon(viewer) || (viewer.machine == src && (viewer in view(1, src))))
- winset(viewer, "tcscode", "is-disabled=true")
- winset(viewer, "tcscode", "text=\"[showcode]\"")
- else
- viewingcode -= viewer
- winshow(viewer, "Telecomms IDE", FALSE)
- sleep(5)
- if (length(viewingcode))
- editingcode = pick(viewingcode)
- viewingcode -= editingcode
- update_ide()
diff --git a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
index f9bfcb5364c..075b2770aa0 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/circuitboard/comm_monitor
@@ -11,8 +11,3 @@
name = T_BOARD("telecommunications server monitor console")
build_path = /obj/machinery/computer/telecomms/server
origin_tech = list(TECH_DATA = 3)
-
-/obj/item/circuitboard/comm_traffic
- name = T_BOARD("telecommunications traffic control console")
- build_path = /obj/machinery/computer/telecomms/traffic
- origin_tech = list(TECH_DATA = 3)
diff --git a/code/modules/scripting/AST/AST Nodes.dm b/code/modules/scripting/AST/AST Nodes.dm
deleted file mode 100644
index 6a8346fc087..00000000000
--- a/code/modules/scripting/AST/AST Nodes.dm
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- File: AST Nodes
- An abstract syntax tree (AST) is a representation of source code in a computer-friendly format. It is composed of nodes,
- each of which represents a certain part of the source code. For example, an node represents an if statement in the
- script's source code. Because it is a representation of the source code in memory, it is independent of any specific scripting language.
- This allows a script in any language for which a parser exists to be run by the interpreter.
-
- The AST is produced by an object. It consists of a with an arbitrary amount of statements. These statements are
- run in order by an object. A statement may in turn run another block (such as an if statement might if its condition is
- met).
-
- Articles:
- -
-*/
-
-/*
- Constants: Operator Precedence
- OOP_OR - Logical or
- OOP_AND - Logical and
- OOP_BIT - Bitwise operations
- OOP_EQUAL - Equality checks
- OOP_COMPARE - Greater than, less then, etc
- OOP_ADD - Addition and subtraction
- OOP_MULTIPLY - Multiplication and division
- OOP_POW - Exponents
- OOP_UNARY - Unary Operators
- OOP_GROUP - Parentheses
-*/
-var/global/const/OOP_OR = 1 //||
-var/global/const/OOP_AND = OOP_OR + 1 //&&
-var/global/const/OOP_BIT = OOP_AND + 1 //&, |
-var/global/const/OOP_EQUAL = OOP_BIT + 1 //==, !=
-var/global/const/OOP_COMPARE = OOP_EQUAL + 1 //>, <, >=, <=
-var/global/const/OOP_ADD = OOP_COMPARE + 1 //+, -
-var/global/const/OOP_MULTIPLY= OOP_ADD + 1 //*, /, %
-var/global/const/OOP_POW = OOP_MULTIPLY+ 1 //^
-var/global/const/OOP_UNARY = OOP_POW + 1 //!
-var/global/const/OOP_GROUP = OOP_UNARY + 1 //()
-
-/*
- Class: node
-*/
-/node/proc/ToString()
- return "[src.type]"
-/*
- Class: identifier
-*/
-/node/identifier
- var/id_name
-
-/node/identifier/New(id)
- .=..()
- src.id_name=id
-
-/node/identifier/ToString()
- return id_name
-
-/*
- Class: expression
-*/
-/node/expression
-/*
- Class: operator
- See and for subtypes.
-*/
-/node/expression/operator
- var/node/expression/exp
- var/name
- var/precedence
-
-/node/expression/operator/New()
- .=..()
- if(!src.name) src.name="[src.type]"
-
-/node/expression/operator/ToString()
- return "operator: [name]"
-
-/*
- Class: FunctionCall
-*/
-/node/expression/FunctionCall
- //Function calls can also be expressions or statements.
- var/func_name
- var/node/identifier/object
- var/list/parameters = list()
-
-/*
- Class: literal
-*/
-/node/expression/value/literal
- var/value
-
-/node/expression/value/literal/New(value)
- .=..()
- src.value=value
-
-/node/expression/value/literal/ToString()
- return src.value
-
-/*
- Class: variable
-*/
-/node/expression/value/variable
- var/node/object //Either a node/identifier or another node/expression/value/variable which points to the object
- var/node/identifier/id
-
-
-/node/expression/value/variable/New(ident)
- .=..()
- id=ident
- if(istext(id))id=new(id)
-
-/node/expression/value/variable/ToString()
- return src.id.ToString()
-
-/*
- Class: reference
-*/
-/node/expression/value/reference
- var/datum/value
-
-/node/expression/value/reference/New(value)
- .=..()
- src.value=value
-
-/node/expression/value/reference/ToString()
- return "ref: [src.value] ([src.value.type])"
diff --git a/code/modules/scripting/AST/Blocks.dm b/code/modules/scripting/AST/Blocks.dm
deleted file mode 100644
index c992d7b4fa1..00000000000
--- a/code/modules/scripting/AST/Blocks.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- File: Block Types
-*/
-/*
- Class: BlockDefinition
- An object representing a set of actions to perform independently from the rest of the script. Blocks are basically just
- lists of statements to execute which also contain some local variables and methods. Note that since functions are local to a block,
- it is possible to have a function definition inside of any type of block (such as in an if statement or another function),
- and not just in the global scope as in many languages.
-*/
-/node/BlockDefinition
- var/list/statements = list()
- var/list/functions = list()
- var/list/initial_variables = list()
-
-/*
- Proc: SetVar
- Defines a permanent variable. The variable will not be deleted when it goes out of scope.
-
- Notes:
- Since all pre-existing temporary variables are deleted, it is not generally desirable to use this proc after the interpreter has been instantiated.
- Instead, use .
-
- See Also:
- -
-*/
-/node/BlockDefinition/proc/SetVar(name, value)
- initial_variables[name]=value
-
-
-/*
- Class: GlobalBlock
- A block object representing the global scope.
-*/
-//
-/node/BlockDefinition/GlobalBlock/New()
- initial_variables["null"]=null
- return ..()
-
-/*
- Class: FunctionBlock
- A block representing a function body.
-*/
-//
-/node/BlockDefinition/FunctionBlock
\ No newline at end of file
diff --git a/code/modules/scripting/AST/Operators/Binary Operators.dm b/code/modules/scripting/AST/Operators/Binary Operators.dm
deleted file mode 100644
index e191ba348c7..00000000000
--- a/code/modules/scripting/AST/Operators/Binary Operators.dm
+++ /dev/null
@@ -1,174 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-/*
- File: Binary Operators
-*/
-/*
- Class: binary
- Represents a binary operator in the AST. A binary operator takes two operands (ie x and y) and returns a value.
-*/
-/node/expression/operator/binary
- var/node/expression/exp2
-
-////////// Comparison Operators //////////
-/*
- Class: Equal
- Returns true if x = y.
-*/
-//
-/node/expression/operator/binary/Equal
- precedence=OOP_EQUAL
-
-/*
- Class: NotEqual
- Returns true if x and y aren't equal.
-*/
-//
-/node/expression/operator/binary/NotEqual
- precedence=OOP_EQUAL
-
-/*
- Class: Greater
- Returns true if x > y.
-*/
-//
-/node/expression/operator/binary/Greater
- precedence=OOP_COMPARE
-
-/*
- Class: Less
- Returns true if x < y.
-*/
-//
-/node/expression/operator/binary/Less
- precedence=OOP_COMPARE
-
-/*
- Class: GreaterOrEqual
- Returns true if x >= y.
-*/
-//
-/node/expression/operator/binary/GreaterOrEqual
- precedence=OOP_COMPARE
-
-/*
- Class: LessOrEqual
- Returns true if x <= y.
-*/
-//
-/node/expression/operator/binary/LessOrEqual
- precedence=OOP_COMPARE
-
-
-////////// Logical Operators //////////
-
-/*
- Class: LogicalAnd
- Returns true if x and y are true.
-*/
-//
-/node/expression/operator/binary/LogicalAnd
- precedence=OOP_AND
-
-/*
- Class: LogicalOr
- Returns true if x, y, or both are true.
-*/
-//
-/node/expression/operator/binary/LogicalOr
- precedence=OOP_OR
-
-/*
- Class: LogicalXor
- Returns true if either x or y but not both are true.
-*/
-//
-/node/expression/operator/binary/LogicalXor //Not implemented in nS
- precedence=OOP_OR
-
-
-////////// Bitwise Operators //////////
-
-/*
- Class: BitwiseAnd
- Performs a bitwise and operation.
-
- Example:
- 011 & 110 = 010
-*/
-//
-/node/expression/operator/binary/BitwiseAnd
- precedence=OOP_BIT
-
-/*
- Class: BitwiseOr
- Performs a bitwise or operation.
-
- Example:
- 011 | 110 = 111
-*/
-//
-/node/expression/operator/binary/BitwiseOr
- precedence=OOP_BIT
-
-/*
- Class: BitwiseXor
- Performs a bitwise exclusive or operation.
-
- Example:
- 011 xor 110 = 101
-*/
-//
-/node/expression/operator/binary/BitwiseXor
- precedence=OOP_BIT
-
-
-////////// Arithmetic Operators //////////
-
-/*
- Class: Add
- Returns the sum of x and y.
-*/
-//
-/node/expression/operator/binary/Add
- precedence=OOP_ADD
-
-/*
- Class: Subtract
- Returns the difference of x and y.
-*/
-//
-/node/expression/operator/binary/Subtract
- precedence=OOP_ADD
-
-/*
- Class: Multiply
- Returns the product of x and y.
-*/
-//
-/node/expression/operator/binary/Multiply
- precedence=OOP_MULTIPLY
-
-/*
- Class: Divide
- Returns the quotient of x and y.
-*/
-//
-/node/expression/operator/binary/Divide
- precedence=OOP_MULTIPLY
-
-/*
- Class: Power
- Returns x raised to the power of y.
-*/
-//
-/node/expression/operator/binary/Power
- precedence=OOP_POW
-
-/*
- Class: Modulo
- Returns the remainder of x / y.
-*/
-//
-/node/expression/operator/binary/Modulo
- precedence=OOP_MULTIPLY
diff --git a/code/modules/scripting/AST/Operators/Unary Operators.dm b/code/modules/scripting/AST/Operators/Unary Operators.dm
deleted file mode 100644
index b49984ba18e..00000000000
--- a/code/modules/scripting/AST/Operators/Unary Operators.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- File: Unary Operators
-*/
-/*
- Class: unary
- Represents a unary operator in the AST. Unary operators take a single operand (referred to as x below) and return a value.
-*/
-/node/expression/operator/unary
- precedence=OOP_UNARY
-
-/*
- Class: LogicalNot
- Returns !x.
-
- Example:
- !true = false and !false = true
-*/
-//
-/node/expression/operator/unary/LogicalNot
- name="logical not"
-
-/*
- Class: BitwiseNot
- Returns the value of a bitwise not operation performed on x.
-
- Example:
- ~10 (decimal 2) = 01 (decimal 1).
-*/
-//
-/node/expression/operator/unary/BitwiseNot
- name="bitwise not"
-
-/*
- Class: Minus
- Returns -x.
-*/
-//
-/node/expression/operator/unary/Minus
- name="minus"
-
-/*
- Class: group
- A special unary operator representing a value in parentheses.
-*/
-//
-/node/expression/operator/unary/group
- precedence=OOP_GROUP
-
-/node/expression/operator/unary/New(node/expression/exp)
- src.exp=exp
- return ..()
diff --git a/code/modules/scripting/AST/Statements.dm b/code/modules/scripting/AST/Statements.dm
deleted file mode 100644
index eba7b71ae5e..00000000000
--- a/code/modules/scripting/AST/Statements.dm
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- File: Statement Types
-*/
-/*
- Class: statement
- An object representing a single instruction run by an interpreter.
-*/
-/node/statement
-/*
- Class: FunctionCall
- Represents a call to a function.
-*/
-//
-/node/statement/FunctionCall
- var/func_name
- var/node/identifier/object
- var/list/parameters=list()
-
-/*
- Class: FunctionDefinition
- Defines a function.
-*/
-//
-/node/statement/FunctionDefinition
- var/func_name
- var/list/parameters=list()
- var/node/BlockDefinition/FunctionBlock/block
-
-/*
- Class: VariableAssignment
- Sets a variable in an accessible scope to the given value if one exists, otherwise initializes a new local variable to the given value.
-
- Notes:
- If a variable with the same name exists in a higher block, the value will be assigned to it. If not,
- a new variable is created in the current block. To force creation of a new variable, use .
-
- See Also:
- -
-*/
-//
-/node/statement/VariableAssignment
- var/node/identifier/object
- var/node/identifier/var_name
- var/node/expression/value
-
-/*
- Class: VariableDeclaration
- Intializes a local variable to a null value.
-
- See Also:
- -
-*/
-//
-/node/statement/VariableDeclaration
- var/node/identifier/object
- var/node/identifier/var_name
-
-/*
- Class: IfStatement
-*/
-//
-/node/statement/IfStatement
- var/node/BlockDefinition/block
- var/node/BlockDefinition/else_block // may be null
- var/node/expression/cond
-
-/*
- Class: WhileLoop
- Loops while a given condition is true.
-*/
-//
-/node/statement/WhileLoop
- var/node/BlockDefinition/block
- var/node/expression/cond
-
-/*
- Class: ForLoop
- Loops while test is true, initializing a variable, increasing the variable
-*/
-/node/statement/ForLoop
- var/node/BlockDefinition/block
- var/node/expression/test
- var/node/expression/init
- var/node/expression/increment
-
-/*
- Class: BreakStatement
- Ends a loop.
-*/
-//
-/node/statement/BreakStatement
-
-/*
- Class: ContinueStatement
- Skips to the next iteration of a loop.
-*/
-//
-/node/statement/ContinueStatement
-
-/*
- Class: ReturnStatement
- Ends the function and returns a value.
-*/
-//
-/node/statement/ReturnStatement
- var/node/expression/value
\ No newline at end of file
diff --git a/code/modules/scripting/Errors.dm b/code/modules/scripting/Errors.dm
deleted file mode 100644
index 8a47bf1c28f..00000000000
--- a/code/modules/scripting/Errors.dm
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- File: Errors
-*/
-/*
- Class: scriptError
- An error scanning or parsing the source code.
-*/
-/scriptError
- var/message /// A message describing the problem.
-/scriptError/New(msg=null)
- if(msg)message=msg
-
-/scriptError/BadToken
- message="Unexpected token: "
- var/token/token
-/scriptError/BadToken/New(token/t)
- token=t
- if(t&&t.line) message="[t.line]: [message]"
- if(istype(t))message+="[t.value]"
- else message+="[t]"
-
-/scriptError/InvalidID
- parent_type=/scriptError/BadToken
- message="Invalid identifier name: "
-
-/scriptError/ReservedWord
- parent_type=/scriptError/BadToken
- message="Identifer using reserved word: "
-
-/scriptError/BadNumber
- parent_type=/scriptError/BadToken
- message = "Bad number: "
-
-/scriptError/BadReturn
- var/token/token
- message = "Unexpected return statement outside of a function."
-/scriptError/BadReturn/New(token/t)
- src.token=t
-
-/scriptError/EndOfFile
- message = "Unexpected end of file."
-
-/scriptError/ExpectedToken
- message="Expected: '"
-/scriptError/ExpectedToken/New(id, token/T)
- if(T && T.line) message="[T.line]: [message]"
- message+="[id]'. "
- if(T)message+="Found '[T.value]'."
-
-
-/scriptError/UnterminatedComment
- message="Unterminated multi-line comment statement: expected */"
-
-/scriptError/DuplicateFunction
- message="Function defined twice."
-/scriptError/DuplicateFunction/New(name, token/t)
- message="Function '[name]' defined twice."
-
-/*
- Class: runtimeError
- An error thrown by the interpreter in running the script.
-*/
-/runtimeError
- var/name
- var/message /// A basic description as to what went wrong.
- var/stack/stack
-
-/**
- * Proc: ToString
- * Returns a description of the error suitable for showing to the user.
- */
-/runtimeError/proc/ToString()
- . = "[name]: [message]"
- if(!stack.Top()) return
- .+="\nStack:"
- while(stack.Top())
- var/node/statement/FunctionCall/stmt=stack.Pop()
- . += "\n\t [stmt.func_name]()"
-
-/runtimeError/TypeMismatch
- name="TypeMismatchError"
-/runtimeError/TypeMismatch/New(op, a, b)
- message="Type mismatch: '[a]' [op] '[b]'"
-
-/runtimeError/UnexpectedReturn
- name="UnexpectedReturnError"
- message="Unexpected return statement."
-
-/runtimeError/UnknownInstruction
- name="UnknownInstructionError"
- message="Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation."
-
-/runtimeError/UndefinedVariable
- name="UndefinedVariableError"
-/runtimeError/UndefinedVariable/New(variable)
- message="Variable '[variable]' has not been declared."
-
-/runtimeError/UndefinedFunction
- name="UndefinedFunctionError"
-/runtimeError/UndefinedFunction/New(function)
- message="Function '[function]()' has not been defined."
-
-/runtimeError/DuplicateVariableDeclaration
- name="DuplicateVariableError"
-/runtimeError/DuplicateVariableDeclaration/New(variable)
- message="Variable '[variable]' was already declared."
-
-/runtimeError/IterationLimitReached
- name="MaxIterationError"
- message="A loop has reached its maximum number of iterations."
-
-/runtimeError/RecursionLimitReached
- name="MaxRecursionError"
- message="The maximum amount of recursion has been reached."
-
-/runtimeError/DivisionByZero
- name="DivideByZeroError"
- message="Division by zero attempted."
-
-/runtimeError/MaxCPU
- name="MaxComputationalUse"
- message="Maximum amount of computational cycles reached (>= 1000)."
\ No newline at end of file
diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm
deleted file mode 100644
index 5b6ea4daf0c..00000000000
--- a/code/modules/scripting/IDE.dm
+++ /dev/null
@@ -1,211 +0,0 @@
-/client/verb/tcssave()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || issilicon(mob))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode != mob)
- return
-
- if(Machine.SelectedServer)
- var/obj/machinery/telecomms/server/Server = Machine.SelectedServer
- var/tcscode=winget(src, "tcscode", "text")
- var/msg="[mob.name] is adding script to server [Server]: [tcscode]"
- log_misc(msg)
- message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1)
- Server.setcode( tcscode ) // this actually saves the code from input to the server
- src << output(null, "tcserror") // clear the errors
- else
- src << output(null, "tcserror")
- src << output("Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
-
-
-/client/verb/tcscompile()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) ))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode != mob)
- return
-
- if(Machine.SelectedServer)
- var/obj/machinery/telecomms/server/Server = Machine.SelectedServer
- Server.setcode( winget(src, "tcscode", "text") ) // save code first
- var/list/compileerrors = Server.compile() // then compile the code!
-
- // Output all the compile-time errors
- src << output(null, "tcserror")
-
- if(compileerrors.len)
- src << output("Compile Errors", "tcserror")
- for(var/scriptError/e in compileerrors)
- src << output("\t>[e.message]", "tcserror")
- src << output("([compileerrors.len] errors)", "tcserror")
-
- // Output compile errors to all other people viewing the code too
- for(var/mob/M in Machine.viewingcode)
- if(M.client)
- M << output(null, "tcserror")
- M << output("Compile Errors", "tcserror")
- for(var/scriptError/e in compileerrors)
- M << output("\t>[e.message]", "tcserror")
- M << output("([compileerrors.len] errors)", "tcserror")
-
-
- else
- src << output("TCS compilation successful!", "tcserror")
- src << output("(0 errors)", "tcserror")
-
- for(var/mob/M in Machine.viewingcode)
- if(M.client)
- M << output("TCS compilation successful!", "tcserror")
- M << output("(0 errors)", "tcserror")
-
- else
- src << output(null, "tcserror")
- src << output("Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
-
-/client/verb/tcsrun()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) ))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode != mob)
- return
-
- if(Machine.SelectedServer)
- var/obj/machinery/telecomms/server/Server = Machine.SelectedServer
- Server.setcode( winget(src, "tcscode", "text") ) // save code first
- var/list/compileerrors = Server.compile() // then compile the code!
-
- // Output all the compile-time errors
- src << output(null, "tcserror")
-
- if(compileerrors.len)
- src << output("Compile Errors", "tcserror")
- for(var/scriptError/e in compileerrors)
- src << output("\t>[e.message]", "tcserror")
- src << output("([compileerrors.len] errors)", "tcserror")
-
- // Output compile errors to all other people viewing the code too
- for(var/mob/M in Machine.viewingcode)
- if(M.client)
- M << output(null, "tcserror")
- M << output("Compile Errors", "tcserror")
- for(var/scriptError/e in compileerrors)
- M << output("\t>[e.message]", "tcserror")
- M << output("([compileerrors.len] errors)", "tcserror")
-
- else
- // Finally, we run the code!
- src << output("TCS compilation successful! Code executed.", "tcserror")
- src << output("(0 errors)", "tcserror")
-
- for(var/mob/M in Machine.viewingcode)
- if(M.client)
- M << output("TCS compilation successful!", "tcserror")
- M << output("(0 errors)", "tcserror")
-
- var/datum/signal/signal = new()
- signal.data["message"] = ""
- if(Server.freq_listening.len > 0)
- signal.frequency = Server.freq_listening[1]
- else
- signal.frequency = PUB_FREQ
- signal.data["name"] = ""
- signal.data["job"] = ""
- signal.data["reject"] = 0
- signal.data["server"] = Server
-
- Server.Compiler.Run(signal)
-
-
- else
- src << output(null, "tcserror")
- src << output("Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror")
-
-
-/client/verb/exittcs()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) ))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode == mob)
- Machine.storedcode = "[winget(mob, "tcscode", "text")]"
- Machine.editingcode = null
- else
- if(mob in Machine.viewingcode)
- Machine.viewingcode.Remove(mob)
-
-/client/verb/tcsrevert()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) ))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode != mob)
- return
-
- if(Machine.SelectedServer)
- var/obj/machinery/telecomms/server/Server = Machine.SelectedServer
-
- // Replace quotation marks with quotation macros for proper winset() compatibility
- var/showcode = replacetext(Server.rawcode, "\\\"", "\\\\\"")
- showcode = replacetext(showcode, "\"", "\\\"")
-
- winset(mob, "tcscode", "text=\"[showcode]\"")
-
- src << output(null, "tcserror") // clear the errors
- else
- src << output(null, "tcserror")
- src << output("Failed to revert: Unable to locate server machine.", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to revert: Unable to locate machine.", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to revert: Unable to locate machine.", "tcserror")
-
-
-/client/verb/tcsclearmem()
- set hidden = 1
- if(mob.machine || issilicon(mob))
- if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) ))
- var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine
- if(Machine.editingcode != mob)
- return
-
- if(Machine.SelectedServer)
- var/obj/machinery/telecomms/server/Server = Machine.SelectedServer
- Server.memory = list() // clear the memory
- // Show results
- src << output(null, "tcserror")
- src << output("Server memory cleared!", "tcserror")
- for(var/mob/M in Machine.viewingcode)
- if(M.client)
- M << output("Server memory cleared!", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to clear memory: Unable to locate server machine.", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to clear memory: Unable to locate machine.", "tcserror")
- else
- src << output(null, "tcserror")
- src << output("Failed to clear memory: Unable to locate machine.", "tcserror")
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
deleted file mode 100644
index ae81985207b..00000000000
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ /dev/null
@@ -1,289 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-
-/* --- Traffic Control Scripting Language --- */
- // NanoTrasen TCS Language - Made by Doohl
-
-/n_Interpreter/TCS_Interpreter
- var/datum/TCS_Compiler/Compiler
-
-/n_Interpreter/TCS_Interpreter/Destroy()
- QDEL_NULL(Compiler)
- return ..()
-
-/n_Interpreter/TCS_Interpreter/HandleError(runtimeError/e)
- Compiler.Holder.add_entry(e.ToString(), "Execution Error")
-
-/datum/TCS_Compiler
- var/n_Interpreter/TCS_Interpreter/interpreter
- var/obj/machinery/telecomms/server/Holder // the server that is running the code
- var/ready = 1 // 1 if ready to run code
-
-/datum/TCS_Compiler/Destroy()
- QDEL_NULL(interpreter)
- Holder = null
- return ..()
-
- /** Proc: Compile
- * Compile a raw block of text into a program
- * Returns: List of errors
- */
-
-/datum/TCS_Compiler/proc/Compile(code as message)
- var/n_scriptOptions/nS_Options/options = new()
- var/n_Scanner/nS_Scanner/scanner = new(code, options)
- var/list/tokens = scanner.Scan()
- var/n_Parser/nS_Parser/parser = new(tokens, options)
- var/node/BlockDefinition/GlobalBlock/program = parser.Parse()
-
- var/list/returnerrors = list()
-
- returnerrors += scanner.errors
- returnerrors += parser.errors
-
- if(returnerrors.len)
- return returnerrors
-
- interpreter = new(program)
- interpreter.persist = 1
- interpreter.Compiler= src
-
- return returnerrors
-
- /* -- Execute the compiled code -- */
-/** Proc: Run
- * Executes the compiled code.
- * Arguments:
- * var/datum/signal/signal - a telecomms signal
- * Returns: None
- */
-/datum/TCS_Compiler/proc/Run(var/datum/signal/signal)
-
- if(!ready)
- return
-
- if(!interpreter)
- return
-
- interpreter.container = src
-
- interpreter.SetVar("PI" , 3.141592653) // value of pi
- interpreter.SetVar("E" , 2.718281828) // value of e
- interpreter.SetVar("SQURT2" , 1.414213562) // value of the square root of 2
- interpreter.SetVar("FALSE" , 0) // boolean shortcut to 0
- interpreter.SetVar("TRUE" , 1) // boolean shortcut to 1
-
- interpreter.SetVar("NORTH" , NORTH) // NORTH (1)
- interpreter.SetVar("SOUTH" , SOUTH) // SOUTH (2)
- interpreter.SetVar("EAST" , EAST) // EAST (4)
- interpreter.SetVar("WEST" , WEST) // WEST (8)
-
- // Channel macros
- interpreter.SetVar("$common", PUB_FREQ)
- interpreter.SetVar("$science", SCI_FREQ)
- interpreter.SetVar("$command", COMM_FREQ)
- interpreter.SetVar("$medical", MED_FREQ)
- interpreter.SetVar("$engineering",ENG_FREQ)
- interpreter.SetVar("$security", SEC_FREQ)
- interpreter.SetVar("$supply", SUP_FREQ)
- interpreter.SetVar("$explorer", EXP_FREQ)
-
- // Signal data
-
- interpreter.SetVar("$content", signal.data["message"])
- interpreter.SetVar("$freq" , signal.frequency)
- interpreter.SetVar("$source" , signal.data["name"])
- interpreter.SetVar("$job" , signal.data["job"])
- interpreter.SetVar("$sign" , signal)
- interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0
-
- // Set up the script procs
-
- /*
- -> Send another signal to a server
- @format: broadcast(content, frequency, source, job)
-
- @param content: Message to broadcast
- @param frequency: Frequency to broadcast to
- @param source: The name of the source you wish to imitate. Must be stored in stored_names list.
- @param job: The name of the job.
- */
- interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job"))
-
- /*
- -> Store a value permanently to the server machine (not the actual game hosting machine, the ingame machine)
- @format: mem(address, value)
-
- @param address: The memory address (string index) to store a value to
- @param value: The value to store to the memory address
- */
- interpreter.SetProc("mem", "mem", signal, list("address", "value"))
-
- /*
- -> Delay code for a given amount of deciseconds
- @format: sleep(time)
-
- @param time: time to sleep in deciseconds (1/10th second)
- */
- interpreter.SetProc("sleep", /proc/delay)
-
- /*
- -> Replaces a string with another string
- @format: replace(string, substring, replacestring)
-
- @param string: the string to search for substrings (best used with $content$ constant)
- @param substring: the substring to search for
- @param replacestring: the string to replace the substring with
-
- */
- interpreter.SetProc("replace", /proc/string_replacetext)
-
- /*
- -> Locates an element/substring inside of a list or string
- @format: find(haystack, needle, start = 1, end = 0)
-
- @param haystack: the container to search
- @param needle: the element to search for
- @param start: the position to start in
- @param end: the position to end in
-
- */
- interpreter.SetProc("find", /proc/smartfind)
-
- /*
- -> Finds the length of a string or list
- @format: length(container)
-
- @param container: the list or container to measure
-
- */
- interpreter.SetProc("length", /proc/smartlength)
-
- /* -- Clone functions, carried from default BYOND procs --- */
-
- // vector namespace
- interpreter.SetProc("vector", /proc/n_list)
- interpreter.SetProc("at", /proc/n_listpos)
- interpreter.SetProc("copy", /proc/n_listcopy)
- interpreter.SetProc("push_back", /proc/n_listadd)
- interpreter.SetProc("remove", /proc/n_listremove)
- interpreter.SetProc("cut", /proc/n_listcut)
- interpreter.SetProc("swap", /proc/n_listswap)
- interpreter.SetProc("insert", /proc/n_listinsert)
-
- interpreter.SetProc("pick", /proc/n_pick)
- interpreter.SetProc("prob", /proc/prob_chance)
- interpreter.SetProc("substr", /proc/docopytext)
-
- // Donkie~
- // Strings
- interpreter.SetProc("lower", /proc/n_lower)
- interpreter.SetProc("upper", /proc/n_upper)
- interpreter.SetProc("explode", /proc/string_explode)
- interpreter.SetProc("repeat", /proc/n_repeat)
- interpreter.SetProc("reverse", /proc/n_reverse)
- interpreter.SetProc("tonum", /proc/n_str2num)
-
- // Numbers
- interpreter.SetProc("tostring", /proc/n_num2str)
- interpreter.SetProc("sqrt", /proc/n_sqrt)
- interpreter.SetProc("abs", /proc/n_abs)
- interpreter.SetProc("floor", /proc/n_floor)
- interpreter.SetProc("ceil", /proc/n_ceil)
- interpreter.SetProc("round", /proc/n_round)
- interpreter.SetProc("clamp", /proc/n_clamp)
- interpreter.SetProc("inrange", /proc/n_inrange)
- // End of Donkie~
-
-
- // Run the compiled code
- interpreter.Run()
-
- // Backwards-apply variables onto signal data
- /* sanitize EVERYTHING. fucking players can't be trusted with SHIT */
-
- signal.data["message"] = interpreter.GetVar("$content")
- signal.frequency = interpreter.GetVar("$freq")
-
- var/setname = ""
- var/obj/machinery/telecomms/server/S = signal.data["server"]
- if(interpreter.GetVar("$source") in S.stored_names)
- setname = interpreter.GetVar("$source")
- else
- setname = "[interpreter.GetVar("$source")]"
-
- if(signal.data["name"] != setname)
- signal.data["realname"] = setname
- signal.data["name"] = setname
- signal.data["job"] = interpreter.GetVar("$job")
- signal.data["reject"] = !(interpreter.GetVar("$pass")) // set reject to the opposite of $pass
-
- // If the message is invalid, just don't broadcast it!
- if(signal.data["message"] == "" || !signal.data["message"])
- signal.data["reject"] = 1
-
-/* -- Actual language proc code -- */
-
-/datum/signal/proc/mem(var/address, var/value)
-
- if(istext(address))
- var/obj/machinery/telecomms/server/S = data["server"]
-
- if(!value && value != 0)
- return S.memory[address]
-
- else
- S.memory[address] = value
-
-
-/datum/signal/proc/tcombroadcast(var/message, var/freq, var/source, var/job)
-
- var/datum/signal/newsign = new
- var/obj/machinery/telecomms/server/S = data["server"]
- var/obj/item/radio/hradio = S.server_radio
-
- if(!hradio)
- error("[src] has no radio.")
- return
-
- if((!message || message == "") && message != 0)
- message = "*beep*"
- if(!source)
- source = "[html_encode(uppertext(S.id))]"
- hradio = new // sets the hradio as a radio intercom
- if(!freq)
- freq = PUB_FREQ
- if(findtext(num2text(freq), ".")) // if the frequency has been set as a decimal
- freq *= 10 // shift the decimal one place
-
- if(!job)
- job = "?"
-
- newsign.data["mob"] = null
- newsign.data["mobtype"] = /mob/living/carbon/human
- if(source in S.stored_names)
- newsign.data["name"] = source
- else
- newsign.data["name"] = "[html_encode(uppertext(source))]"
- newsign.data["realname"] = newsign.data["name"]
- newsign.data["job"] = job
- newsign.data["compression"] = 0
- newsign.data["message"] = message
- newsign.data["type"] = 2 // artificial broadcast
- if(!isnum(freq))
- freq = text2num(freq)
- newsign.frequency = freq
-
- var/datum/radio_frequency/connection = radio_controller.return_frequency(freq)
- newsign.data["connection"] = connection
-
-
- newsign.data["radio"] = hradio
- newsign.data["vmessage"] = message
- newsign.data["vname"] = source
- newsign.data["vmask"] = 0
- newsign.data["level"] = list()
-
- var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub)
- if(!pass)
- S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters
diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm
deleted file mode 100644
index 7139fe79304..00000000000
--- a/code/modules/scripting/Implementations/_Logic.dm
+++ /dev/null
@@ -1,291 +0,0 @@
-// Script -> BYOND code procs
-#define SCRIPT_MAX_REPLACEMENTS_ALLOWED 200
-// --- List operations (lists known as vectors in n_script) ---
-
-// Clone of list()
-/proc/n_list()
- var/list/returnlist = list()
- for(var/e in args)
- returnlist.Add(e)
- return returnlist
-
-// Clone of pick()
-/proc/n_pick()
- var/list/finalpick = list()
- for(var/e in args)
- if(isobject(e))
- if(istype(e, /list))
- var/list/sublist = e
- for(var/sube in sublist)
- finalpick.Add(sube)
- continue
- finalpick.Add(e)
-
- return pick(finalpick)
-
-// Clone of list[]
-/proc/n_listpos(var/list/L, var/pos, var/value)
- if(!istype(L, /list)) return
- if(isnum(pos))
- if(!value)
- if(L.len >= pos)
- return L[pos]
- else
- if(L.len >= pos)
- L[pos] = value
- else if(istext(pos))
- if(!value)
- return L[pos]
- else
- L[pos] = value
-
-// Clone of list.Copy()
-/proc/n_listcopy(var/list/L, var/start, var/end)
- if(!istype(L, /list)) return
- return L.Copy(start, end)
-
-// Clone of list.Add()
-/proc/n_listadd()
- var/list/chosenlist
- var/i = 1
- for(var/e in args)
- if(i == 1)
- if(isobject(e))
- if(istype(e, /list))
- chosenlist = e
- i = 2
- else
- if(chosenlist)
- chosenlist.Add(e)
-
-// Clone of list.Remove()
-/proc/n_listremove()
- var/list/chosenlist
- var/i = 1
- for(var/e in args)
- if(i == 1)
- if(isobject(e))
- if(istype(e, /list))
- chosenlist = e
- i = 2
- else
- if(chosenlist)
- chosenlist.Remove(e)
-
-// Clone of list.Cut()
-/proc/n_listcut(var/list/L, var/start, var/end)
- if(!istype(L, /list)) return
- return L.Cut(start, end)
-
-// Clone of list.Swap()
-/proc/n_listswap(var/list/L, var/firstindex, var/secondindex)
- if(!istype(L, /list)) return
- if(L.len >= secondindex && L.len >= firstindex)
- return L.Swap(firstindex, secondindex)
-
-// Clone of list.Insert()
-/proc/n_listinsert(var/list/L, var/index, var/element)
- if(!istype(L, /list)) return
- return L.Insert(index, element)
-
-// --- Miscellaneous functions ---
-
-// Clone of sleep()
-/proc/delay(var/time)
- sleep(time)
-
-// Clone of prob()
-/proc/prob_chance(var/chance)
- return prob(chance)
-
-// Merge of list.Find() and findtext()
-/proc/smartfind(var/haystack, var/needle, var/start = 1, var/end = 0)
- if(haystack && needle)
- if(isobject(haystack))
- if(istype(haystack, /list))
- if(length(haystack) >= end && start > 0)
- var/list/listhaystack = haystack
- return listhaystack.Find(needle, start, end)
-
- else
- if(istext(haystack))
- if(length(haystack) >= end && start > 0)
- return findtext(haystack, needle, start, end)
-
-// Clone of copytext()
-/proc/docopytext(var/string, var/start = 1, var/end = 0)
- if(istext(string) && isnum(start) && isnum(end))
- if(start > 0)
- return copytext(string, start, end)
-
-// Clone of length()
-/proc/smartlength(var/container)
- if(container)
- if(istype(container, /list) || istext(container))
- return length(container)
-
-// BY DONKIE~
-// String stuff
-/proc/n_lower(var/string)
- if(istext(string))
- return lowertext(string)
-
-/proc/n_upper(var/string)
- if(istext(string))
- return uppertext(string)
-
-/*
-//Makes a list where all indices in a string is a separate index in the list
-// JUST A HELPER DON'T ADD TO NTSCRIPT
-/proc/string_tolist(var/string)
- var/list/L = new/list()
-
- var/i
- for(i=1, i<=length(string), i++)
- L.Add(copytext(string, i, i))
-
- return L
-
-/proc/string_explode(var/string, var/separator)
- if(istext(string))
- if(istext(separator) && separator == "")
- return string_tolist(string)
- var/i
- var/lasti = 1
- var/list/L = new/list()
-
- for(i=1, i<=length(string)+1, i++)
- if(copytext(string, i, i+1) == separator) // We found a separator
- L.Add(copytext(string, lasti, i))
- lasti = i+1
-
- L.Add(copytext(string, lasti, length(string)+1)) // Adds the last segment
-
- return L
-
-Just found out there was already a string explode function, did some benchmarking, and that function were a bit faster, sticking to that.
-*/
-/proc/string_explode(var/string, var/separator)
- if(istext(string) && istext(separator))
- return splittext(string, separator)
-
-/proc/n_repeat(var/string, var/amount)
- if(istext(string) && isnum(amount))
- var/i
- var/newstring = ""
- if(length(newstring)*amount >=1000)
- return
- for(i=0, i<=amount, i++)
- if(i>=1000)
- break
- newstring = newstring + string
-
- return newstring
-
-/proc/n_reverse(var/string)
- if(istext(string))
- var/newstring = ""
- var/i
- for(i=length(string), i>0, i--)
- if(i>=1000)
- break
- newstring = newstring + copytext(string, i, i+1)
-
- return newstring
-
-// I don't know if it's necessary to make my own proc, but I think I have to to be able to check for istext.
-/proc/n_str2num(var/string)
- if(istext(string))
- return text2num(string)
-
-// Number shit
-/proc/n_num2str(var/num)
- if(isnum(num))
- return num2text(num)
-
-// Squareroot
-/proc/n_sqrt(var/num)
- if(isnum(num))
- return sqrt(num)
-
-// Magnitude of num
-/proc/n_abs(var/num)
- if(isnum(num))
- return abs(num)
-
-// Round down
-/proc/n_floor(var/num)
- if(isnum(num))
- return round(num)
-
-// Round up
-/proc/n_ceil(var/num)
- if(isnum(num))
- return round(num)+1
-
-// Round to nearest integer
-/proc/n_round(var/num)
- if(isnum(num))
- if(num-round(num)<0.5)
- return round(num)
- return n_ceil(num)
-
-// Clamps N between min and max
-/proc/n_clamp(var/num, var/min=-1, var/max=1)
- if(isnum(num)&&isnum(min)&&isnum(max))
- if(num<=min)
- return min
- if(num>=max)
- return max
- return num
-
-// Returns 1 if N is inbetween Min and Max
-/proc/n_inrange(var/num, var/min=-1, var/max=1)
- if(isnum(num)&&isnum(min)&&isnum(max))
- return ((min <= num) && (num <= max))
-// END OF BY DONKIE :(
-
-// Non-recursive
-// Imported from Mono string.ReplaceUnchecked
-/proc/string_replacetext(var/haystack,var/a,var/b)
- if(istext(haystack)&&istext(a)&&istext(b))
- var/i = 1
- var/lenh=length(haystack)
- var/lena=length(a)
- //var/lenb=length(b)
- var/count = 0
- var/list/dat = list()
- while (i < lenh)
- var/found = findtext(haystack, a, i, 0)
- //log_misc("findtext([haystack], [a], [i], 0)=[found]")
- if (found == 0) // Not found
- break
- else
- if (count < SCRIPT_MAX_REPLACEMENTS_ALLOWED)
- dat+=found
- count+=1
- else
- //log_misc("Script found [a] [count] times, aborted")
- break
- //log_misc("Found [a] at [found]! Moving up...")
- i = found + lena
- if (count == 0)
- return haystack
- //var/nlen = lenh + ((lenb - lena) * count)
- var/buf = copytext(haystack,1,dat[1]) // Prefill
- var/lastReadPos = 0
- for (i = 1, i <= count, i++)
- var/precopy = dat[i] - lastReadPos-1
- //internal static unsafe void CharCopy (String target, int targetIndex, String source, int sourceIndex, int count)
- //fixed (char* dest = target, src = source)
- //CharCopy (dest + targetIndex, src + sourceIndex, count);
- //CharCopy (dest + curPos, source + lastReadPos, precopy);
- buf+=copytext(haystack,lastReadPos,precopy)
- log_misc("buf+=copytext([haystack],[lastReadPos],[precopy])")
- log_misc("[buf]")
- lastReadPos = dat[i] + lena
- //CharCopy (dest + curPos, replace, newValue.length);
- buf+=b
- log_misc("[buf]")
- buf+=copytext(haystack,lastReadPos, 0)
- return buf
diff --git a/code/modules/scripting/Interpreter/Evaluation.dm b/code/modules/scripting/Interpreter/Evaluation.dm
deleted file mode 100644
index cfdc797ce40..00000000000
--- a/code/modules/scripting/Interpreter/Evaluation.dm
+++ /dev/null
@@ -1,167 +0,0 @@
-/proc/isobject(x)
- return !(isnum(x) || istext(x))
-
-/n_Interpreter/proc/Eval(node/expression/exp)
- if(istype(exp, /node/expression/FunctionCall))
- return RunFunction(exp)
- else if(istype(exp, /node/expression/operator))
- return EvalOperator(exp)
- else if(istype(exp, /node/expression/value/literal))
- var/node/expression/value/literal/lit=exp
- return lit.value
- else if(istype(exp, /node/expression/value/reference))
- var/node/expression/value/reference/ref=exp
- return ref.value
- else if(istype(exp, /node/expression/value/variable))
- var/node/expression/value/variable/v=exp
- if(!v.object)
- return Eval(GetVariable(v.id.id_name))
- else
- var/datum/D
- if(istype(v.object, /node/identifier))
- D=GetVariable(v.object:id_name)
- else
- D=v.object
- D=Eval(D)
- if(!isobject(D))
- return null
- if(!D.vars.Find(v.id.id_name))
- RaiseError(new/runtimeError/UndefinedVariable("[v.object.ToString()].[v.id.id_name]"))
- return null
- return Eval(D.vars[v.id.id_name])
- else if(istype(exp, /node/expression))
- RaiseError(new/runtimeError/UnknownInstruction())
- else
- return exp
-
-/n_Interpreter/proc/EvalOperator(node/expression/operator/exp)
- if(istype(exp, /node/expression/operator/binary))
- var/node/expression/operator/binary/bin=exp
- switch(bin.type)
- if(/node/expression/operator/binary/Equal)
- return Equal(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/NotEqual)
- return NotEqual(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Greater)
- return Greater(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Less)
- return Less(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/GreaterOrEqual)
- return GreaterOrEqual(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/LessOrEqual)
- return LessOrEqual(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/LogicalAnd)
- return LogicalAnd(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/LogicalOr)
- return LogicalOr(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/LogicalXor)
- return LogicalXor(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/BitwiseAnd)
- return BitwiseAnd(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/BitwiseOr)
- return BitwiseOr(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/BitwiseXor)
- return BitwiseXor(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Add)
- return Add(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Subtract)
- return Subtract(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Multiply)
- return Multiply(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Divide)
- return Divide(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Power)
- return Power(Eval(bin.exp), Eval(bin.exp2))
- if(/node/expression/operator/binary/Modulo)
- return Modulo(Eval(bin.exp), Eval(bin.exp2))
- else
- RaiseError(new/runtimeError/UnknownInstruction())
- return
- switch(exp.type)
- if(/node/expression/operator/unary/Minus)
- return Minus(Eval(exp.exp))
- if(/node/expression/operator/unary/LogicalNot)
- return LogicalNot(Eval(exp.exp))
- if(/node/expression/operator/unary/BitwiseNot)
- return BitwiseNot(Eval(exp.exp))
- if(/node/expression/operator/unary/group)
- return Eval(exp.exp)
- else
- RaiseError(new/runtimeError/UnknownInstruction())
-
-
-//Binary//
- //Comparison operators
-/n_Interpreter/proc/Equal(a, b) return a==b
-/n_Interpreter/proc/NotEqual(a, b) return a!=b //LogicalNot(Equal(a, b))
-/n_Interpreter/proc/Greater(a, b) return a>b
-/n_Interpreter/proc/Less(a, b) return a=b
-/n_Interpreter/proc/LessOrEqual(a, b) return a<=b
- //Logical Operators
-/n_Interpreter/proc/LogicalAnd(a, b) return a&&b
-/n_Interpreter/proc/LogicalOr(a, b) return a||b
-/n_Interpreter/proc/LogicalXor(a, b) return (a||b) && !(a&&b)
- //Bitwise Operators
-/n_Interpreter/proc/BitwiseAnd(a, b) return a&b
-/n_Interpreter/proc/BitwiseOr(a, b) return a|b
-/n_Interpreter/proc/BitwiseXor(a, b) return a^b
- //Arithmetic Operators
-/n_Interpreter/proc/Add(a, b)
- if(istext(a)&&!istext(b)) b="[b]"
- else if(istext(b)&&!istext(a)) a="[a]"
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("+", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("+", a, b))
- return null
- return a+b
-/n_Interpreter/proc/Subtract(a, b)
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("-", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("-", a, b))
- return null
- return a-b
-/n_Interpreter/proc/Divide(a, b)
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("/", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("/", a, b))
- return null
- if(b==0)
- RaiseError(new/runtimeError/DivisionByZero())
- return null
- return a/b
-/n_Interpreter/proc/Multiply(a, b)
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("*", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("*", a, b))
- return null
- return a*b
-/n_Interpreter/proc/Modulo(a, b)
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("%", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("%", a, b))
- return null
- return a%b
-/n_Interpreter/proc/Power(a, b)
- if(isobject(a) && !isobject(b))
- RaiseError(new/runtimeError/TypeMismatch("**", a, b))
- return null
- else if(isobject(b) && !isobject(a))
- RaiseError(new/runtimeError/TypeMismatch("**", a, b))
- return null
- return a**b
-
-//Unary//
-/n_Interpreter/proc/Minus(a) return -a
-/n_Interpreter/proc/LogicalNot(a) return !a
-/n_Interpreter/proc/BitwiseNot(a) return ~a
\ No newline at end of file
diff --git a/code/modules/scripting/Interpreter/Interaction.dm b/code/modules/scripting/Interpreter/Interaction.dm
deleted file mode 100644
index 231281a0c90..00000000000
--- a/code/modules/scripting/Interpreter/Interaction.dm
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- File: Interpreter (Public)
- Contains methods for interacting with the interpreter.
-*/
-/*
- Class: n_Interpreter
- Procedures allowing for interaction with the script that is being run by the interpreter object.
-*/
-/n_Interpreter
-
-/*
- Proc: Load
- Loads a 'compiled' script into memory.
-
- Parameters:
- program - A object which represents the script's global scope.
-*/
-/n_Interpreter/proc/Load(node/BlockDefinition/GlobalBlock/program)
- ASSERT(program)
- src.program = program
- CreateGlobalScope()
-
-/*
- Proc: Run
- Runs the script.
-*/
-/n_Interpreter/proc/Run()
- cur_recursion = 0 // reset recursion
- cur_statements = 0 // reset CPU tracking
- alertadmins = 0
-
- ASSERT(src.program)
- RunBlock(src.program)
-
-/*
- Proc: SetVar
- Defines a global variable for the duration of the next execution of a script.
-
- Notes:
- This differs from in that variables set using this procedure only last for the session,
- while those defined from the block object persist if it is ran multiple times.
-
- See Also:
- -
-*/
-/n_Interpreter/proc/SetVar(name, value)
- if(!istext(name))
- //CRASH("Invalid variable name")
- return
- AssignVariable(name, value)
-
-/*
- Proc: SetProc
- Defines a procedure to be available to the script.
-
- Parameters:
- name - The name of the procedure as exposed to the script.
- path - The typepath of a proc to be called when the function call is read by the interpreter, or, if object is specified, a string representing the procedure's name.
- object - (Optional) An object which will the be target of a function call.
- params - Only required if object is not null, a list of the names of parameters the proc takes.
-*/
-/n_Interpreter/proc/SetProc(name, path, object=null, list/params=null)
- if(!istext(name))
- //CRASH("Invalid function name")
- return
- if(!object)
- globalScope.functions[name] = path
- return
- var/node/statement/FunctionDefinition/S = new()
- S.func_name = name
- S.parameters = params
- S.block = new()
- S.block.SetVar("src", object)
- var/node/expression/FunctionCall/C = new()
- C.func_name = path
- C.object = new("src")
- for(var/p in params)
- C.parameters += new/node/expression/value/variable(p)
- var/node/statement/ReturnStatement/R=new()
- R.value=C
- S.block.statements += R
- globalScope.functions[name] = S
-/*
- Proc: VarExists
- Checks whether a global variable with the specified name exists.
-*/
-/n_Interpreter/proc/VarExists(name)
- return globalScope.variables.Find(name) //convert to 1/0 first?
-
-/*
- Proc: ProcExists
- Checks whether a global function with the specified name exists.
-*/
-/n_Interpreter/proc/ProcExists(name)
- return globalScope.functions.Find(name)
-
-/*
- Proc: GetVar
- Returns the value of a global variable in the script. Remember to ensure that the variable exists before calling this procedure.
-
- See Also:
- -
-*/
-/n_Interpreter/proc/GetVar(name)
- if(!VarExists(name))
- //CRASH("No variable named '[name]'.")
- return
- var/x = globalScope.variables[name]
- return Eval(x)
-
-/*
- Proc: CallProc
- Calls a global function defined in the script and, amazingly enough, returns its return value. Remember to ensure that the function
- exists before calling this procedure.
-
- See Also:
- -
-*/
-/n_Interpreter/proc/CallProc(name, params[]=null)
- if(!ProcExists(name))
- //CRASH("No function named '[name]'.")
- return
- var/node/statement/FunctionDefinition/func = globalScope.functions[name]
- if(istype(func))
- var/node/statement/FunctionCall/stmt = new
- stmt.func_name = func.func_name
- stmt.parameters = params
- return RunFunction(stmt)
- else
- return call(func)(arglist(params))
- //CRASH("Unknown function type '[name]'.")
-
-/*
- Event: HandleError
- Called when the interpreter throws a runtime error.
-
- See Also:
- -
-*/
-/n_Interpreter/proc/HandleError(runtimeError/e)
\ No newline at end of file
diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm
deleted file mode 100644
index efdf1f7651d..00000000000
--- a/code/modules/scripting/Interpreter/Interpreter.dm
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- File: Interpreter (Internal)
-*/
-/*
- Class: n_Interpreter
-*/
-/*
- Macros: Status Macros
- RETURNING - Indicates that the current function is returning a value.
- BREAKING - Indicates that the current loop is being terminated.
- CONTINUING - Indicates that the rest of the current iteration of a loop is being skipped.
-*/
-#define RETURNING 1
-#define BREAKING 2
-#define CONTINUING 4
-/n_Interpreter
- var/scope/curScope
- var/scope/globalScope
- var/node/BlockDefinition/program
- var/node/statement/FunctionDefinition/curFunction
- var/stack/scopes = new()
- var/stack/functions = new()
-
- var/datum/container // associated container for interpeter
-/*
- Var: status
- A variable indicating that the rest of the current block should be skipped. This may be set to any combination of .
-*/
- var/status=0
- var/returnVal
-
- var/max_statements=1000 // maximum amount of statements that can be called in one execution. this is to prevent massive crashes and exploitation
- var/cur_statements=0 // current amount of statements called
- var/alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues
- var/max_iterations=100 // max number of uninterrupted loops possible
- var/max_recursion=50 // max recursions without returning anything (or completing the code block)
- var/cur_recursion=0 // current amount of recursion
-/*
- Var: persist
- If 0, global variables will be reset after Run() finishes.
-*/
- var/persist=1
- var/paused=0
-
-/*
- Constructor: New
- Calls with the given parameters.
-*/
-/n_Interpreter/New(node/BlockDefinition/GlobalBlock/program=null)
- .=..()
- if(program)Load(program)
-
-/*
- Proc: RaiseError
- Raises a runtime error.
-*/
-/n_Interpreter/proc/RaiseError(runtimeError/e)
- e.stack=functions.Copy()
- e.stack.Push(curFunction)
- src.HandleError(e)
-
-/n_Interpreter/proc/CreateScope(node/BlockDefinition/B)
- var/scope/S = new(B, curScope)
- scopes.Push(curScope)
- curScope = S
- return S
-
-/n_Interpreter/proc/CreateGlobalScope()
- scopes.Clear()
- var/scope/S = new(program, null)
- globalScope = S
- return S
-
-/*
-Proc: RunBlock
-Runs each statement in a block of code.
-*/
-/n_Interpreter/proc/RunBlock(node/BlockDefinition/Block, scope/scope = null)
- var/is_global = istype(Block, /node/BlockDefinition/GlobalBlock)
- if(!is_global)
- if(scope)
- curScope = scope
- else
- CreateScope(Block)
- else
- if(!persist)
- CreateGlobalScope()
- curScope = globalScope
-
- if(cur_statements < max_statements)
-
- for(var/node/statement/S in Block.statements)
- while(paused) sleep(10)
-
- cur_statements++
- if(cur_statements >= max_statements)
- RaiseError(new/runtimeError/MaxCPU())
-
- if(container && !alertadmins)
- if(istype(container, /datum/TCS_Compiler))
- var/datum/TCS_Compiler/Compiler = container
- var/obj/machinery/telecomms/server/Holder = Compiler.Holder
- var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])."
-
- alertadmins = 1
- message_admins(message, 1)
- break
-
- if(istype(S, /node/statement/VariableAssignment))
- var/node/statement/VariableAssignment/stmt = S
- var/name = stmt.var_name.id_name
- if(!stmt.object)
- // Below we assign the variable first to null if it doesn't already exist.
- // This is necessary for assignments like +=, and when the variable is used in a function
- // If the variable already exists in a different block, then AssignVariable will automatically use that one.
- if(!IsVariableAccessible(name))
- AssignVariable(name, null)
- AssignVariable(name, Eval(stmt.value))
- else
- var/datum/D = Eval(GetVariable(stmt.object.id_name))
- if(!D) return
- D.vars[stmt.var_name.id_name] = Eval(stmt.value)
- else if(istype(S, /node/statement/VariableDeclaration))
- //VariableDeclaration nodes are used to forcibly declare a local variable so that one in a higher scope isn't used by default.
- var/node/statement/VariableDeclaration/dec=S
- if(!dec.object)
- AssignVariable(dec.var_name.id_name, null, curScope)
- else
- var/datum/D = Eval(GetVariable(dec.object.id_name))
- if(!D) return
- D.vars[dec.var_name.id_name] = null
- else if(istype(S, /node/statement/FunctionCall))
- RunFunction(S)
- else if(istype(S, /node/statement/FunctionDefinition))
- //do nothing
- else if(istype(S, /node/statement/WhileLoop))
- RunWhile(S)
- else if(istype(S, /node/statement/IfStatement))
- RunIf(S)
- else if(istype(S, /node/statement/ReturnStatement))
- if(!curFunction)
- RaiseError(new/runtimeError/UnexpectedReturn())
- continue
- status |= RETURNING
- returnVal=Eval(S:value)
- break
- else if(istype(S, /node/statement/BreakStatement))
- status |= BREAKING
- break
- else if(istype(S, /node/statement/ContinueStatement))
- status |= CONTINUING
- break
- else
- RaiseError(new/runtimeError/UnknownInstruction())
- if(status)
- break
-
- curScope = scopes.Pop()
-
-/*
-Proc: RunFunction
-Runs a function block or a proc with the arguments specified in the script.
-*/
-/n_Interpreter/proc/RunFunction(node/statement/FunctionCall/stmt)
- //Note that anywhere /node/statement/FunctionCall/stmt is used so may /node/expression/FunctionCall
-
- // If recursion gets too high (max 50 nested functions) throw an error
- if(cur_recursion >= max_recursion)
- RaiseError(new/runtimeError/RecursionLimitReached())
- return 0
-
- var/node/statement/FunctionDefinition/def
- if(!stmt.object) //A scope's function is being called, stmt.object is null
- def = GetFunction(stmt.func_name)
- else if(istype(stmt.object)) //A method of an object exposed as a variable is being called, stmt.object is a /node/identifier
- var/O = GetVariable(stmt.object.id_name) //Gets a reference to the object which is the target of the function call.
- if(!O) return //Error already thrown in GetVariable()
- def = Eval(O)
-
- if(!def) return
-
- cur_recursion++ // add recursion
- if(istype(def))
- if(curFunction) functions.Push(curFunction)
- var/scope/S = CreateScope(def.block)
- for(var/i=1 to def.parameters.len)
- var/val
- if(stmt.parameters.len>=i)
- val = stmt.parameters[i]
- //else
- // unspecified param
- AssignVariable(def.parameters[i], new/node/expression/value/literal(Eval(val)), S)
- curFunction=stmt
- RunBlock(def.block, S)
- //Handle return value
- . = returnVal
- status &= ~RETURNING
- returnVal=null
- curFunction=functions.Pop()
- cur_recursion--
- else
- cur_recursion--
- var/list/params=new
- for(var/node/expression/P in stmt.parameters)
- params+=list(Eval(P))
- if(isobject(def)) //def is an object which is the target of a function call
- if( !hascall(def, stmt.func_name) )
- RaiseError(new/runtimeError/UndefinedFunction("[stmt.object.id_name].[stmt.func_name]"))
- return
- return call(def, stmt.func_name)(arglist(params))
- else //def is a path to a global proc
- return call(def)(arglist(params))
- //else
- // RaiseError(new/runtimeError/UnknownInstruction())
-
-/*
-Proc: RunIf
-Checks a condition and runs either the if block or else block.
-*/
-/n_Interpreter/proc/RunIf(node/statement/IfStatement/stmt)
- if(Eval(stmt.cond))
- RunBlock(stmt.block)
- else if(stmt.else_block)
- RunBlock(stmt.else_block)
-
-/*
-Proc: RunWhile
-Runs a while loop.
-*/
-/n_Interpreter/proc/RunWhile(node/statement/WhileLoop/stmt)
- var/i=1
- while(Eval(stmt.cond) && Iterate(stmt.block, i++))
- continue
- status &= ~BREAKING
-
-/*
-Proc:Iterate
-Runs a single iteration of a loop. Returns a value indicating whether or not to continue looping.
-*/
-/n_Interpreter/proc/Iterate(node/BlockDefinition/block, count)
- RunBlock(block)
- if(max_iterations > 0 && count >= max_iterations)
- RaiseError(new/runtimeError/IterationLimitReached())
- return 0
- if(status & (BREAKING|RETURNING))
- return 0
- status &= ~CONTINUING
- return 1
-
-/*
-Proc: GetFunction
-Finds a function in an accessible scope with the given name. Returns a .
-*/
-/n_Interpreter/proc/GetFunction(name)
- var/scope/S = curScope
- while(S)
- if(S.functions.Find(name))
- return S.functions[name]
- S = S.parent
- RaiseError(new/runtimeError/UndefinedFunction(name))
-
-/*
-Proc: GetVariable
-Finds a variable in an accessible scope and returns its value.
-*/
-/n_Interpreter/proc/GetVariable(name)
- var/scope/S = curScope
- while(S)
- if(S.variables.Find(name))
- return S.variables[name]
- S = S.parent
- RaiseError(new/runtimeError/UndefinedVariable(name))
-
-/n_Interpreter/proc/GetVariableScope(name) //needed for when you reassign a variable in a higher scope
- var/scope/S = curScope
- while(S)
- if(S.variables.Find(name))
- return S
- S = S.parent
-
-
-/n_Interpreter/proc/IsVariableAccessible(name)
- var/scope/S = curScope
- while(S)
- if(S.variables.Find(name))
- return TRUE
- S = S.parent
- return FALSE
-
-
-/*
-Proc: AssignVariable
-Assigns a value to a variable in a specific block.
-
-Parameters:
-name - The name of the variable to assign.
-value - The value to assign to it.
-S - The scope the variable resides in. If it is null, a scope with the variable already existing is found. If no scopes have a variable of the given name, the current scope is used.
-*/
-/n_Interpreter/proc/AssignVariable(name, node/expression/value, scope/S=null)
- if(!S) S = GetVariableScope(name)
- if(!S) S = curScope
- if(!S) S = globalScope
- ASSERT(istype(S))
- if(istext(value) || isnum(value) || isnull(value)) value = new/node/expression/value/literal(value)
- else if(!istype(value) && isobject(value)) value = new/node/expression/value/reference(value)
- //TODO: check for invalid name
- S.variables["[name]"] = value
-
diff --git a/code/modules/scripting/Interpreter/Scope.dm b/code/modules/scripting/Interpreter/Scope.dm
deleted file mode 100644
index d768e74bf16..00000000000
--- a/code/modules/scripting/Interpreter/Scope.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Class: scope
- A runtime instance of a block. Used internally by the interpreter.
-*/
-/scope/
- var/scope/parent = null
- var/node/BlockDefinition/block
- var/list/functions
- var/list/variables
-
-/scope/New(node/BlockDefinition/B, scope/parent)
- src.block = B
- src.parent = parent
- src.variables = B.initial_variables.Copy()
- src.functions = B.functions.Copy()
- .=..()
\ No newline at end of file
diff --git a/code/modules/scripting/Options.dm b/code/modules/scripting/Options.dm
deleted file mode 100644
index a839cf9183d..00000000000
--- a/code/modules/scripting/Options.dm
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-File: Options
-*/
-var/global/const/ascii_A =65
-var/global/const/ascii_Z =90
-var/global/const/ascii_a =97
-var/global/const/ascii_z =122
-var/global/const/ascii_DOLLAR = 36 // $
-var/global/const/ascii_ZERO=48
-var/global/const/ascii_NINE=57
-var/global/const/ascii_UNDERSCORE=95 // _
-
-/*
- Class: n_scriptOptions
-*/
-/n_scriptOptions/proc/CanStartID(char) //returns true if the character can start a variable, function, or keyword name (by default letters or an underscore)
- if(!isnum(char))char=text2ascii(char)
- return (char in ascii_A to ascii_Z) || (char in ascii_a to ascii_z) || char==ascii_UNDERSCORE || char==ascii_DOLLAR
-
-/n_scriptOptions/proc/IsValidIDChar(char) //returns true if the character can be in the body of a variable, function, or keyword name (by default letters, numbers, and underscore)
- if(!isnum(char))char=text2ascii(char)
- return CanStartID(char) || IsDigit(char)
-
-/n_scriptOptions/proc/IsDigit(char)
- if(!isnum(char))char=text2ascii(char)
- return char in ascii_ZERO to ascii_NINE
-
-/n_scriptOptions/proc/IsValidID(id) //returns true if all the characters in the string are okay to be in an identifier name
- if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically
- return 0
- if(length(id)==1) return 1
- for(var/i=2 to length(id))
- if(!IsValidIDChar(copytext(id, i, i+1)))
- return 0
- return 1
-
-/*
- Class: nS_Options
- An implementation of for the n_Script language.
-*/
-/n_scriptOptions/nS_Options
- var/list/symbols = list("(", ")", "\[", "]", ";", ",", "{", "}") //scanner - Characters that can be in symbols
-/*
-Var: keywords
-An associative list used by the parser to parse keywords. Indices are strings which will trigger the keyword when parsed and the
-associated values are types of which the proc will be called.
-*/
- var/list/keywords = list(
- "if" = /n_Keyword/nS_Keyword/kwIf,
- "else" = /n_Keyword/nS_Keyword/kwElse,
- "while" = /n_Keyword/nS_Keyword/kwWhile,
- "break" = /n_Keyword/nS_Keyword/kwBreak,
- "continue" = /n_Keyword/nS_Keyword/kwContinue,
- "return" = /n_Keyword/nS_Keyword/kwReturn,
- "def" = /n_Keyword/nS_Keyword/kwDef
- )
-
- var/list/assign_operators = list(
- "=" = null,
- "&=" = "&",
- "|=" = "|",
- "`=" = "`",
- "+=" = "+",
- "-=" = "-",
- "*=" = "*",
- "/=" = "/",
- "^=" = "^",
- "%=" = "%"
- )
-
- var/list/unary_operators =list(
- "!" = /node/expression/operator/unary/LogicalNot,
- "~" = /node/expression/operator/unary/BitwiseNot,
- "-" = /node/expression/operator/unary/Minus
- )
-
- var/list/binary_operators=list(
- "==" = /node/expression/operator/binary/Equal,
- "!=" = /node/expression/operator/binary/NotEqual,
- ">" = /node/expression/operator/binary/Greater,
- "<" = /node/expression/operator/binary/Less,
- ">=" = /node/expression/operator/binary/GreaterOrEqual,
- "<=" = /node/expression/operator/binary/LessOrEqual,
- "&&" = /node/expression/operator/binary/LogicalAnd,
- "||" = /node/expression/operator/binary/LogicalOr,
- "&" = /node/expression/operator/binary/BitwiseAnd,
- "|" = /node/expression/operator/binary/BitwiseOr,
- "`" = /node/expression/operator/binary/BitwiseXor,
- "+" = /node/expression/operator/binary/Add,
- "-" = /node/expression/operator/binary/Subtract,
- "*" = /node/expression/operator/binary/Multiply,
- "/" = /node/expression/operator/binary/Divide,
- "^" = /node/expression/operator/binary/Power,
- "%" = /node/expression/operator/binary/Modulo)
-
-/n_scriptOptions/nS_Options/New()
- .=..()
- for(var/O in assign_operators+binary_operators+unary_operators)
- if(!symbols.Find(O)) symbols+=O
\ No newline at end of file
diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm
deleted file mode 100644
index eddfdbf679c..00000000000
--- a/code/modules/scripting/Parser/Expressions.dm
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- File: Expressions
- Procedures for parsing expressions.
-*/
-
-/*
- Macros: Expression Macros
- OPERATOR - A value indicating the parser currently expects a binary operator.
- VALUE - A value indicating the parser currently expects a value.
- SHIFT - Tells the parser to push the current operator onto the stack.
- REDUCE - Tells the parser to reduce the stack.
-*/
-#define OPERATOR 1
-#define VALUE 2
-#define SHIFT 0
-#define REDUCE 1
-
-/*
- Class: nS_Parser
-*/
-/n_Parser/nS_Parser
-/*
- Var: expecting
- A variable which keeps track of whether an operator or value is expected. It should be either or . See
- for more information.
-*/
- var/expecting=VALUE
-
-/*
- Proc: Precedence
- Compares two operators, decides which is higher in the order of operations, and returns or .
-*/
-/n_Parser/nS_Parser/proc/Precedence(node/expression/operator/top, node/expression/operator/input)
- if(istype(top))
- top=top.precedence
- if(istype(input))
- input=input:precedence
- if(top>=input)
- return REDUCE
- return SHIFT
-
-/*
-Proc: GetExpression
-Takes a token expected to represent a value and returns an node.
-*/
-/n_Parser/nS_Parser/proc/GetExpression(token/T)
- if(!T) return
- if(istype(T, /node/expression))
- return T
- switch(T.type)
- if(/token/word)
- return new/node/expression/value/variable(T.value)
- if(/token/accessor)
- var/token/accessor/A=T
- var/node/expression/value/variable/E//=new(A.member)
- var/stack/S=new()
- while(istype(A.object, /token/accessor))
- S.Push(A)
- A=A.object
- ASSERT(istext(A.object))
-
- while(A)
- var/node/expression/value/variable/V=new()
- V.id=new(A.member)
- if(E)
- V.object=E
- else
- V.object=new/node/identifier(A.object)
- E=V
- A=S.Pop()
- return E
-
- if(/token/number, /token/string)
- return new/node/expression/value/literal(T.value)
-
-/*
-Proc: GetOperator
-Gets a path related to a token or string and returns an instance of the given type. This is used to get an instance of either a binary or unary
-operator from a token.
-
-Parameters:
-O - The input value. If this is a token, O is reset to the token's value.
- When O is a string and is in L, its associated value is used as the path to instantiate.
-type - The desired type of the returned object.
-L - The list in which to search for O.
-
-See Also:
--
--
-*/
-/n_Parser/nS_Parser/proc/GetOperator(O, type=/node/expression/operator, L[])
- if(istype(O, type)) return O //O is already the desired type
- if(istype(O, /token)) O=O:value //sets O to text
- if(istext(O)) //sets O to path
- if(L.Find(O)) O=L[O]
- else return null
- if(ispath(O))O=new O //catches path from last check
- else return null //Unknown type
- return O
-
-/*
-Proc: GetBinaryOperator
-Uses to search for an instance of a binary operator type with which the given string is associated. For example, if
-O is set to "+", an node is returned.
-
-See Also:
--
--
-*/
-/n_Parser/nS_Parser/proc/GetBinaryOperator(O)
- return GetOperator(O, /node/expression/operator/binary, options.binary_operators)
-
-/*
-Proc: GetUnaryOperator
-Uses to search for an instance of a unary operator type with which the given string is associated. For example, if
-O is set to "!", a node is returned.
-
-See Also:
--
--
-*/
-/n_Parser/nS_Parser/proc/GetUnaryOperator(O)
- return GetOperator(O, /node/expression/operator/unary, options.unary_operators)
-
-/*
-Proc: Reduce
-Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top
-of the val stack.
-*/
-/n_Parser/nS_Parser/proc/Reduce(stack/opr, stack/val)
- var/node/expression/operator/O=opr.Pop()
- if(!O) return
- if(!istype(O))
- errors+=new/scriptError("Error reducing expression - invalid operator.")
- return
- //Take O and assign its operands, popping one or two values from the val stack
- //depending on whether O is a binary or unary operator.
- if(istype(O, /node/expression/operator/binary))
- var/node/expression/operator/binary/B=O
- B.exp2=val.Pop()
- B.exp =val.Pop()
- val.Push(B)
- else
- O.exp=val.Pop()
- val.Push(O)
-
-/*
-Proc: EndOfExpression
-Returns true if the current token represents the end of an expression.
-
-Parameters:
-end - A list of values to compare the current token to.
-*/
-/n_Parser/nS_Parser/proc/EndOfExpression(end[])
- if(!curToken)
- return 1
- if(istype(curToken, /token/symbol) && end.Find(curToken.value))
- return 1
- if(istype(curToken, /token/end) && end.Find(/token/end))
- return 1
- return 0
-
-/*
-Proc: ParseExpression
-Uses the Shunting-yard algorithm to parse expressions.
-
-Notes:
-- When an opening parenthesis is found, then is called to handle it.
-- The variable helps distinguish unary operators from binary operators (for cases like the - operator, which can be either).
-
-Articles:
--
--
-
-See Also:
--
--
--
-*/
-/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}"))
- var/stack/opr=new
- var/stack/val=new
- src.expecting=VALUE
- while(TRUE)
- if(EndOfExpression(end))
- break
- if(istype(curToken, /token/symbol) && ErrChars.Find(curToken.value))
- errors+=new/scriptError/BadToken(curToken)
- break
-
-
- if(index>tokens.len) //End of File
- errors+=new/scriptError/EndOfFile()
- break
- var/token/ntok
- if(index+1<=tokens.len)
- ntok=tokens[index+1]
-
- if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression
- if(expecting!=VALUE)
- errors+=new/scriptError/ExpectedToken("operator", curToken)
- NextToken()
- continue
- val.Push(ParseParenExpression())
- else if(istype(curToken, /token/symbol)) //Operator found.
- var/node/expression/operator/curOperator //Figure out whether it is unary or binary and get a new instance.
- if(src.expecting==OPERATOR)
- curOperator=GetBinaryOperator(curToken)
- if(!curOperator)
- errors+=new/scriptError/ExpectedToken("operator", curToken)
- NextToken()
- continue
- else
- curOperator=GetUnaryOperator(curToken)
- if(!curOperator) //given symbol isn't a unary operator
- errors+=new/scriptError/ExpectedToken("expression", curToken)
- NextToken()
- continue
-
- if(opr.Top() && Precedence(opr.Top(), curOperator)==REDUCE) //Check order of operations and reduce if necessary
- Reduce(opr, val)
- continue
- opr.Push(curOperator)
- src.expecting=VALUE
- else if(ntok && ntok.value=="(" && istype(ntok, /token/symbol)\
- && istype(curToken, /token/word)) //Parse function call
- var/token/preToken=curToken
- var/old_expect=src.expecting
- var/fex=ParseFunctionExpression()
- if(old_expect!=VALUE)
- errors+=new/scriptError/ExpectedToken("operator", preToken)
- NextToken()
- continue
- val.Push(fex)
- else if(istype(curToken, /token/keyword)) //inline keywords
- var/n_Keyword/kw=options.keywords[curToken.value]
- kw=new kw(inline=1)
- if(kw)
- if(!kw.Parse(src))
- return
- else
- errors+=new/scriptError/BadToken(curToken)
- else if(istype(curToken, /token/end)) //semicolon found where it wasn't expected
- errors+=new/scriptError/BadToken(curToken)
- NextToken()
- continue
- else
- if(expecting!=VALUE)
- errors+=new/scriptError/ExpectedToken("operator", curToken)
- NextToken()
- continue
- val.Push(GetExpression(curToken))
- src.expecting=OPERATOR
- NextToken()
-
- while(opr.Top()) Reduce(opr, val) //Reduce the value stack completely
- .=val.Pop() //Return what should be the last value on the stack
- if(val.Top()) //
- var/node/N=val.Pop()
- errors+=new/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].")
- return null
-
-/*
-Proc: ParseFunctionExpression
-Parses a function call inside of an expression.
-
-See Also:
--
-*/
-/n_Parser/nS_Parser/proc/ParseFunctionExpression()
- var/node/expression/FunctionCall/exp=new
- exp.func_name=curToken.value
- NextToken() //skip function name
- NextToken() //skip open parenthesis, already found
- var/loops = 0
-
- while(TRUE)
- loops++
- if(loops>=1000)
- CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;")
-
- if(istype(curToken, /token/symbol) && curToken.value==")")
- return exp
- exp.parameters+=ParseParamExpression()
- if(curToken.value==","&&istype(curToken, /token/symbol))NextToken() //skip comma
- if(istype(curToken, /token/end)) //Prevents infinite loop...
- errors+=new/scriptError/ExpectedToken(")")
- return exp
-
-/*
-Proc: ParseParenExpression
-Parses an expression that ends with a close parenthesis. This is used for parsing expressions inside of parentheses.
-
-See Also:
--
-*/
-/n_Parser/nS_Parser/proc/ParseParenExpression()
- if(!CheckToken("(", /token/symbol))
- return
- return new/node/expression/operator/unary/group(ParseExpression(list(")")))
-
-/*
-Proc: ParseParamExpression
-Parses an expression that ends with either a comma or close parenthesis. This is used for parsing the parameters passed to a function call.
-
-See Also:
--
-*/
-/n_Parser/nS_Parser/proc/ParseParamExpression()
- return ParseExpression(list(",", ")"))
\ No newline at end of file
diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm
deleted file mode 100644
index 2965b452743..00000000000
--- a/code/modules/scripting/Parser/Keywords.dm
+++ /dev/null
@@ -1,158 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-/*
- File: Keywords
-*/
-var/global/const/KW_FAIL = 0 //Fatal error; stop parsing entire script.
-var/global/const/KW_PASS = 1 //OK
-var/global/const/KW_ERR = 2 //Non-fatal error, keyword couldn't be handled properly. Ignore keyword but continue on.
-var/global/const/KW_WARN = 3 //Warning
-
-/*
-var/global/const/Class: n_Keyword
-var/global/const/Represents a special statement in the code triggered by a keyword.
-*/
-
-/*
- Var: inline
- 1 if the keyword is in an expression (e.g. the new keyword in many languages), 0 otherwise (such as the if and else keywords).
-*/
-/n_Keyword
- var/inline
-/n_Keyword/New(inline=FALSE)
- src.inline=inline
- return ..()
-
-/*
- Proc: Parse
- Called when the parser finds a keyword in the code.
-
- Parameters:
- parser - The parser that created this object. You can use the parameter to manipulate the parser in order to add statements and blocks
- to its AST.
-*/
-/n_Keyword/proc/Parse(n_Parser/parser)
-
-/*
- Class: nS_Keyword
- A keyword in n_Script. By default these include return, if, else, while, and def. To enable or disable a keyword, change the
- list.
-
- Behavior:
- When a parser is expecting a new statement, and a keyword listed in is found, it will call the keyword's
- proc.
-*/
-//
-/n_Keyword/nS_Keyword/New(inline=0)
- if(inline)
- qdel(src)
-
-/n_Keyword/nS_Keyword/kwReturn/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
- parser.errors+=new/scriptError/BadReturn(parser.curToken)
- . = KW_WARN
- var/node/statement/ReturnStatement/stmt=new
- parser.NextToken() //skip 'return' token
- stmt.value=parser.ParseExpression()
- parser.curBlock.statements+=stmt
-
-/n_Keyword/nS_Keyword/kwIf/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- var/node/statement/IfStatement/stmt=new
- parser.NextToken() //skip 'if' token
- stmt.cond=parser.ParseParenExpression()
- if(!parser.CheckToken(")", /token/symbol))
- return KW_FAIL
- if(!parser.CheckToken("{", /token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0
- return KW_ERR
- parser.curBlock.statements+=stmt
- stmt.block=new
- parser.AddBlock(stmt.block)
-
-/n_Keyword/nS_Keyword/kwElse/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- var/list/L=parser.curBlock.statements
- var/node/statement/IfStatement/stmt
- if(L&&L.len) stmt=L[L.len] //Get the last statement in the current block
- if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement
- parser.errors+=new/scriptError/ExpectedToken("if statement",parser.curToken)
- return KW_FAIL
- parser.NextToken() //skip 'else' token
- if(!parser.CheckToken("{", /token/symbol, skip=0))
- return KW_ERR
- stmt.else_block=new()
- parser.AddBlock(stmt.else_block)
-
-/n_Keyword/nS_Keyword/kwWhile/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- var/node/statement/WhileLoop/stmt=new
- parser.NextToken() //skip 'while' token
- stmt.cond=parser.ParseParenExpression()
- if(!parser.CheckToken(")", /token/symbol))
- return KW_FAIL
- if(!parser.CheckToken("{", /token/symbol, skip=0))
- return KW_ERR
- parser.curBlock.statements+=stmt
- stmt.block=new
- parser.AddBlock(stmt.block)
-
-/n_Keyword/nS_Keyword/kwBreak/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
- parser.errors+=new/scriptError/BadToken(parser.curToken)
- . = KW_WARN
- var/node/statement/BreakStatement/stmt=new
- parser.NextToken() //skip 'break' token
- parser.curBlock.statements+=stmt
-
-/n_Keyword/nS_Keyword/kwContinue/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
- parser.errors+=new/scriptError/BadToken(parser.curToken)
- . = KW_WARN
- var/node/statement/ContinueStatement/stmt=new
- parser.NextToken() //skip 'break' token
- parser.curBlock.statements+=stmt
-
-/n_Keyword/nS_Keyword/kwDef/Parse(n_Parser/nS_Parser/parser)
- .=KW_PASS
- var/node/statement/FunctionDefinition/def=new
- parser.NextToken() //skip 'def' token
- if(!parser.options.IsValidID(parser.curToken.value))
- parser.errors+=new/scriptError/InvalidID(parser.curToken)
- return KW_FAIL
- def.func_name=parser.curToken.value
- parser.NextToken()
- if(!parser.CheckToken("(", /token/symbol))
- return KW_FAIL
- while(TRUE) //for now parameters can be separated by whitespace - they don't need a comma in between
- if(istype(parser.curToken, /token/symbol))
- switch(parser.curToken.value)
- if(",")
- parser.NextToken()
- if(")")
- break
- else
- parser.errors+=new/scriptError/BadToken(parser.curToken)
- return KW_ERR
-
- else if(istype(parser.curToken, /token/word))
- def.parameters+=parser.curToken.value
- parser.NextToken()
- else
- parser.errors+=new/scriptError/InvalidID(parser.curToken)
- return KW_ERR
- if(!parser.CheckToken(")", /token/symbol))
- return KW_FAIL
-
- if(istype(parser.curToken, /token/end)) //Function prototype
- parser.curBlock.statements+=def
- else if(parser.curToken.value=="{" && istype(parser.curToken, /token/symbol))
- def.block = new
- parser.curBlock.statements+=def
- parser.curBlock.functions[def.func_name]=def
- parser.AddBlock(def.block)
- else
- parser.errors+=new/scriptError/BadToken(parser.curToken)
- return KW_FAIL
diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm
deleted file mode 100644
index ab4d6805e70..00000000000
--- a/code/modules/scripting/Parser/Parser.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- File: Parser
-*/
-/*
- Class: n_Parser
- An object that reads tokens and produces an AST (abstract syntax tree).
-*/
-/n_Parser
- var/index = 1
-/*
- Var: index
- The parser's current position in the token's list.
-*/
-/*
- Var: tokens
- A list of tokens in the source code generated by a scanner.
-*/
- var/list/tokens = new
-/*
- Var: errors
- A list of fatal errors found by the parser. If there are any items in this list, then it is not safe to run the returned AST.
-
- See Also:
- -
-*/
- var/list/errors = new
-/*
- Var: warnings
- A list of non-fatal problems in the script.
-*/
- var/list/warnings = new
-/*
- Var: curToken
- The token at in .
-*/
- var/token/curToken
- var/stack/blocks=new
- var/node/BlockDefinition/GlobalBlock/global_block=new
- var/node/BlockDefinition/curBlock
-
-/*
- Proc: Parse
- Reads the tokens and returns the AST's node. Be sure to populate the tokens list before calling this procedure.
-*/
-/n_Parser/proc/Parse()
-
-/*
- Proc: NextToken
- Sets to the next token in the list, or null if there are no more tokens.
-*/
-/n_Parser/proc/NextToken()
- if(index>=tokens.len)
- curToken=null
- else
- curToken=tokens[++index]
- return curToken
-
-/*
- Class: nS_Parser
- An implmentation of a parser for n_Script.
-*/
-/n_Parser/nS_Parser
- var/n_scriptOptions/nS_Options/options
-/*
- Constructor: New
-
- Parameters:
- tokens - A list of tokens to parse.
- options - An object used for configuration.
-*/
-/n_Parser/nS_Parser/New(tokens[], n_scriptOptions/options)
- src.tokens=tokens
- src.options=options
- curBlock=global_block
- return ..()
-
-/n_Parser/nS_Parser/Parse()
- ASSERT(tokens)
- for(,src.index<=src.tokens.len, src.index++)
- curToken=tokens[index]
- switch(curToken.type)
- if(/token/keyword)
- var/n_Keyword/kw=options.keywords[curToken.value]
- kw=new kw()
- if(kw)
- if(!kw.Parse(src))
- return
- if(/token/word)
- var/token/ntok
- if(index+1>tokens.len)
- errors+=new/scriptError/BadToken(curToken)
- continue
- ntok=tokens[index+1]
- if(!istype(ntok, /token/symbol))
- errors+=new/scriptError/BadToken(ntok)
- continue
- if(ntok.value=="(")
- ParseFunctionStatement()
- else if(options.assign_operators.Find(ntok.value))
- ParseAssignment()
- else
- errors+=new/scriptError/BadToken(ntok)
- continue
- if(!istype(curToken, /token/end))
- errors+=new/scriptError/ExpectedToken(";", curToken)
- continue
- if(/token/symbol)
- if(curToken.value=="}")
- if(!EndBlock())
- errors+=new/scriptError/BadToken(curToken)
- continue
- else
- errors+=new/scriptError/BadToken(curToken)
- continue
- if(/token/end)
- warnings+=new/scriptError/BadToken(curToken)
- continue
- else
- errors+=new/scriptError/BadToken(curToken)
- return
- return global_block
-
-/n_Parser/nS_Parser/proc/CheckToken(val, type, err=1, skip=1)
- if(curToken.value!=val || !istype(curToken,type))
- if(err)
- errors+=new/scriptError/ExpectedToken(val, curToken)
- return 0
- if(skip)NextToken()
- return 1
-
-/n_Parser/nS_Parser/proc/AddBlock(node/BlockDefinition/B)
- blocks.Push(curBlock)
- curBlock=B
-
-/n_Parser/nS_Parser/proc/EndBlock()
- if(curBlock==global_block) return 0
- curBlock=blocks.Pop()
- return 1
-
-/n_Parser/nS_Parser/proc/ParseAssignment()
- var/name=curToken.value
- if(!options.IsValidID(name))
- errors+=new/scriptError/InvalidID(curToken)
- return
- NextToken()
- var/t=options.binary_operators[options.assign_operators[curToken.value]]
- var/node/statement/VariableAssignment/stmt=new()
- stmt.var_name=new(name)
- NextToken()
- if(t)
- stmt.value=new t()
- stmt.value:exp=new/node/expression/value/variable(stmt.var_name)
- stmt.value:exp2=ParseExpression()
- else
- stmt.value=ParseExpression()
- curBlock.statements+=stmt
-
-/n_Parser/nS_Parser/proc/ParseFunctionStatement()
- if(!istype(curToken, /token/word))
- errors+=new/scriptError("Bad identifier in function call.")
- return
- var/node/statement/FunctionCall/stmt=new
- stmt.func_name=curToken.value
- NextToken() //skip function name
- if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis
- return
- var/loops = 0
- while(TRUE)
- loops++
- if(loops>=6000)
- CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;")
-
- if(!curToken)
- errors+=new/scriptError/EndOfFile()
- return
- if(istype(curToken, /token/symbol) && curToken.value==")")
- curBlock.statements+=stmt
- NextToken() //Skip close parenthesis
- return
- var/node/expression/P=ParseParamExpression()
- stmt.parameters+=P
- if(istype(curToken, /token/symbol) && curToken.value==",") NextToken()
\ No newline at end of file
diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm
deleted file mode 100644
index 919bb82a488..00000000000
--- a/code/modules/scripting/Scanner/Scanner.dm
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- File: Scanner
-*/
-/*
- Class: n_Scanner
- An object responsible for breaking up source code into tokens for use by the parser.
-*/
-/n_Scanner
- var/code
-/*
- Var: errors
- A list of fatal errors found by the scanner. If there are any items in this list, then it is not safe to parse the returned tokens.
-
- See Also:
- -
-*/
- var/list/errors = new
-/*
- Var: warnings
- A list of non-fatal problems in the source code found by the scanner.
-*/
- var/list/warnings = new
-
-/*
- Proc: LoadCode
- Loads source code.
-*/
-/n_Scanner/proc/LoadCode(c)
- code=c
-
-/*
- Proc: LoadCodeFromFile
- Gets the code from a file and calls .
-*/
-/n_Scanner/proc/LoadCodeFromFile(f)
- LoadCode(file2text(f))
-
-/*
- Proc: Scan
- Runs the scanner and returns the resulting list of tokens. Ensure that has been called first.
-*/
-/n_Scanner/proc/Scan()
-
-/*
- Class: nS_Scanner
- A scanner implementation for n_Script.
-*/
-/n_Scanner/nS_Scanner
-
-/*
- Variable: codepos
- The scanner's position in the source code.
-*/
- var/codepos = 1
- var/line = 1
- var/linepos = 0 //column=codepos-linepos
- var/n_scriptOptions/nS_Options/options
- var/commenting = 0 /// 1 is a single-line comment, 2 is a multi-line comment
-/*
- Variable: ignore
- A list of characters that are ignored by the scanner.
-
- Default Value:
- Whitespace
-*/
- var/list/ignore = list(" ", "\t", "\n") //Don't add tokens for whitespace
-/*
- Variable: end_stmt
- A list of characters that end a statement. Each item may only be one character long.
-
- Default Value:
- Semicolon
-*/
- var/list/end_stmt = list(";")
-/*
- Variable: string_delim
- A list of characters that can start and end strings.
-
- Default Value:
- Double and single quotes.
-*/
- var/list/string_delim = list("\"", "'")
-/*
- Variable: delim
- A list of characters that denote the start of a new token. This list is automatically populated.
-*/
- var/list/delim = new
-
-/*
- Macro: COL
- The current column number.
-*/
- #define COL codepos-linepos
-
-/*
- Constructor: New
- Parameters:
- code - The source code to tokenize.
- options - An object used to configure the scanner.
-*/
-/n_Scanner/nS_Scanner/New(code, n_scriptOptions/nS_Options/options)
- .=..()
- ignore+= ascii2text(13) //Carriage return
- delim += ignore + options.symbols + end_stmt + string_delim
- src.options=options
- LoadCode(code)
-
-/n_Scanner/nS_Scanner/Scan() //Creates a list of tokens from source code
- var/list/tokens=new
- for(, src.codepos<=length(code), src.codepos++)
-
- var/char=copytext(code, codepos, codepos+1)
- if(char=="\n")
- line++
- linepos=codepos
-
- if(ignore.Find(char))
- continue
- else if(char == "/")
- ReadComment()
- else if(end_stmt.Find(char))
- tokens+=new /token/end(char, line, COL)
- else if(string_delim.Find(char))
- codepos++ //skip string delimiter
- tokens+=ReadString(char)
- else if(options.CanStartID(char))
- tokens+=ReadWord()
- else if(options.IsDigit(char))
- tokens+=ReadNumber()
- else if(options.symbols.Find(char))
- tokens+=ReadSymbol()
-
-
- codepos=initial(codepos)
- line=initial(line)
- linepos=initial(linepos)
- return tokens
-
-/*
- Proc: ReadString
- Reads a string in the source code into a token.
-
- Parameters:
- start - The character used to start the string.
-*/
-/n_Scanner/nS_Scanner/proc/ReadString(start)
- var/buf
- for(, codepos <= length(code), codepos++)//codepos to length(code))
- var/char=copytext(code, codepos, codepos+1)
- switch(char)
- if("\\") //Backslash (\) encountered in string
- codepos++ //Skip next character in string, since it was escaped by a backslash
- char=copytext(code, codepos, codepos+1)
- switch(char)
- if("\\") //Double backslash
- buf+="\\"
- if("n") //\n Newline
- buf+="\n"
- else
- if(char==start) //\" Doublequote
- buf+=start
- else //Unknown escaped text
- buf+=char
- if("\n")
- . = new/token/string(buf, line, COL)
- errors+=new/scriptError("Unterminated string. Newline reached.", .)
- line++
- linepos=codepos
- break
- else
- if(char==start) //string delimiter found, end string
- break
- else
- buf+=char //Just a normal character in a string
- if(!.) return new/token/string(buf, line, COL)
-
-/*
-Proc: ReadWord
-Reads characters separated by an item in into a token.
-*/
-/n_Scanner/nS_Scanner/proc/ReadWord()
- var/char=copytext(code, codepos, codepos+1)
- var/buf
- while(!delim.Find(char) && codepos<=length(code))
- buf+=char
- char=copytext(code, ++codepos, codepos+1)
- codepos-- //allow main Scan() proc to read the delimiter
- if(options.keywords.Find(buf))
- return new /token/keyword(buf, line, COL)
- else
- return new /token/word(buf, line, COL)
-
-/*
-Proc: ReadSymbol
-Reads a symbol into a token.
-*/
-/n_Scanner/nS_Scanner/proc/ReadSymbol()
- var/char=copytext(code, codepos, codepos+1)
- var/buf
-
- while(options.symbols.Find(buf+char))
- buf+=char
- if(++codepos>length(code)) break
- char=copytext(code, codepos, codepos+1)
-
- codepos-- //allow main Scan() proc to read the next character
- return new /token/symbol(buf, line, COL)
-
-/*
-Proc: ReadNumber
-Reads a number into a token.
-*/
-/n_Scanner/nS_Scanner/proc/ReadNumber()
- var/char=copytext(code, codepos, codepos+1)
- var/buf
- var/dec=0
-
- while(options.IsDigit(char) || (char=="." && !dec))
- if(char==".") dec=1
- buf+=char
- codepos++
- char=copytext(code, codepos, codepos+1)
- var/token/number/T=new(buf, line, COL)
- if(isnull(text2num(buf)))
- errors+=new/scriptError("Bad number: ", T)
- T.value=0
- codepos-- //allow main Scan() proc to read the next character
- return T
-
-/*
-Proc: ReadComment
-Reads a comment and outputs the type of comment
-*/
-
-/n_Scanner/nS_Scanner/proc/ReadComment()
- var/char=copytext(code, codepos, codepos+1)
- var/nextchar=copytext(code, codepos+1, codepos+2)
- var/charstring = char+nextchar
- var/comm = 1
- // 1: single-line comment
- // 2: multi-line comment
- var/expectedend = 0
-
- if(charstring == "//" || charstring == "/*")
- if(charstring == "/*")
- comm = 2 // starts a multi-line comment
-
- while(comm)
- if(++codepos>length(code)) break
-
- if(expectedend) // ending statement expected...
- char = copytext(code, codepos, codepos+1)
- if(char == "/") // ending statement found - beak the comment
- comm = 0
- break
-
- if(comm == 2)
- // multi-line comments are broken by ending statements
- char = copytext(code, codepos, codepos+1)
- if(char == "*")
- expectedend = 1
- continue
- else
- char = copytext(code, codepos, codepos+1)
- if(char == "\n")
- comm = 0
- break
-
- if(expectedend) expectedend = 0
-
- if(comm == 2)
- errors+=new/scriptError/UnterminatedComment()
-
diff --git a/code/modules/scripting/Scanner/Tokens.dm b/code/modules/scripting/Scanner/Tokens.dm
deleted file mode 100644
index 5068e97c5ac..00000000000
--- a/code/modules/scripting/Scanner/Tokens.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-/*
- Class: Token
- Represents an entity and position in the source code.
-*/
-/token
- var/value
- var/line
- var/column
-
-/token/New(v, l=0, c=0)
- value=v
- line=l
- column=c
-
-/token/string
-/token/symbol
-/token/word
-/token/keyword
-/token/number/New()
- .=..()
- if(!isnum(value))
- value=text2num(value)
- ASSERT(!isnull(value))
-/token/accessor
- var/object
- var/member
-
-/token/accessor/New(object, member, l=0, c=0)
- src.object=object
- src.member=member
- src.value="[object].[member]" //for debugging only
- src.line=l
- src.column=c
-
-/token/end
diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm
deleted file mode 100644
index 3c7fa52ac72..00000000000
--- a/code/modules/scripting/stack.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/stack
- var/list/contents=new
-/stack/proc/Push(value)
- contents+=value
-
-/stack/proc/Pop()
- if(!contents.len) return null
- . = contents[contents.len]
- contents.len--
-
-/stack/proc/Top() //returns the item on the top of the stack without removing it
- if(!contents.len) return null
- return contents[contents.len]
-
-/stack/proc/Copy()
- var/stack/S=new()
- S.contents=src.contents.Copy()
- return S
-
-/stack/proc/Clear()
- contents.Cut()
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 9428e9170f6..751ad22b961 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -816,7 +816,6 @@
#include "code\game\machinery\telecomms\server.dm"
#include "code\game\machinery\telecomms\telecomms.dm"
#include "code\game\machinery\telecomms\telemonitor.dm"
-#include "code\game\machinery\telecomms\traffic_control.dm"
#include "code\game\machinery\virtual_reality\ar_console.dm"
#include "code\game\machinery\virtual_reality\vr_console.dm"
#include "code\game\magic\Uristrunes.dm"
@@ -3062,26 +3061,6 @@
#include "code\modules\research\designs\circuits\ai_modules.dm"
#include "code\modules\research\designs\circuits\circuits.dm"
#include "code\modules\research\designs\circuits\disks.dm"
-#include "code\modules\scripting\Errors.dm"
-#include "code\modules\scripting\IDE.dm"
-#include "code\modules\scripting\Options.dm"
-#include "code\modules\scripting\stack.dm"
-#include "code\modules\scripting\AST\AST Nodes.dm"
-#include "code\modules\scripting\AST\Blocks.dm"
-#include "code\modules\scripting\AST\Statements.dm"
-#include "code\modules\scripting\AST\Operators\Binary Operators.dm"
-#include "code\modules\scripting\AST\Operators\Unary Operators.dm"
-#include "code\modules\scripting\Implementations\_Logic.dm"
-#include "code\modules\scripting\Implementations\Telecomms.dm"
-#include "code\modules\scripting\Interpreter\Evaluation.dm"
-#include "code\modules\scripting\Interpreter\Interaction.dm"
-#include "code\modules\scripting\Interpreter\Interpreter.dm"
-#include "code\modules\scripting\Interpreter\Scope.dm"
-#include "code\modules\scripting\Parser\Expressions.dm"
-#include "code\modules\scripting\Parser\Keywords.dm"
-#include "code\modules\scripting\Parser\Parser.dm"
-#include "code\modules\scripting\Scanner\Scanner.dm"
-#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\modules\shieldgen\directional_shield.dm"