diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2023-08-03 21:57:04 -0400 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2023-08-03 21:57:04 -0400 |
commit | a3cc416a21297747b412dabe75fc4532cd5c8d68 (patch) | |
tree | 1eeb76f7e3d7463c133b2ce36aeab59787ee3943 | |
parent | cb6db408f38338edb451f323d7e5aa2856854d15 (diff) | |
download | lingo-archipelago-a3cc416a21297747b412dabe75fc4532cd5c8d68.tar.gz lingo-archipelago-a3cc416a21297747b412dabe75fc4532cd5c8d68.tar.bz2 lingo-archipelago-a3cc416a21297747b412dabe75fc4532cd5c8d68.zip |
Puzzle skips
-rw-r--r-- | Archipelago/client.gd | 12 | ||||
-rw-r--r-- | Archipelago/effects.gd | 59 | ||||
-rw-r--r-- | Archipelago/panel.gd | 3 | ||||
-rw-r--r-- | Archipelago/panelInput.gd | 21 | ||||
-rw-r--r-- | Archipelago/player.gd | 24 | ||||
-rw-r--r-- | Archipelago/settings_screen.gd | 1 |
6 files changed, 118 insertions, 2 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index e3b2c89..f0a4d2e 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
@@ -92,6 +92,7 @@ var _last_new_item = -1 | |||
92 | var _progressive_progress = {} | 92 | var _progressive_progress = {} |
93 | var _has_colors = ["white"] | 93 | var _has_colors = ["white"] |
94 | var _received_indexes = [] | 94 | var _received_indexes = [] |
95 | var _puzzle_skips = 0 | ||
95 | 96 | ||
96 | signal could_not_connect | 97 | signal could_not_connect |
97 | signal connect_status | 98 | signal connect_status |
@@ -539,6 +540,7 @@ func mapFinishedLoading(): | |||
539 | _received_indexes.clear() | 540 | _received_indexes.clear() |
540 | _progressive_progress.clear() | 541 | _progressive_progress.clear() |
541 | _has_colors = ["white"] | 542 | _has_colors = ["white"] |
543 | _puzzle_skips = 0 | ||
542 | emit_signal("evaluate_solvability") | 544 | emit_signal("evaluate_solvability") |
543 | 545 | ||
544 | for item in _held_items: | 546 | for item in _held_items: |
@@ -632,6 +634,8 @@ func processItem(item, index, from, flags): | |||
632 | effects_node.trigger_iceland_trap() | 634 | effects_node.trigger_iceland_trap() |
633 | if item_name == "Atbash Trap": | 635 | if item_name == "Atbash Trap": |
634 | effects_node.trigger_atbash_trap() | 636 | effects_node.trigger_atbash_trap() |
637 | if item_name == "Puzzle Skip": | ||
638 | _puzzle_skips += 1 | ||
635 | 639 | ||
636 | 640 | ||
637 | func doorIsVanilla(door): | 641 | func doorIsVanilla(door): |
@@ -646,6 +650,14 @@ func evaluateSolvability(): | |||
646 | emit_signal("evaluate_solvability") | 650 | emit_signal("evaluate_solvability") |
647 | 651 | ||
648 | 652 | ||
653 | func getAvailablePuzzleSkips(): | ||
654 | return _puzzle_skips | ||
655 | |||
656 | |||
657 | func usePuzzleSkip(): | ||
658 | _puzzle_skips -= 1 | ||
659 | |||
660 | |||
649 | func colorForItemType(flags): | 661 | func colorForItemType(flags): |
650 | var int_flags = int(flags) | 662 | var int_flags = int(flags) |
651 | if int_flags & 1: # progression | 663 | if int_flags & 1: # progression |
diff --git a/Archipelago/effects.gd b/Archipelago/effects.gd index 80eaa9c..3d6e036 100644 --- a/Archipelago/effects.gd +++ b/Archipelago/effects.gd | |||
@@ -6,6 +6,10 @@ var slowness_remaining = 0 | |||
6 | var iceland_remaining = 0 | 6 | var iceland_remaining = 0 |
7 | var atbash_activated = false | 7 | var atbash_activated = false |
8 | var queued_iceland = 0 | 8 | var queued_iceland = 0 |
9 | var skip_available = false | ||
10 | var puzzle_focused = false | ||
11 | var solve_mode = false | ||
12 | var puzzle_to_skip = "" | ||
9 | 13 | ||
10 | var orig_env | 14 | var orig_env |
11 | var orig_walk | 15 | var orig_walk |
@@ -90,13 +94,66 @@ func deactivate_atbash_trap(): | |||
90 | apclient.evaluateSolvability() | 94 | apclient.evaluateSolvability() |
91 | 95 | ||
92 | 96 | ||
97 | func show_puzzle_skip_message(node_path): | ||
98 | var panel_input = get_tree().get_root().get_node(node_path) | ||
99 | if not panel_input.visible: | ||
100 | return | ||
101 | |||
102 | var ap_panel = panel_input.get_parent().get_parent().get_parent().get_parent().get_node( | ||
103 | "AP_Panel" | ||
104 | ) | ||
105 | if not ap_panel.solvable: | ||
106 | return | ||
107 | |||
108 | puzzle_focused = true | ||
109 | puzzle_to_skip = node_path | ||
110 | _evaluate_puzzle_skip() | ||
111 | |||
112 | |||
113 | func hide_puzzle_skip_message(): | ||
114 | puzzle_focused = false | ||
115 | _evaluate_puzzle_skip() | ||
116 | |||
117 | |||
118 | func enter_solve_mode(): | ||
119 | solve_mode = true | ||
120 | _evaluate_puzzle_skip() | ||
121 | |||
122 | |||
123 | func exit_solve_mode(): | ||
124 | solve_mode = false | ||
125 | _evaluate_puzzle_skip() | ||
126 | |||
127 | |||
128 | func skip_puzzle(): | ||
129 | if not solve_mode and puzzle_focused: | ||
130 | var apclient = global.get_node("Archipelago") | ||
131 | if apclient.getAvailablePuzzleSkips() > 0: | ||
132 | apclient.usePuzzleSkip() | ||
133 | get_tree().get_root().get_node(puzzle_to_skip).complete() | ||
134 | |||
135 | |||
136 | func _evaluate_puzzle_skip(): | ||
137 | if puzzle_focused and not solve_mode: | ||
138 | skip_available = true | ||
139 | |||
140 | if not effect_running: | ||
141 | _process_effects() | ||
142 | else: | ||
143 | skip_available = false | ||
144 | |||
145 | |||
93 | func _process_effects(): | 146 | func _process_effects(): |
94 | effect_running = true | 147 | effect_running = true |
95 | 148 | ||
96 | while slowness_remaining > 0 or iceland_remaining > 0 or atbash_activated: | 149 | while slowness_remaining > 0 or iceland_remaining > 0 or atbash_activated or skip_available: |
97 | var text = "" | 150 | var text = "" |
98 | if atbash_activated: | 151 | if atbash_activated: |
99 | text += "Atbash Trap lasts until you solve a puzzle" | 152 | text += "Atbash Trap lasts until you solve a puzzle" |
153 | if skip_available: | ||
154 | var apclient = global.get_node("Archipelago") | ||
155 | if apclient.getAvailablePuzzleSkips() > 0: | ||
156 | text += "Press P to skip puzzle (%d available)" % apclient.getAvailablePuzzleSkips() | ||
100 | if slowness_remaining > 0: | 157 | if slowness_remaining > 0: |
101 | if not text.empty(): | 158 | if not text.empty(): |
102 | text += "\n" | 159 | text += "\n" |
diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd index da11ddd..da5b572 100644 --- a/Archipelago/panel.gd +++ b/Archipelago/panel.gd | |||
@@ -4,6 +4,7 @@ var data = {} | |||
4 | var orig_text = "" | 4 | var orig_text = "" |
5 | var atbash_text = "" | 5 | var atbash_text = "" |
6 | var orig_color = Color(0, 0, 0, 0) | 6 | var orig_color = Color(0, 0, 0, 0) |
7 | var solvable = true | ||
7 | 8 | ||
8 | const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" | 9 | const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" |
9 | const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" | 10 | const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" |
@@ -35,7 +36,7 @@ func evaluate_solvability(): | |||
35 | var apclient = global.get_node("Archipelago") | 36 | var apclient = global.get_node("Archipelago") |
36 | var effects = get_tree().get_root().get_node("Spatial/AP_Effects") | 37 | var effects = get_tree().get_root().get_node("Spatial/AP_Effects") |
37 | 38 | ||
38 | var solvable = true | 39 | solvable = true |
39 | var missing = [] | 40 | var missing = [] |
40 | 41 | ||
41 | if apclient._color_shuffle: | 42 | if apclient._color_shuffle: |
diff --git a/Archipelago/panelInput.gd b/Archipelago/panelInput.gd index 48d6324..346dccb 100644 --- a/Archipelago/panelInput.gd +++ b/Archipelago/panelInput.gd | |||
@@ -3,3 +3,24 @@ extends "res://scripts/panelInput.gd" | |||
3 | 3 | ||
4 | func uncomplete(): | 4 | func uncomplete(): |
5 | global._print("Filtered out panel uncompletion") | 5 | global._print("Filtered out panel uncompletion") |
6 | |||
7 | |||
8 | func grab_focus(): | ||
9 | .grab_focus() | ||
10 | |||
11 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
12 | effects_node.show_puzzle_skip_message(get_path()) | ||
13 | |||
14 | |||
15 | func release_focus(): | ||
16 | .release_focus() | ||
17 | |||
18 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
19 | effects_node.hide_puzzle_skip_message() | ||
20 | |||
21 | |||
22 | func complete(): | ||
23 | .complete() | ||
24 | |||
25 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
26 | effects_node.hide_puzzle_skip_message() | ||
diff --git a/Archipelago/player.gd b/Archipelago/player.gd new file mode 100644 index 0000000..87d9d0c --- /dev/null +++ b/Archipelago/player.gd | |||
@@ -0,0 +1,24 @@ | |||
1 | extends "res://scripts/player.gd" | ||
2 | |||
3 | |||
4 | func _solving(): | ||
5 | ._solving() | ||
6 | |||
7 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
8 | effects_node.enter_solve_mode() | ||
9 | |||
10 | |||
11 | func _solvingEnd(): | ||
12 | ._solvingEnd() | ||
13 | |||
14 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
15 | effects_node.exit_solve_mode() | ||
16 | |||
17 | |||
18 | func _unhandled_input(event): | ||
19 | ._unhandled_input(event) | ||
20 | |||
21 | if event is InputEventKey: | ||
22 | if event.pressed and event.scancode == KEY_P: | ||
23 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | ||
24 | effects_node.skip_puzzle() | ||
diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 130506b..3f56962 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd | |||
@@ -31,6 +31,7 @@ func _ready(): | |||
31 | installScriptExtension("user://maps/Archipelago/panelEnd.gd") | 31 | installScriptExtension("user://maps/Archipelago/panelEnd.gd") |
32 | installScriptExtension("user://maps/Archipelago/panelInput.gd") | 32 | installScriptExtension("user://maps/Archipelago/panelInput.gd") |
33 | installScriptExtension("user://maps/Archipelago/pause_menu.gd") | 33 | installScriptExtension("user://maps/Archipelago/pause_menu.gd") |
34 | installScriptExtension("user://maps/Archipelago/player.gd") | ||
34 | installScriptExtension("user://maps/Archipelago/worldTransporter.gd") | 35 | installScriptExtension("user://maps/Archipelago/worldTransporter.gd") |
35 | 36 | ||
36 | var apclient = global.get_node("Archipelago") | 37 | var apclient = global.get_node("Archipelago") |