From 95beaf55efe7f65ac6416f4fe08bd4f2f47f080e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 21 Apr 2024 14:27:03 -0400 Subject: Expand sphere 1 in door shuffle + no ECH --- Archipelago/client.gd | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8abc42c..6f5fefe 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -77,6 +77,7 @@ const kREARRANGE_PANELS = 1 const kCLASSIFICATION_LOCAL_NORMAL = 1 const kCLASSIFICATION_LOCAL_REDUCED = 2 const kCLASSIFICATION_LOCAL_INSANITY = 4 +const kCLASSIFICATION_LOCAL_SMALL_SPHERE_ONE = 8 const kCLASSIFICATION_REMOTE_NORMAL = 0 const kCLASSIFICATION_REMOTE_REDUCED = 1 @@ -282,8 +283,12 @@ func _on_data(): _victory_condition = _slot_data["victory_condition"] if _slot_data.has("shuffle_colors"): _color_shuffle = _slot_data["shuffle_colors"] + if _slot_data.has("shuffle_doors"): _door_shuffle = (_slot_data["shuffle_doors"] > 0) + else: + _door_shuffle = false + if _slot_data.has("shuffle_paintings"): _painting_shuffle = _slot_data["shuffle_paintings"] if _slot_data.has("shuffle_panels"): @@ -296,6 +301,7 @@ func _on_data(): _mastery_achievements = _slot_data["mastery_achievements"] if _slot_data.has("level_2_requirement"): _level_2_requirement = _slot_data["level_2_requirement"] + if _slot_data.has("location_checks"): if _slot_data["location_checks"] == kCLASSIFICATION_REMOTE_NORMAL: _location_classification_bit = kCLASSIFICATION_LOCAL_NORMAL @@ -303,8 +309,16 @@ func _on_data(): _location_classification_bit = kCLASSIFICATION_LOCAL_REDUCED elif _slot_data["location_checks"] == kCLASSIFICATION_REMOTE_INSANITY: _location_classification_bit = kCLASSIFICATION_LOCAL_INSANITY + else: + _location_classification_bit = kCLASSIFICATION_LOCAL_NORMAL + if _slot_data.has("early_color_hallways"): _early_color_hallways = _slot_data["early_color_hallways"] + else: + _early_color_hallways = false + + if _door_shuffle and not _early_color_hallways: + _location_classification_bit += kCLASSIFICATION_LOCAL_SMALL_SPHERE_ONE if track_player: setValue("PlayerPos", {"x": 0, "z": 0}) -- cgit 1.4.1 From 17d2b39d0dd2d94065fbe848e0dbf85e4a80ca66 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 15 May 2024 12:12:24 -0400 Subject: Send checked paintings to server --- Archipelago/client.gd | 31 ++++++++++++- Archipelago/mypainting.gd | 113 +++++++++++++++++++++++----------------------- 2 files changed, 85 insertions(+), 59 deletions(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 7903df2..0625c82 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -115,6 +115,7 @@ var _cached_slowness = 0 var _cached_iceland = 0 var _cached_atbash = 0 var _geronimo_skip = false +var _checked_paintings = [] signal could_not_connect signal connect_status @@ -356,6 +357,18 @@ func _on_data(): requestSync() + sendMessage( + [ + { + "cmd": "Set", + "key": "Lingo_%d_Paintings" % [_slot], + "default": [], + "want_reply": true, + "operations": [{"operation": "default", "value": []}] + } + ] + ) + emit_signal("client_connected") elif cmd == "ConnectionRefused": @@ -471,6 +484,10 @@ func _on_data(): # Return the player home. get_tree().get_root().get_node("Spatial/player/pause_menu")._reload() + elif cmd == "SetReply": + if message.has("key") and message["key"] == ("Lingo_%d_Paintings" % _slot): + _checked_paintings = message["value"] + func _process(_delta): if _should_process: @@ -625,13 +642,14 @@ func sendLocation(loc_id): _held_locations.append(loc_id) -func setValue(key, value): +func setValue(key, value, operation = "replace"): sendMessage( [ { "cmd": "Set", "key": "Lingo_%d_%s" % [_slot, key], - "operations": [{"operation": "replace", "value": value}] + "want_reply": false, + "operations": [{"operation": operation, "value": value}] } ] ) @@ -787,6 +805,15 @@ func geronimo(): saveLocaldata() +func checkPainting(painting_id): + if _checked_paintings.has(painting_id): + return + + _checked_paintings.append(painting_id) + + setValue("Paintings", [painting_id], "add") + + func colorForItemType(flags): var int_flags = int(flags) if int_flags & 1: # progression diff --git a/Archipelago/mypainting.gd b/Archipelago/mypainting.gd index 999b122..7aee434 100644 --- a/Archipelago/mypainting.gd +++ b/Archipelago/mypainting.gd @@ -30,66 +30,65 @@ func movePainting(): func _looked_at(body, painting): - if ( - target != null - and body.is_in_group("player") - and (painting.get_name() == self.get_parent().get_name()) - ): - var target_dir = _dir_to_int(target.orientation) - var source_dir = _dir_to_int(orientation) - var rotate = target_dir - source_dir - if rotate < 0: - rotate += 4 - rotate *= 90 + if body.is_in_group("player") and (painting.get_name() == self.get_parent().get_name()): + var apclient = global.get_node("Archipelago") + apclient.checkPainting(painting.get_name()) - var target_painting = target.get_parent() + if target != null: + var target_dir = _dir_to_int(target.orientation) + var source_dir = _dir_to_int(orientation) + var rotate = target_dir - source_dir + if rotate < 0: + rotate += 4 + rotate *= 90 - # this is ACW - if rotate == 0: - body.translation.x = ( - target_painting.translation.x + (body.translation.x - painting.translation.x) - ) - body.translation.y = ( - target_painting.translation.y + (body.translation.y - painting.translation.y) - ) - body.translation.z = ( - target_painting.translation.z + (body.translation.z - painting.translation.z) - ) - elif rotate == 180: - body.translation.x = ( - target_painting.translation.x - (body.translation.x - painting.translation.x) - ) - body.translation.y = ( - target_painting.translation.y + (body.translation.y - painting.translation.y) - ) - body.translation.z = ( - target_painting.translation.z - (body.translation.z - painting.translation.z) - ) - body.rotate_y(PI) - body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI) - elif rotate == 90: - var diff_x = body.translation.x - painting.translation.x - var diff_y = body.translation.y - painting.translation.y - var diff_z = body.translation.z - painting.translation.z - body.translation.x = target_painting.translation.x + diff_z - body.translation.y = target_painting.translation.y + diff_y - body.translation.z = target_painting.translation.z - diff_x - body.rotate_y(PI / 2) - body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI / 2) - elif rotate == 270: - var diff_x = body.translation.x - painting.translation.x - var diff_y = body.translation.y - painting.translation.y - var diff_z = body.translation.z - painting.translation.z - body.translation.x = target_painting.translation.x - diff_z - body.translation.y = target_painting.translation.y + diff_y - body.translation.z = target_painting.translation.z + diff_x - body.rotate_y(3 * PI / 2) - body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2) + var target_painting = target.get_parent() - var apclient = global.get_node("Archipelago") - if !apclient._pilgrimage_allows_paintings: - global.sunwarp = 1 - body.get_node("pivot/camera/sunwarp_background").visible = false + # this is ACW + if rotate == 0: + body.translation.x = ( + target_painting.translation.x + (body.translation.x - painting.translation.x) + ) + body.translation.y = ( + target_painting.translation.y + (body.translation.y - painting.translation.y) + ) + body.translation.z = ( + target_painting.translation.z + (body.translation.z - painting.translation.z) + ) + elif rotate == 180: + body.translation.x = ( + target_painting.translation.x - (body.translation.x - painting.translation.x) + ) + body.translation.y = ( + target_painting.translation.y + (body.translation.y - painting.translation.y) + ) + body.translation.z = ( + target_painting.translation.z - (body.translation.z - painting.translation.z) + ) + body.rotate_y(PI) + body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI) + elif rotate == 90: + var diff_x = body.translation.x - painting.translation.x + var diff_y = body.translation.y - painting.translation.y + var diff_z = body.translation.z - painting.translation.z + body.translation.x = target_painting.translation.x + diff_z + body.translation.y = target_painting.translation.y + diff_y + body.translation.z = target_painting.translation.z - diff_x + body.rotate_y(PI / 2) + body.velocity = body.velocity.rotated(Vector3(0, 1, 0), PI / 2) + elif rotate == 270: + var diff_x = body.translation.x - painting.translation.x + var diff_y = body.translation.y - painting.translation.y + var diff_z = body.translation.z - painting.translation.z + body.translation.x = target_painting.translation.x - diff_z + body.translation.y = target_painting.translation.y + diff_y + body.translation.z = target_painting.translation.z + diff_x + body.rotate_y(3 * PI / 2) + body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2) + + if !apclient._pilgrimage_allows_paintings: + global.sunwarp = 1 + body.get_node("pivot/camera/sunwarp_background").visible = false func _dir_to_int(dir): -- cgit 1.4.1 From 6c3cb6286ae94bc41d07d4886e93b2e7d2489a28 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 29 May 2024 13:27:48 -0400 Subject: Compatibility with not-unique IDs --- Archipelago/client.gd | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 7903df2..e89c156 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -80,6 +80,7 @@ var _team = 0 var _slot = 0 var _players = [] var _player_name_by_slot = {} +var _game_by_player = {} var _checked_locations = [] var _slot_data = {} var _paintings_mapping = {} @@ -256,6 +257,7 @@ func _on_data(): for player in _players: _player_name_by_slot[player["slot"]] = player["alias"] + _game_by_player[player["slot"]] = message["slot_info"][str(player["slot"])]["game"] _death_link = _slot_data.has("death_link") and _slot_data["death_link"] if _death_link: @@ -423,12 +425,14 @@ func _on_data(): continue var item_name = "Unknown" - if _item_id_to_name.has(message["item"]["item"]): - item_name = _item_id_to_name[message["item"]["item"]] + var item_player_game = _game_by_player[message["receiving"]] + if _item_id_to_name[item_player_game].has(message["item"]["item"]): + item_name = _item_id_to_name[item_player_game][message["item"]["item"]] var location_name = "Unknown" - if _location_id_to_name.has(message["item"]["location"]): - location_name = _location_id_to_name[message["item"]["location"]] + var location_player_game = _game_by_player[message["item"]["player"]] + if _location_id_to_name[location_player_game].has(message["item"]["location"]): + location_name = _location_id_to_name[location_player_game][message["item"]["location"]] var player_name = "Unknown" if _player_name_by_slot.has(message["receiving"]): @@ -578,12 +582,16 @@ func requestDatapackages(games): func processDatapackages(): _item_id_to_name = {} _location_id_to_name = {} - for package in _datapackages.values(): + for game in _datapackages.keys(): + var package = _datapackages[game] + + _item_id_to_name[game] = {} for name in package["item_name_to_id"].keys(): - _item_id_to_name[package["item_name_to_id"][name]] = name + _item_id_to_name[game][package["item_name_to_id"][name]] = name + _location_id_to_name[game] = {} for name in package["location_name_to_id"].keys(): - _location_id_to_name[package["location_name_to_id"][name]] = name + _location_id_to_name[game][package["location_name_to_id"][name]] = name if _datapackages.has("Lingo"): _item_name_to_id = _datapackages["Lingo"]["item_name_to_id"] @@ -672,8 +680,8 @@ func processItem(item, index, from, flags): var gamedata = $Gamedata var item_name = "Unknown" - if _item_id_to_name.has(item): - item_name = _item_id_to_name[item] + if _item_id_to_name["Lingo"].has(item): + item_name = _item_id_to_name["Lingo"][item] if gamedata.door_ids_by_item_id.has(int(item)): var doorsNode = get_tree().get_root().get_node("Spatial/Doors") @@ -711,8 +719,8 @@ func processItem(item, index, from, flags): processItem(subitem_id, null, null, null) _progressive_progress[int(item)] += 1 - if _color_shuffle and color_items.has(_item_id_to_name[item]): - var lcol = _item_id_to_name[item].to_lower() + if _color_shuffle and color_items.has(_item_id_to_name["Lingo"][item]): + var lcol = _item_id_to_name["Lingo"][item].to_lower() if not _has_colors.has(lcol): _has_colors.append(lcol) emit_signal("evaluate_solvability") -- cgit 1.4.1 From 2b0fcdde3144213676324163d721150a8641d610 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 29 May 2024 13:34:00 -0400 Subject: Gracefully handle corrupted data files --- Archipelago/client.gd | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index e89c156..bc952b9 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -133,6 +133,10 @@ func _init(): var data = file.get_var(true) file.close() + if typeof(data) != TYPE_ARRAY: + global._print("AP settings file is corrupted") + data = [] + if data.size() > 0: ap_server = data[0] if data.size() > 1: @@ -328,6 +332,10 @@ func _on_data(): var localdata = ap_file.get_var(true) ap_file.close() + if typeof(localdata) != TYPE_ARRAY: + global._print("AP localdata file is corrupted") + localdata = [] + if localdata.size() > 0: _last_new_item = localdata[0] else: -- cgit 1.4.1 From e973aead7d1e495f80ddc321ee634a91753cb03f Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 30 May 2024 13:25:13 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index bc952b9..11a97ce 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.0.1" +const my_version = "3.0.2" const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From a00c48bc492590c7a1fd9cf299ce19c1ba7ed2d9 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 2 Jun 2024 17:45:00 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 11a97ce..5840550 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.0.2" +const my_version = "3.0.3" const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 2db392b7fa29fb969bd69cb6f4db785a81b8cb48 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 6 Jun 2024 16:17:02 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 19fcee1..1966374 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.0.3" +const my_version = "3.1.0" const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 68cd752119b3c7bb04175b0373f8403e3a475c81 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 10 Jun 2024 00:09:02 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 1966374..aa2263a 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.1.0" +const my_version = "3.2.0" const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From d2581ee504710040483e971a40f2bcb25ae531e2 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 21 Jun 2024 19:33:01 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index aa2263a..e07fc46 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.2.0" +const my_version = "3.2.1" const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 0307d6409437b8440f6592d789e8a02713402205 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 1 Jul 2024 18:32:03 -0400 Subject: Bump version --- Archipelago/client.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8a15d03..916fd98 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,8 +18,8 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "3.2.1" -const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} +const my_version = "4.0.0" +const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" ] -- cgit 1.4.1 From d87c722f0ed1415d6e75fdbbaeb4080aa458932c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 2 Jul 2024 10:43:20 -0400 Subject: Fix proxy panels happening on panelsanity --- Archipelago/client.gd | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 916fd98..80f9bc1 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -330,7 +330,11 @@ func _on_data(): if _slot_data.has("sunwarp_permutation"): _sunwarp_mapping = _slot_data["sunwarp_permutation"] - if _door_shuffle and not _early_color_hallways: + if ( + _location_classification_bit != kCLASSIFICATION_LOCAL_INSANITY + and _door_shuffle + and not _early_color_hallways + ): _location_classification_bit += kCLASSIFICATION_LOCAL_SMALL_SPHERE_ONE if track_player: -- cgit 1.4.1 From e6cba32a5c6d9869912c97b48bc38dde44738f7e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 2 Jul 2024 10:43:39 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 80f9bc1..8921c3e 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.0.0" +const my_version = "4.0.1" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From c78ed66e4997da9ebf071deb257d38c5aa11eb6e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 14 Jul 2024 08:48:09 -0400 Subject: Fixed localdata not being reset for new slots --- Archipelago/client.gd | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8921c3e..7cc8645 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -343,6 +343,11 @@ func _on_data(): setValue("PlayerPos", null) _puzzle_skips = 0 + _last_new_item = -1 + _cached_slowness = 0 + _cached_iceland = 0 + _cached_atbash = 0 + _geronimo_skip = false _localdata_file = "user://archipelago_data/%s_%d" % [_seed, _slot] var ap_file = File.new() @@ -357,31 +362,21 @@ func _on_data(): if localdata.size() > 0: _last_new_item = localdata[0] - else: - _last_new_item = -1 if localdata.size() > 1: _puzzle_skips = localdata[1] if localdata.size() > 2: _cached_slowness = localdata[2] - else: - _cached_slowness = 0 if localdata.size() > 3: _cached_iceland = localdata[3] - else: - _cached_iceland = 0 if localdata.size() > 4: _cached_atbash = localdata[4] - else: - _cached_atbash = 0 if localdata.size() > 5: _geronimo_skip = localdata[5] - else: - _geronimo_skip = false requestSync() -- cgit 1.4.1 From eb750c48db3c3b195d585293d08b8b2ca3b0e091 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 14 Jul 2024 08:48:33 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Archipelago/client.gd') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 7cc8645..aa50069 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.0.1" +const my_version = "4.0.2" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1