############### # 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 string supplier_of_unwrapped(array overrides, string function) array array_buffer = supplier_of(overrides, function) return array_buffer[1] 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