about summary refs log tree commit diff stats
path: root/Archipelago
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2023-04-16 16:09:37 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2023-04-16 16:09:37 -0400
commit7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde (patch)
tree2e35e9166e01ead9e0bdddb1db9c3a18a2fa6266 /Archipelago
parent36eee0423e7f29e352c9c44d0ebb592007ec7436 (diff)
downloadlingo-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.gd20
-rw-r--r--Archipelago/doorControl.gd3
-rw-r--r--Archipelago/load.gd12
-rw-r--r--Archipelago/painting_eye.gd3
-rw-r--r--Archipelago/panel.gd39
-rw-r--r--Archipelago/settings_screen.gd5
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
7const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"} 7const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"}
8const orange_tower = ["Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"] 8const orange_tower = ["Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"]
9const color_items = [
10 "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow"
11]
9 12
10var _client = WebSocketClient.new() 13var _client = WebSocketClient.new()
11var _last_state = WebSocketPeer.STATE_CLOSED 14var _last_state = WebSocketPeer.STATE_CLOSED
@@ -36,14 +39,18 @@ var _panel_ids_by_location = {}
36var _localdata_file = "" 39var _localdata_file = ""
37var _death_link = false 40var _death_link = false
38var _victory_condition = 0 # THE END, THE MASTER 41var _victory_condition = 0 # THE END, THE MASTER
42var _door_shuffle = false
43var _color_shuffle = false
39 44
40var _map_loaded = false 45var _map_loaded = false
41var _held_items = [] 46var _held_items = []
42var _held_locations = [] 47var _held_locations = []
43var _last_new_item = -1 48var _last_new_item = -1
44var _tower_floors = 0 49var _tower_floors = 0
50var _has_colors = ["white"]
45 51
46signal client_connected 52signal client_connected
53signal evaluate_solvability
47 54
48 55
49func _init(): 56func _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
366func mapFinishedLoading(): 377func 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
4func handle_correct(): 4func 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
4func _answer_correct(): 4func _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 @@
1extends Node
2
3var data = {}
4var orig_text = ""
5var orig_color = Color(0, 0, 0, 0)
6
7
8func _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
13func 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")