string KEY_COPY_TARGET = "copy_target"
bool Allow(string target, number level)
DisconnectAll()
number connection_target = Connect(target)
number TingrunnerAPI = supply_unwrapped([], "GetTypeOfThing")
number MemoryAPI = supply_unwrapped([], "LoadMemory")
array overrides = []
overrides["more_skip_types"] = ["key"]
number DoorAPI = supply_unwrapped(overrides, "Lock")
overrides["more_skip_types"] = ["taser"]
number connection_extractor = supply_unwrapped(overrides, "CopyToClipboard")
if TingrunnerAPI.GetTypeOfThing(target) == "door"
if MemoryAPI.LoadMemory("lock " + target)
DoorAPI.Unlock(target)
MemoryAPI.SaveMemory("lock " + target, false)
connection_target.Say(target + " unlocked.")
else
DoorAPI.Lock(target)
MemoryAPI.SaveMemory("lock " + target, true)
connection_target.Say(target + " locked.")
end
end
if MemoryAPI.HasMemory(KEY_COPY_TARGET)
if MemoryAPI.LoadMemory(KEY_COPY_TARGET)
connection_extractor.CopyToClipboard(target)
end
end
DisconnectAll()
return true
end
###############
# serde.sprak #
###############
string deserialise_string(string input)
string output = ""
bool escaped = false
loop character in input
if !escaped
if character == '\'
escaped = true
else if character != '"'
output += character
end
else
output += character
escaped = false
end
end
return output
end
bool is_digit(string input)
array digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
loop digits
if input == @
return true
end
end
return false
end
bool is_numeric(string character)
if is_digit(character)
return true
else if character == "-"
return true
else if character == "."
return true
else
return false
end
end
# Types:
# * 0: none
# * 1: bool
# * 2: number
# * 3: string
# * 4: array
array deserialise_array(string input)
array accumulator = []
bool in_string = false
bool escaped = false
bool in_value = false
string buffer = ""
number key_type = 0
bool key_bool = false
number key_number = 0
string key_string = ""
number value_type = 0
bool value_bool = false
number value_number = 0
string value_string = ""
array contexts = []
loop character in input
if character == '"'
if !in_string
in_string = true
if in_value
value_type = 3
else
key_type = 3
end
else if !escaped
in_string = false
else if in_value
value_string += '"'
else
key_string += '"'
end
else if character == "t"
if !in_string
if in_value
value_bool = true
value_type = 1
else
key_bool = true
key_type = 1
end
else if in_value
value_string += "t"
else
key_string += "t"
end
else if character == "f"
if !in_string
if in_value
value_bool = false
value_type = 1
else
key_bool = false
key_type = 1
end
else if in_value
value_string += "f"
else
key_string += "f"
end
else if character == ":"
if !in_string
in_value = true
if key_type == 2
key_number = buffer
buffer = ""
end
else if in_value
value_string += ":"
else
key_string += ":"
end
else if character == ","
if !in_string
if key_type == 2
if value_type == 3
accumulator[key_number] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_number] = value_number
else if value_type == 1
accumulator[key_number] = value_bool
end
else if key_type == 3
if value_type == 3
accumulator[key_string] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_string] = value_number
else if value_type == 1
accumulator[key_string] = value_bool
end
else if key_type == 1
if value_type == 3
accumulator[key_bool] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_bool] = value_number
else if value_type == 1
accumulator[key_bool] = value_bool
end
end
in_value = false
buffer = ""
key_string = ""
value_string = ""
else if in_value
value_string += ","
else
key_string += ","
end
else if is_numeric(character)
if !in_string
buffer += character
if in_value
value_type = 2
else
key_type = 2
end
else if in_value
value_string += character
else
key_string += character
end
else if character == "{"
if !in_string
if key_type == 2
Append(contexts, [accumulator, key_type, key_number])
else if key_type == 3
Append(contexts, [accumulator, key_type, key_string])
else if key_type == 0
Append(contexts, [accumulator, key_type])
else
Append(contexts, [accumulator, key_type, key_bool])
end
accumulator = []
in_string = false
escaped = false
in_value = false
buffer = ""
key_type = 0
key_bool = false
key_number = 0
key_string = ""
value_type = 0
value_bool = false
value_number = 0
value_string = ""
else
value_string += "{"
end
else if character == "}"
if !in_string
if key_type == 2
if value_type == 3
accumulator[key_number] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_number] = value_number
else if value_type == 1
accumulator[key_number] = value_bool
end
else if key_type == 3
if value_type == 3
accumulator[key_string] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_string] = value_number
else if value_type == 1
accumulator[key_string] = value_bool
end
else if key_type == 1
if value_type == 3
accumulator[key_bool] = value_string
else if value_type == 2
value_number = buffer
accumulator[key_bool] = value_number
else if value_type == 1
accumulator[key_bool] = value_bool
end
end
array last_context = contexts[Count(contexts) - 1]
array last_accumulator = last_context[0]
number last_key_type = last_context[1]
if last_key_type != 0
last_accumulator[last_context[2]] = accumulator
else
return accumulator
end
accumulator = last_accumulator
value_type = 4
Remove(contexts, Count(contexts) - 1)
else
value_string += "}"
end
else if character == "\"
if !escaped
escaped = true
else
escaped = false
if in_value
value_string += "\"
else
key_string += "\"
end
end
else if in_value
value_string += character
else
key_string += character
end
end
end
var deserialise(string input)
string head = input[0]
if head == "{"
return deserialise_array(input)
else if is_numeric(head)
number output = input
return output
else if head == '"'
return deserialise_string(input)
else if head == "t"
return true
else if head == "f"
return false
end
end
##################
# equality.sprak #
##################
bool equal_array(array first, array second)
if Count(first) == Count(second)
loop key in GetIndexes(first)
if !HasIndex(second, key)
return false
else if !equal(first[key], second[key])
return false
end
end
return true
end
return false
end
bool equal(var first, var second)
string type_first = Type(first)
if type_first == Type(second)
if type_first != "array"
return first == second
end
return equal_array(first, second)
end
return false
end
###############
# array.sprak #
###############
bool has(array arr, var element)
loop arr
if equal(@, element)
return true
end
end
return false
end
###############
# types.sprak #
###############
array Left(var input)
return [false, input]
end
array Right(var input)
return [true, input]
end
################
# supply.sprak #
################
array supplier_of(array overrides, string function)
string MemoryAPI_thing = "FinanceComputer"
string TingrunnerAPI_thing = "PoliceOfficeInterior_MinistryOfficeWorkstationComputer_1"
if HasIndex(overrides, "MemoryAPI")
MemoryAPI_thing = overrides["MemoryAPI"]
end
if HasIndex(overrides, "TingrunnerAPI")
TingrunnerAPI_thing = overrides["TingrunnerAPI"]
end
number MemoryAPI = Connect(MemoryAPI_thing)
number TingrunnerAPI = Connect(TingrunnerAPI_thing)
array skip_types = []
loop ["floppy", "navnode", "bed", "point", "seat", "locker", "memory", "portal", "character", "map", "suitcase", "goods"]
Append(skip_types, @)
end
array skip_things = []
loop ["ComputerTerminalBoard1_ComputerTerminalBoard1", "Hotel_Diner_Fountain", "TrainingCube", "Internet_Internet_MediumComputer_10", "Internet_MediumComputer", "ArcadeHall_ArcadeMachine_ArcadeMachine_3"]
Append(skip_things, @)
end
string load_buffer = ""
if !HasIndex(overrides, "skip_types")
if MemoryAPI.HasMemory("skip_types")
load_buffer = MemoryAPI.LoadMemory("skip_types")
RemoveAll(skip_types)
loop deserialise(load_buffer)
Append(skip_types, @)
end
end
else
RemoveAll(skip_types)
loop overrides["skip_types"]
Append(skip_types, @)
end
end
if !HasIndex(overrides, "skip_things")
if MemoryAPI.HasMemory("skip_things")
load_buffer = MemoryAPI.LoadMemory("skip_things")
RemoveAll(skip_things)
loop deserialise(load_buffer)
Append(skip_things, @)
end
end
else
RemoveAll(skip_things)
loop overrides["skip_things"]
Append(skip_things, @)
end
end
if HasIndex(overrides, "more_skip_types")
loop overrides["more_skip_types"]
if !has(skip_types, @)
Append(skip_types, @)
end
end
end
if HasIndex(overrides, "more_skip_things")
loop overrides["more_skip_things"]
if !has(skip_things, @)
Append(skip_things, @)
end
end
end
if MemoryAPI.HasMemory(function)
load_buffer = MemoryAPI.LoadMemory(function)
if !has(skip_things, load_buffer)
if !has(skip_types, TingrunnerAPI.GetTypeOfThing(load_buffer))
if Connect(load_buffer).HasFunction(function)
return Right(load_buffer)
end
end
end
end
load_buffer = ""
loop room in TingrunnerAPI.GetAllRooms()
loop thing in TingrunnerAPI.GetThingsInRoom(room)
if !has(skip_things, thing)
if !has(skip_types, TingrunnerAPI.GetTypeOfThing(thing))
if Connect(thing).HasFunction(function)
MemoryAPI.SaveMemory(function, thing)
return Right(thing)
end
end
end
end
end
return Left("`" + function + "` not found.")
end
array supply(array overrides, string function)
array array_buffer = supplier_of(overrides, function)
if array_buffer[0]
return Right(Connect(array_buffer[1]))
else
return Left(array_buffer[1])
end
end
number supply_unwrapped(array overrides, string function)
array array_buffer = supply(overrides, function)
return array_buffer[1]
end