diff options
-rw-r--r-- | CHANGELOG.md | 11 | ||||
-rw-r--r-- | README.md | 22 | ||||
-rw-r--r-- | client/archipelago.tscn | 153 | ||||
-rw-r--r-- | data/maps/daedalus/doors.txtpb | 1 | ||||
-rw-r--r-- | data/metadata.txtpb | 2 |
5 files changed, 187 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b92cfc..83b6d35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md | |||
@@ -1,5 +1,16 @@ | |||
1 | # lingo2-archipelago Releases | 1 | # lingo2-archipelago Releases |
2 | 2 | ||
3 | ## v7.0.2 - 2025-10-03 | ||
4 | |||
5 | - Fixed issue connecting to password-protected slots. | ||
6 | - Added instructions for using the client on Linux. | ||
7 | |||
8 | Download: | ||
9 | [lingo2.apworld](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.2/lingo2.apworld)<br/> | ||
10 | Template YAML: | ||
11 | [Lingo 2.yaml](https://files.fourisland.com/releases/lingo2-archipelago/apworld/v7.0.2/Lingo%202.yaml)<br/> | ||
12 | Source: [v7.0.2](https://code.fourisland.com/lingo2-archipelago/tag/?h=v7.0.2) | ||
13 | |||
3 | ## v7.0.1 - 2025-10-01 | 14 | ## v7.0.1 - 2025-10-01 |
4 | 15 | ||
5 | - Fixed logic error regarding the Plaza Entrance in The Repetitive. Going from | 16 | - Fixed logic error regarding the Plaza Entrance in The Repetitive. Going from |
diff --git a/README.md b/README.md index 2899e4a..4a522ac 100644 --- a/README.md +++ b/README.md | |||
@@ -18,7 +18,7 @@ part of an Archipelago multiworld game. | |||
18 | 3. Double click on `lingo2.apworld` to install it, or copy it manually to the | 18 | 3. Double click on `lingo2.apworld` to install it, or copy it manually to the |
19 | `custom_worlds` folder of your Archipelago installation. | 19 | `custom_worlds` folder of your Archipelago installation. |
20 | 20 | ||
21 | ## Joining a Multiworld game | 21 | ## Joining a Multiworld game (Windows) |
22 | 22 | ||
23 | 1. Open the Archipelago Launcher. | 23 | 1. Open the Archipelago Launcher. |
24 | 2. Select "Lingo 2 Client". | 24 | 2. Select "Lingo 2 Client". |
@@ -34,6 +34,26 @@ part of an Archipelago multiworld game. | |||
34 | 34 | ||
35 | To continue an earlier game, you can perform the exact same steps as above. | 35 | To continue an earlier game, you can perform the exact same steps as above. |
36 | 36 | ||
37 | ## Joining a Multiworld game (Non-Windows) | ||
38 | |||
39 | Lingo 2 only officially supports Windows, but has been known to work on Linux | ||
40 | using Proton. Archipelago can be played on a non-Windows system, but the process | ||
41 | is a little more complex. | ||
42 | |||
43 | 1. Download | ||
44 | [archipelago.tscn](https://code.fourisland.com/lingo2-archipelago/plain/client/archipelago.tscn) | ||
45 | and put it in your custom maps folder. You only have to do this once. | ||
46 | 2. Open Lingo 2, and select Archipelago from the level selection list. | ||
47 | 3. Put the path to your `lingo2.apworld` into the field provided. You only have | ||
48 | to do this once, as the game will remember what you put in. | ||
49 | 4. Click Start and wait for the connection settings screen to load. | ||
50 | 5. Open the Archipelago Launcher. | ||
51 | 6. Select "Lingo 2 Client". | ||
52 | 7. You should see "Connected to Lingo 2!" You can then return to Lingo 2 and | ||
53 | fill out your connection details. | ||
54 | 8. Press Connect. | ||
55 | 9. Enjoy! | ||
56 | |||
37 | ## Frequently Asked Questions | 57 | ## Frequently Asked Questions |
38 | 58 | ||
39 | ### Why aren't the starting room letters shuffled? | 59 | ### Why aren't the starting room letters shuffled? |
diff --git a/client/archipelago.tscn b/client/archipelago.tscn new file mode 100644 index 0000000..1c156a3 --- /dev/null +++ b/client/archipelago.tscn | |||
@@ -0,0 +1,153 @@ | |||
1 | [gd_scene load_steps=3 format=3 uid="uid://b5mj3cq2bcesd"] | ||
2 | |||
3 | [ext_resource type="Theme" uid="uid://7w454egydi41" path="res://assets/themes/baseUI.tres" id="1_mw3f1"] | ||
4 | |||
5 | [sub_resource id=2 type="GDScript"] | ||
6 | script/source = "extends Node2D | ||
7 | |||
8 | const CACHE_PATH = \"user://apworld_path.txt\" | ||
9 | |||
10 | |||
11 | func _ready(): | ||
12 | if FileAccess.file_exists(CACHE_PATH): | ||
13 | var file = FileAccess.open(CACHE_PATH, FileAccess.READ) | ||
14 | $Panel/HBoxContainer/LineEdit.text = file.get_as_text() | ||
15 | file.close() | ||
16 | |||
17 | |||
18 | func _browse_pressed(): | ||
19 | $FileDialog.popup_centered() | ||
20 | |||
21 | |||
22 | func _file_selected(path): | ||
23 | $Panel/HBoxContainer/LineEdit.text = path | ||
24 | |||
25 | |||
26 | func _start_pressed(): | ||
27 | var apworld_path = $Panel/HBoxContainer/LineEdit.text | ||
28 | |||
29 | if not FileAccess.file_exists(apworld_path): | ||
30 | $AcceptDialog.popup_centered() | ||
31 | return | ||
32 | |||
33 | var zip_reader = ZIPReader.new() | ||
34 | zip_reader.open(apworld_path) | ||
35 | |||
36 | var inner_path = \"lingo2/client/apworld_runtime.gd\" | ||
37 | if not zip_reader.file_exists(inner_path): | ||
38 | zip_reader.close() | ||
39 | $AcceptDialog.popup_centered() | ||
40 | return | ||
41 | |||
42 | var cache_file = FileAccess.open(CACHE_PATH, FileAccess.WRITE) | ||
43 | cache_file.store_string(apworld_path) | ||
44 | cache_file.close() | ||
45 | |||
46 | var runtime_script = GDScript.new() | ||
47 | runtime_script.source_code = zip_reader.read_file(inner_path).get_string_from_utf8() | ||
48 | runtime_script.reload() | ||
49 | |||
50 | zip_reader.close() | ||
51 | |||
52 | var runtime = runtime_script.new(apworld_path) | ||
53 | runtime.name = \"Runtime\" | ||
54 | |||
55 | global.add_child(runtime) | ||
56 | |||
57 | runtime.load_script_as_scene.call_deferred(\"settings_screen.gd\", \"settings_screen\") | ||
58 | |||
59 | |||
60 | func _quit_pressed(): | ||
61 | get_tree().change_scene_to_file(\"res://objects/scenes/menus/main_menu.tscn\") | ||
62 | |||
63 | " | ||
64 | |||
65 | [node name="Node2D" type="Node2D"] | ||
66 | script = SubResource( 2 ) | ||
67 | |||
68 | [node name="Panel" type="Panel" parent="."] | ||
69 | anchors_preset = -1 | ||
70 | offset_right = 1920.0 | ||
71 | offset_bottom = 1080.0 | ||
72 | |||
73 | [node name="Label" type="Label" parent="Panel"] | ||
74 | layout_mode = 1 | ||
75 | anchors_preset = -1 | ||
76 | offset_top = 75.0 | ||
77 | offset_right = 1920.0 | ||
78 | offset_bottom = 225.0 | ||
79 | theme = ExtResource("1_mw3f1") | ||
80 | text = "archipelago" | ||
81 | horizontal_alignment = 1 | ||
82 | vertical_alignment = 1 | ||
83 | |||
84 | [node name="Label2" type="Label" parent="Panel"] | ||
85 | layout_mode = 1 | ||
86 | anchors_preset = -1 | ||
87 | anchor_right = 1.0 | ||
88 | offset_left = 80.0 | ||
89 | offset_top = 300.0 | ||
90 | offset_right = -80.0 | ||
91 | offset_bottom = 388.0 | ||
92 | theme = ExtResource("1_mw3f1") | ||
93 | theme_override_font_sizes/font_size = 56 | ||
94 | text = "Put the path to your lingo2.apworld in the below field and click start. Then, open the archipelago launcher and click \"Lingo 2 Client\"." | ||
95 | horizontal_alignment = 1 | ||
96 | autowrap_mode = 3 | ||
97 | |||
98 | [node name="HBoxContainer" type="HBoxContainer" parent="Panel"] | ||
99 | layout_mode = 1 | ||
100 | anchors_preset = -1 | ||
101 | anchor_right = 1.0 | ||
102 | offset_left = 80.0 | ||
103 | offset_top = 595.0 | ||
104 | offset_right = -80.0 | ||
105 | offset_bottom = 755.0 | ||
106 | theme_override_constants/separation = 32 | ||
107 | |||
108 | [node name="LineEdit" type="LineEdit" parent="Panel/HBoxContainer"] | ||
109 | layout_mode = 2 | ||
110 | size_flags_horizontal = 3 | ||
111 | |||
112 | [node name="Button" type="Button" parent="Panel/HBoxContainer"] | ||
113 | layout_mode = 2 | ||
114 | theme = ExtResource("1_mw3f1") | ||
115 | text = "browse" | ||
116 | |||
117 | [node name="StartButton" type="Button" parent="Panel"] | ||
118 | layout_mode = 1 | ||
119 | anchors_preset = -1 | ||
120 | offset_left = 255.0 | ||
121 | offset_top = 875.0 | ||
122 | offset_right = 891.0 | ||
123 | offset_bottom = 1025.0 | ||
124 | theme = ExtResource("1_mw3f1") | ||
125 | text = "start" | ||
126 | |||
127 | [node name="QuitButton" type="Button" parent="Panel"] | ||
128 | layout_mode = 1 | ||
129 | anchors_preset = -1 | ||
130 | offset_left = 1102.0 | ||
131 | offset_top = 875.0 | ||
132 | offset_right = 1738.0 | ||
133 | offset_bottom = 1025.0 | ||
134 | theme = ExtResource("1_mw3f1") | ||
135 | text = "back" | ||
136 | |||
137 | [node name="FileDialog" type="FileDialog" parent="."] | ||
138 | title = "Open a File" | ||
139 | size = Vector2i(512, 512) | ||
140 | ok_button_text = "Open" | ||
141 | file_mode = 0 | ||
142 | access = 2 | ||
143 | filters = PackedStringArray("*.apworld;Archipelago Worlds") | ||
144 | show_hidden_files = true | ||
145 | use_native_dialog = true | ||
146 | |||
147 | [node name="AcceptDialog" type="AcceptDialog" parent="."] | ||
148 | dialog_text = "Could not open Lingo 2 apworld. Please check that the path is correct." | ||
149 | |||
150 | [connection signal="pressed" from="Panel/HBoxContainer/Button" to="." method="_browse_pressed"] | ||
151 | [connection signal="pressed" from="Panel/StartButton" to="." method="_start_pressed"] | ||
152 | [connection signal="pressed" from="Panel/QuitButton" to="." method="_quit_pressed"] | ||
153 | [connection signal="file_selected" from="FileDialog" to="." method="_file_selected"] | ||
diff --git a/data/maps/daedalus/doors.txtpb b/data/maps/daedalus/doors.txtpb index 6097e57..b6881b3 100644 --- a/data/maps/daedalus/doors.txtpb +++ b/data/maps/daedalus/doors.txtpb | |||
@@ -199,6 +199,7 @@ doors { | |||
199 | #receivers: "Components/Doors/Entry/entry_14" | 199 | #receivers: "Components/Doors/Entry/entry_14" |
200 | panels { room: "Welcome Back Area" name: "GREETINGS OLD FRIEND" } | 200 | panels { room: "Welcome Back Area" name: "GREETINGS OLD FRIEND" } |
201 | location_room: "Welcome Back Area" | 201 | location_room: "Welcome Back Area" |
202 | location_name: "GREETINGS OLD FRIEND" | ||
202 | } | 203 | } |
203 | # entry_3 is the door to SEAL, which we will ignore. | 204 | # entry_3 is the door to SEAL, which we will ignore. |
204 | doors { | 205 | doors { |
diff --git a/data/metadata.txtpb b/data/metadata.txtpb index c7dc650..233a97e 100644 --- a/data/metadata.txtpb +++ b/data/metadata.txtpb | |||
@@ -1,7 +1,7 @@ | |||
1 | version { | 1 | version { |
2 | major: 7 | 2 | major: 7 |
3 | minor: 0 | 3 | minor: 0 |
4 | patch: 1 | 4 | patch: 2 |
5 | } | 5 | } |
6 | # Filler item. | 6 | # Filler item. |
7 | special_names: "A Job Well Done" | 7 | special_names: "A Job Well Done" |