diff options
Diffstat (limited to 'Archipelago')
| -rw-r--r-- | Archipelago/client.gd | 12 | ||||
| -rw-r--r-- | Archipelago/load.gd | 57 |
2 files changed, 68 insertions, 1 deletions
| diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8f20d0a..c5f1488 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
| @@ -10,6 +10,12 @@ const color_items = [ | |||
| 10 | "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" | 10 | "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" |
| 11 | ] | 11 | ] |
| 12 | 12 | ||
| 13 | const kTHE_END = 0 | ||
| 14 | const kTHE_MASTER = 1 | ||
| 15 | |||
| 16 | const kNO_PANEL_SHUFFLE = 0 | ||
| 17 | const kREARRANGE_PANELS = 1 | ||
| 18 | |||
| 13 | var _client = WebSocketClient.new() | 19 | var _client = WebSocketClient.new() |
| 14 | var _last_state = WebSocketPeer.STATE_CLOSED | 20 | var _last_state = WebSocketPeer.STATE_CLOSED |
| 15 | var _should_process = false | 21 | var _should_process = false |
| @@ -41,6 +47,8 @@ var _death_link = false | |||
| 41 | var _victory_condition = 0 # THE END, THE MASTER | 47 | var _victory_condition = 0 # THE END, THE MASTER |
| 42 | var _door_shuffle = false | 48 | var _door_shuffle = false |
| 43 | var _color_shuffle = false | 49 | var _color_shuffle = false |
| 50 | var _panel_shuffle = 0 # none, rearrange | ||
| 51 | var _slot_seed = 0 | ||
| 44 | 52 | ||
| 45 | var _map_loaded = false | 53 | var _map_loaded = false |
| 46 | var _held_items = [] | 54 | var _held_items = [] |
| @@ -165,6 +173,10 @@ func _on_data(): | |||
| 165 | _color_shuffle = _slot_data["shuffle_colors"] | 173 | _color_shuffle = _slot_data["shuffle_colors"] |
| 166 | if _slot_data.has("shuffle_doors"): | 174 | if _slot_data.has("shuffle_doors"): |
| 167 | _door_shuffle = (_slot_data["shuffle_doors"] > 0) | 175 | _door_shuffle = (_slot_data["shuffle_doors"] > 0) |
| 176 | if _slot_data.has("shuffle_panels"): | ||
| 177 | _panel_shuffle = _slot_data["shuffle_panels"] | ||
| 178 | if _slot_data.has("seed"): | ||
| 179 | _slot_seed = _slot_data["seed"] | ||
| 168 | 180 | ||
| 169 | _localdata_file = "user://archipelago/%s_%d" % [_seed, _slot] | 181 | _localdata_file = "user://archipelago/%s_%d" % [_seed, _slot] |
| 170 | var ap_file = File.new() | 182 | var ap_file = File.new() |
| diff --git a/Archipelago/load.gd b/Archipelago/load.gd index f9dc65f..47f51a6 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd | |||
| @@ -38,9 +38,60 @@ func _load(): | |||
| 38 | "answer_correct", location, "handle_correct" | 38 | "answer_correct", location, "handle_correct" |
| 39 | ) | 39 | ) |
| 40 | 40 | ||
| 41 | # Randomize the panels, if necessary. | ||
| 42 | var rng = RandomNumberGenerator.new() | ||
| 43 | rng.seed = apclient._slot_seed | ||
| 44 | |||
| 45 | var gamedata = apclient.get_node("Gamedata") | ||
| 46 | if apclient._panel_shuffle == apclient.kREARRANGE_PANELS: | ||
| 47 | var panel_pools = {} | ||
| 48 | for panel in gamedata.panels: | ||
| 49 | if not panel_pools.has(panel["tag"]): | ||
| 50 | panel_pools[panel["tag"]] = {} | ||
| 51 | var pool = panel_pools[panel["tag"]] | ||
| 52 | var subtag = "default" | ||
| 53 | if panel.has("subtag"): | ||
| 54 | subtag = panel["subtag"] | ||
| 55 | if not pool.has(subtag): | ||
| 56 | pool[subtag] = [] | ||
| 57 | |||
| 58 | var panel_node = panels_parent.get_node(panel["id"]) | ||
| 59 | pool[subtag].append( | ||
| 60 | { | ||
| 61 | "id": panel["id"], | ||
| 62 | "hint": panel_node.text, | ||
| 63 | "answer": panel_node.answer, | ||
| 64 | "link": panel["link"] | ||
| 65 | } | ||
| 66 | ) | ||
| 67 | |||
| 68 | for tag in panel_pools.keys(): | ||
| 69 | if tag == "forbid": | ||
| 70 | continue | ||
| 71 | |||
| 72 | var pool = panel_pools[tag] | ||
| 73 | for subtag in pool.keys(): | ||
| 74 | pool[subtag].sort_custom(self, "sort_by_link") | ||
| 75 | |||
| 76 | var count = pool[pool.keys()[0]].size() | ||
| 77 | var iota = range(0, count) | ||
| 78 | var order = [] | ||
| 79 | while not iota.empty(): | ||
| 80 | var i = rng.randi_range(0, iota.size() - 1) | ||
| 81 | order.append(iota[i]) | ||
| 82 | iota.remove(i) | ||
| 83 | |||
| 84 | for subtag in pool.keys(): | ||
| 85 | for i in range(0, count): | ||
| 86 | var source = pool[subtag][i] | ||
| 87 | var target = pool[subtag][order[i]] | ||
| 88 | var target_panel_node = panels_parent.get_node(target["id"]) | ||
| 89 | |||
| 90 | target_panel_node.text = source["hint"] | ||
| 91 | target_panel_node.answer = source["answer"] | ||
| 92 | |||
| 41 | # Attach a script to every panel so that we can do things like conditionally | 93 | # Attach a script to every panel so that we can do things like conditionally |
| 42 | # disable them. | 94 | # disable them. |
| 43 | var gamedata = apclient.get_node("Gamedata") | ||
| 44 | var panel_script = ResourceLoader.load("user://maps/Archipelago/panel.gd") | 95 | var panel_script = ResourceLoader.load("user://maps/Archipelago/panel.gd") |
| 45 | for panel in gamedata.panels: | 96 | for panel in gamedata.panels: |
| 46 | var panel_node = panels_parent.get_node(panel["id"]) | 97 | var panel_node = panels_parent.get_node(panel["id"]) |
| @@ -75,3 +126,7 @@ func _load(): | |||
| 75 | # Process any items received while the map was loading, and send the checks | 126 | # Process any items received while the map was loading, and send the checks |
| 76 | # from the save load. | 127 | # from the save load. |
| 77 | apclient.mapFinishedLoading() | 128 | apclient.mapFinishedLoading() |
| 129 | |||
| 130 | |||
| 131 | func sort_by_link(a, b): | ||
| 132 | return a["link"] < b["link"] | ||
