diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2023-04-16 16:09:37 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2023-04-16 16:09:37 -0400 |
commit | 7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde (patch) | |
tree | 2e35e9166e01ead9e0bdddb1db9c3a18a2fa6266 /Archipelago | |
parent | 36eee0423e7f29e352c9c44d0ebb592007ec7436 (diff) | |
download | lingo-archipelago-7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde.tar.gz lingo-archipelago-7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde.tar.bz2 lingo-archipelago-7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde.zip |
Implemented color shuffle
Diffstat (limited to 'Archipelago')
-rw-r--r-- | Archipelago/client.gd | 20 | ||||
-rw-r--r-- | Archipelago/doorControl.gd | 3 | ||||
-rw-r--r-- | Archipelago/load.gd | 12 | ||||
-rw-r--r-- | Archipelago/painting_eye.gd | 3 | ||||
-rw-r--r-- | Archipelago/panel.gd | 39 | ||||
-rw-r--r-- | Archipelago/settings_screen.gd | 5 |
6 files changed, 78 insertions, 4 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 5b4d81e..8f20d0a 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
@@ -6,6 +6,9 @@ var ap_pass = "" | |||
6 | 6 | ||
7 | const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"} | 7 | const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"} |
8 | const orange_tower = ["Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"] | 8 | const orange_tower = ["Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"] |
9 | const color_items = [ | ||
10 | "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" | ||
11 | ] | ||
9 | 12 | ||
10 | var _client = WebSocketClient.new() | 13 | var _client = WebSocketClient.new() |
11 | var _last_state = WebSocketPeer.STATE_CLOSED | 14 | var _last_state = WebSocketPeer.STATE_CLOSED |
@@ -36,14 +39,18 @@ var _panel_ids_by_location = {} | |||
36 | var _localdata_file = "" | 39 | var _localdata_file = "" |
37 | var _death_link = false | 40 | var _death_link = false |
38 | var _victory_condition = 0 # THE END, THE MASTER | 41 | var _victory_condition = 0 # THE END, THE MASTER |
42 | var _door_shuffle = false | ||
43 | var _color_shuffle = false | ||
39 | 44 | ||
40 | var _map_loaded = false | 45 | var _map_loaded = false |
41 | var _held_items = [] | 46 | var _held_items = [] |
42 | var _held_locations = [] | 47 | var _held_locations = [] |
43 | var _last_new_item = -1 | 48 | var _last_new_item = -1 |
44 | var _tower_floors = 0 | 49 | var _tower_floors = 0 |
50 | var _has_colors = ["white"] | ||
45 | 51 | ||
46 | signal client_connected | 52 | signal client_connected |
53 | signal evaluate_solvability | ||
47 | 54 | ||
48 | 55 | ||
49 | func _init(): | 56 | func _init(): |
@@ -154,6 +161,10 @@ func _on_data(): | |||
154 | 161 | ||
155 | if _slot_data.has("victory_condition"): | 162 | if _slot_data.has("victory_condition"): |
156 | _victory_condition = _slot_data["victory_condition"] | 163 | _victory_condition = _slot_data["victory_condition"] |
164 | if _slot_data.has("shuffle_colors"): | ||
165 | _color_shuffle = _slot_data["shuffle_colors"] | ||
166 | if _slot_data.has("shuffle_doors"): | ||
167 | _door_shuffle = (_slot_data["shuffle_doors"] > 0) | ||
157 | 168 | ||
158 | _localdata_file = "user://archipelago/%s_%d" % [_seed, _slot] | 169 | _localdata_file = "user://archipelago/%s_%d" % [_seed, _slot] |
159 | var ap_file = File.new() | 170 | var ap_file = File.new() |
@@ -365,6 +376,9 @@ func completedGoal(): | |||
365 | 376 | ||
366 | func mapFinishedLoading(): | 377 | func mapFinishedLoading(): |
367 | if !_map_loaded: | 378 | if !_map_loaded: |
379 | _has_colors = ["white"] | ||
380 | emit_signal("evaluate_solvability") | ||
381 | |||
368 | for item in _held_items: | 382 | for item in _held_items: |
369 | processItem(item["item"], item["index"], item["from"]) | 383 | processItem(item["item"], item["index"], item["from"]) |
370 | 384 | ||
@@ -396,6 +410,12 @@ func processItem(item, index, from): | |||
396 | processItem(_item_name_to_id[subitem_name], null, null) | 410 | processItem(_item_name_to_id[subitem_name], null, null) |
397 | _tower_floors += 1 | 411 | _tower_floors += 1 |
398 | 412 | ||
413 | if _color_shuffle and color_items.has(_item_id_to_name[item]): | ||
414 | var lcol = _item_id_to_name[item].to_lower() | ||
415 | if not _has_colors.has(lcol): | ||
416 | _has_colors.append(lcol) | ||
417 | emit_signal("evaluate_solvability") | ||
418 | |||
399 | # Show a message about the item if it's new. | 419 | # Show a message about the item if it's new. |
400 | if index != null and index > _last_new_item: | 420 | if index != null and index > _last_new_item: |
401 | _last_new_item = index | 421 | _last_new_item = index |
diff --git a/Archipelago/doorControl.gd b/Archipelago/doorControl.gd index 011b0e0..f64f9e2 100644 --- a/Archipelago/doorControl.gd +++ b/Archipelago/doorControl.gd | |||
@@ -2,9 +2,8 @@ extends "res://scripts/doorControl.gd" | |||
2 | 2 | ||
3 | 3 | ||
4 | func handle_correct(): | 4 | func handle_correct(): |
5 | # TODO: Right now we are just assuming that door shuffle is on. | ||
6 | var apclient = global.get_node("Archipelago") | 5 | var apclient = global.get_node("Archipelago") |
7 | if apclient.doorIsVanilla(self.get_parent().name + "/" + self.name): | 6 | if not apclient._door_shuffle or apclient.doorIsVanilla(self.get_parent().name + "/" + self.name): |
8 | .handle_correct() | 7 | .handle_correct() |
9 | 8 | ||
10 | 9 | ||
diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 7b7e648..f9dc65f 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd | |||
@@ -38,6 +38,18 @@ func _load(): | |||
38 | "answer_correct", location, "handle_correct" | 38 | "answer_correct", location, "handle_correct" |
39 | ) | 39 | ) |
40 | 40 | ||
41 | # Attach a script to every panel so that we can do things like conditionally | ||
42 | # disable them. | ||
43 | var gamedata = apclient.get_node("Gamedata") | ||
44 | var panel_script = ResourceLoader.load("user://maps/Archipelago/panel.gd") | ||
45 | for panel in gamedata.panels: | ||
46 | var panel_node = panels_parent.get_node(panel["id"]) | ||
47 | var script_instance = panel_script.new() | ||
48 | script_instance.name = "AP_Panel" | ||
49 | script_instance.data = panel | ||
50 | panel_node.add_child(script_instance) | ||
51 | apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") | ||
52 | |||
41 | # Hook up the goal panel. | 53 | # Hook up the goal panel. |
42 | if apclient._victory_condition == 1: | 54 | if apclient._victory_condition == 1: |
43 | var the_master = self.get_node("Panels/Countdown Panels/Panel_master_master") | 55 | var the_master = self.get_node("Panels/Countdown Panels/Panel_master_master") |
diff --git a/Archipelago/painting_eye.gd b/Archipelago/painting_eye.gd index 86e0ce9..53d42b5 100644 --- a/Archipelago/painting_eye.gd +++ b/Archipelago/painting_eye.gd | |||
@@ -2,9 +2,8 @@ extends "res://scripts/painting_eye.gd" | |||
2 | 2 | ||
3 | 3 | ||
4 | func _answer_correct(): | 4 | func _answer_correct(): |
5 | # TODO: Right now we are just assuming that door shuffle is on. | ||
6 | var apclient = global.get_node("Archipelago") | 5 | var apclient = global.get_node("Archipelago") |
7 | if apclient.paintingIsVanilla(self.name): | 6 | if not apclient._door_shuffle or apclient.paintingIsVanilla(self.name): |
8 | ._answer_correct() | 7 | ._answer_correct() |
9 | 8 | ||
10 | 9 | ||
diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd new file mode 100644 index 0000000..6ec5e14 --- /dev/null +++ b/Archipelago/panel.gd | |||
@@ -0,0 +1,39 @@ | |||
1 | extends Node | ||
2 | |||
3 | var data = {} | ||
4 | var orig_text = "" | ||
5 | var orig_color = Color(0, 0, 0, 0) | ||
6 | |||
7 | |||
8 | func _ready(): | ||
9 | orig_text = self.get_parent().get_node("Viewport/GUI/Panel/Label").text | ||
10 | orig_color = self.get_parent().get_node("Quad").get_surface_material(0).albedo_color | ||
11 | |||
12 | |||
13 | func evaluate_solvability(): | ||
14 | var apclient = global.get_node("Archipelago") | ||
15 | |||
16 | var solvable = true | ||
17 | var missing = [] | ||
18 | |||
19 | if apclient._color_shuffle: | ||
20 | for color in data["color"]: | ||
21 | if not apclient._has_colors.has(color): | ||
22 | missing.append(color) | ||
23 | solvable = false | ||
24 | |||
25 | if solvable: | ||
26 | self.get_parent().get_node("Viewport/GUI/Panel/Label").text = orig_text | ||
27 | self.get_parent().get_node("Viewport/GUI/Panel/TextEdit").editable = true | ||
28 | self.get_parent().get_node("Quad").get_surface_material(0).albedo_color = orig_color | ||
29 | else: | ||
30 | var missing_text = "Missing: " | ||
31 | for thing in missing: | ||
32 | missing_text += thing + ",\n" | ||
33 | missing_text = missing_text.left(missing_text.length() - 2) | ||
34 | |||
35 | self.get_parent().get_node("Viewport/GUI/Panel/Label").text = missing_text | ||
36 | self.get_parent().get_node("Viewport/GUI/Panel/TextEdit").editable = false | ||
37 | self.get_parent().get_node("Quad").get_surface_material(0).albedo_color = Color( | ||
38 | 0.7, 0.2, 0.2 | ||
39 | ) | ||
diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 06bebd1..6700b9c 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd | |||
@@ -13,6 +13,11 @@ func _ready(): | |||
13 | apclient_instance.name = "Archipelago" | 13 | apclient_instance.name = "Archipelago" |
14 | global.add_child(apclient_instance) | 14 | global.add_child(apclient_instance) |
15 | 15 | ||
16 | var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") | ||
17 | var apdata_instance = apdata.new() | ||
18 | apdata_instance.name = "Gamedata" | ||
19 | apclient_instance.add_child(apdata_instance) | ||
20 | |||
16 | # Let's also inject any scripts we need to inject now. | 21 | # Let's also inject any scripts we need to inject now. |
17 | installScriptExtension("user://maps/Archipelago/doorControl.gd") | 22 | installScriptExtension("user://maps/Archipelago/doorControl.gd") |
18 | installScriptExtension("user://maps/Archipelago/load.gd") | 23 | installScriptExtension("user://maps/Archipelago/load.gd") |