diff options
-rw-r--r-- | Archipelago/client.gd | 18 | ||||
-rw-r--r-- | Archipelago/load.gd | 47 | ||||
-rw-r--r-- | Archipelago/player.gd | 15 | ||||
-rw-r--r-- | Archipelago/settings_screen.gd | 7 | ||||
-rw-r--r-- | CHANGELOG.md | 9 |
5 files changed, 92 insertions, 4 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 58a099c..1ba52d7 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
@@ -128,6 +128,7 @@ var _puzzle_skips = 0 | |||
128 | var _cached_slowness = 0 | 128 | var _cached_slowness = 0 |
129 | var _cached_iceland = 0 | 129 | var _cached_iceland = 0 |
130 | var _cached_atbash = 0 | 130 | var _cached_atbash = 0 |
131 | var _geronimo_skip = false | ||
131 | 132 | ||
132 | signal could_not_connect | 133 | signal could_not_connect |
133 | signal connect_status | 134 | signal connect_status |
@@ -329,6 +330,11 @@ func _on_data(): | |||
329 | else: | 330 | else: |
330 | _cached_atbash = 0 | 331 | _cached_atbash = 0 |
331 | 332 | ||
333 | if localdata.size() > 5: | ||
334 | _geronimo_skip = localdata[5] | ||
335 | else: | ||
336 | _geronimo_skip = false | ||
337 | |||
332 | requestSync() | 338 | requestSync() |
333 | 339 | ||
334 | emit_signal("client_connected") | 340 | emit_signal("client_connected") |
@@ -488,7 +494,8 @@ func saveLocaldata(): | |||
488 | _puzzle_skips, | 494 | _puzzle_skips, |
489 | effects_node.slowness_remaining, | 495 | effects_node.slowness_remaining, |
490 | effects_node.iceland_remaining, | 496 | effects_node.iceland_remaining, |
491 | effects_node.atbash_remaining | 497 | effects_node.atbash_remaining, |
498 | _geronimo_skip | ||
492 | ] | 499 | ] |
493 | file.store_var(data, true) | 500 | file.store_var(data, true) |
494 | file.close() | 501 | file.close() |
@@ -733,6 +740,15 @@ func usePuzzleSkip(): | |||
733 | saveLocaldata() | 740 | saveLocaldata() |
734 | 741 | ||
735 | 742 | ||
743 | func geronimo(): | ||
744 | if !_geronimo_skip: | ||
745 | messages.showMessage("Geronimo! You found a puzzle skip.") | ||
746 | |||
747 | _puzzle_skips += 1 | ||
748 | _geronimo_skip = true | ||
749 | saveLocaldata() | ||
750 | |||
751 | |||
736 | func colorForItemType(flags): | 752 | func colorForItemType(flags): |
737 | var int_flags = int(flags) | 753 | var int_flags = int(flags) |
738 | if int_flags & 1: # progression | 754 | if int_flags & 1: # progression |
diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 59d2ac2..566ee39 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd | |||
@@ -25,6 +25,11 @@ func _load(): | |||
25 | var apclient = global.get_node("Archipelago") | 25 | var apclient = global.get_node("Archipelago") |
26 | var panels_parent = self.get_node("Panels") | 26 | var panels_parent = self.get_node("Panels") |
27 | 27 | ||
28 | var date = Time.get_date_dict_from_system() | ||
29 | var april_fools = false | ||
30 | if date["month"] == 4 && date["day"] == 1: | ||
31 | april_fools = true | ||
32 | |||
28 | # Add a wall-blocked raycast to the player. | 33 | # Add a wall-blocked raycast to the player. |
29 | var wallcast = RayCast.new() | 34 | var wallcast = RayCast.new() |
30 | wallcast.name = "wallcast" | 35 | wallcast.name = "wallcast" |
@@ -64,7 +69,7 @@ func _load(): | |||
64 | wanderer_entrance.rotation = Vector3(0, -PI / 2, 0) | 69 | wanderer_entrance.rotation = Vector3(0, -PI / 2, 0) |
65 | wanderer_entrance.scale = Vector3(1, 1.5, 1) | 70 | wanderer_entrance.scale = Vector3(1, 1.5, 1) |
66 | wanderer_entrance.set_script(door_script) | 71 | wanderer_entrance.set_script(door_script) |
67 | wanderer_entrance.panels.append("../../../Panels/Tower Room/Panel_wanderlust_1234567890") | 72 | wanderer_entrance.panels = ["../../../Panels/Tower Room/Panel_wanderlust_1234567890"] |
68 | get_node("Doors/Tower Room Area Doors").add_child(wanderer_entrance) | 73 | get_node("Doors/Tower Room Area Doors").add_child(wanderer_entrance) |
69 | 74 | ||
70 | var wanderer_achieve = get_node("Panels/Tower Room/Panel_1234567890_wanderlust") | 75 | var wanderer_achieve = get_node("Panels/Tower Room/Panel_1234567890_wanderlust") |
@@ -418,6 +423,8 @@ func _load(): | |||
418 | if not classes.has(painting): | 423 | if not classes.has(painting): |
419 | var i = rng.randi_range(0, all_paintings.size() - 1) | 424 | var i = rng.randi_range(0, all_paintings.size() - 1) |
420 | var chosen = all_paintings[i] | 425 | var chosen = all_paintings[i] |
426 | if april_fools: | ||
427 | chosen = "bg_notnerb" | ||
421 | classes[painting] = chosen | 428 | classes[painting] = chosen |
422 | all_paintings.remove(i) | 429 | all_paintings.remove(i) |
423 | 430 | ||
@@ -442,6 +449,9 @@ func _load(): | |||
442 | var j = rng.randi_range(0, all_paintings.size() - 1) | 449 | var j = rng.randi_range(0, all_paintings.size() - 1) |
443 | remaining.append(all_paintings[j]) | 450 | remaining.append(all_paintings[j]) |
444 | all_paintings.remove(j) | 451 | all_paintings.remove(j) |
452 | |||
453 | if april_fools: | ||
454 | remaining = ["bg_notnerb"] | ||
445 | 455 | ||
446 | for painting in gamedata.paintings.keys(): | 456 | for painting in gamedata.paintings.keys(): |
447 | if randomized.has(painting): | 457 | if randomized.has(painting): |
@@ -449,6 +459,26 @@ func _load(): | |||
449 | 459 | ||
450 | var chosen_painting = remaining[rng.randi_range(0, remaining.size() - 1)] | 460 | var chosen_painting = remaining[rng.randi_range(0, remaining.size() - 1)] |
451 | instantiate_painting(painting, chosen_painting) | 461 | instantiate_painting(painting, chosen_painting) |
462 | |||
463 | # Replace the roof of The Artistic. | ||
464 | var artistic_paintings = [ | ||
465 | ["smile_painting_9", -49.5, 44.5], | ||
466 | ["cherry_painting3", -38.5, 44.5], | ||
467 | ["boxes_painting2", -38.5, 55.5], | ||
468 | ["panda_painting_3", -49.5, 55.5] | ||
469 | ] | ||
470 | for painting in artistic_paintings: | ||
471 | var painting_node = get_node("AP_Paintings").get_node(painting[0]).get_node("GridMap") | ||
472 | var small_mesh_library = painting_node.mesh_library | ||
473 | |||
474 | for x in range(0,10): | ||
475 | for y in range(0,10): | ||
476 | var cellitem = painting_node.get_cell_item(-5 + x, 1+y, 0) | ||
477 | var meshitem = small_mesh_library.get_item_name(cellitem) | ||
478 | if meshitem.begins_with("Tiny"): | ||
479 | meshitem = meshitem.substr(4) | ||
480 | set_gridmap_tile(painting[1]+9-y, 8.5, painting[2]+x, meshitem) | ||
481 | |||
452 | 482 | ||
453 | # We need to make some changes to the Art Gallery. The player should always | 483 | # We need to make some changes to the Art Gallery. The player should always |
454 | # have access to the backroom, but they shouldn't have access to ORDER until | 484 | # have access to the backroom, but they shouldn't have access to ORDER until |
@@ -569,6 +599,17 @@ func _load(): | |||
569 | var multiplayer_node = apclient.SCRIPT_multiplayer.new() | 599 | var multiplayer_node = apclient.SCRIPT_multiplayer.new() |
570 | multiplayer_node.ghost_mode = true | 600 | multiplayer_node.ghost_mode = true |
571 | add_child(multiplayer_node) | 601 | add_child(multiplayer_node) |
602 | |||
603 | # Hook up Geronimo handler. | ||
604 | $player.connect("player_jumped", apclient, "geronimo") | ||
605 | |||
606 | if april_fools: | ||
607 | # Change the appearance of every painting. | ||
608 | var notnerb_painting = load("res://nodes/paintings/bg_notnerb.tscn").instance() | ||
609 | for child in $Decorations/Paintings.get_children(): | ||
610 | if child.get_node_or_null("GridMap") != null: | ||
611 | child.get_node("GridMap").queue_free() | ||
612 | child.add_child(notnerb_painting.get_node("GridMap").duplicate(true)) | ||
572 | 613 | ||
573 | # Hook up the scene to be able to handle connection failures. | 614 | # Hook up the scene to be able to handle connection failures. |
574 | apclient.connect("could_not_connect", self, "archipelago_disconnected") | 615 | apclient.connect("could_not_connect", self, "archipelago_disconnected") |
@@ -652,8 +693,10 @@ func set_gridmap_tile(x, y, z, tile): | |||
652 | var gridmap = self.get_node("GridMap") | 693 | var gridmap = self.get_node("GridMap") |
653 | var mesh_library = gridmap.mesh_library | 694 | var mesh_library = gridmap.mesh_library |
654 | var mapvec = gridmap.world_to_map(gridmap.to_local(Vector3(x, y, z))) | 695 | var mapvec = gridmap.world_to_map(gridmap.to_local(Vector3(x, y, z))) |
696 | var cellitem = mesh_library.find_item_by_name(tile) | ||
655 | 697 | ||
656 | gridmap.set_cell_item(mapvec.x, mapvec.y, mapvec.z, mesh_library.find_item_by_name(tile)) | 698 | if cellitem != GridMap.INVALID_CELL_ITEM: |
699 | gridmap.set_cell_item(mapvec.x, mapvec.y, mapvec.z, cellitem) | ||
657 | 700 | ||
658 | 701 | ||
659 | func clear_gridmap_tile(x, y, z): | 702 | func clear_gridmap_tile(x, y, z): |
diff --git a/Archipelago/player.gd b/Archipelago/player.gd index 87d9d0c..244d9a8 100644 --- a/Archipelago/player.gd +++ b/Archipelago/player.gd | |||
@@ -1,5 +1,13 @@ | |||
1 | extends "res://scripts/player.gd" | 1 | extends "res://scripts/player.gd" |
2 | 2 | ||
3 | var april_fools = false | ||
4 | |||
5 | |||
6 | func _ready(): | ||
7 | var date = Time.get_date_dict_from_system() | ||
8 | if date["month"] == 4 && date["day"] == 1: | ||
9 | april_fools = true | ||
10 | |||
3 | 11 | ||
4 | func _solving(): | 12 | func _solving(): |
5 | ._solving() | 13 | ._solving() |
@@ -22,3 +30,10 @@ func _unhandled_input(event): | |||
22 | if event.pressed and event.scancode == KEY_P: | 30 | if event.pressed and event.scancode == KEY_P: |
23 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") | 31 | var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") |
24 | effects_node.skip_puzzle() | 32 | effects_node.skip_puzzle() |
33 | |||
34 | |||
35 | func rotate_y(amount): | ||
36 | if april_fools: | ||
37 | .rotate_y(-amount) | ||
38 | else: | ||
39 | .rotate_y(amount) | ||
diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 2cabe09..7f50f51 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd | |||
@@ -104,8 +104,13 @@ func connectionSuccessful(): | |||
104 | 104 | ||
105 | # Switch to LL1 | 105 | # Switch to LL1 |
106 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | 106 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) |
107 | global.map = "level1" | ||
108 | global.save_file = apclient.getSaveFileName() | 107 | global.save_file = apclient.getSaveFileName() |
108 | |||
109 | if Directory.new().file_exists("user://level1/%s.save" % global.save_file): | ||
110 | global.map = "level1" | ||
111 | else: | ||
112 | global.map = "level1_stable" | ||
113 | |||
109 | var _discard = get_tree().change_scene("res://scenes/load_screen.tscn") | 114 | var _discard = get_tree().change_scene("res://scenes/load_screen.tscn") |
110 | 115 | ||
111 | 116 | ||
diff --git a/CHANGELOG.md b/CHANGELOG.md index 9915d06..676ae4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md | |||
@@ -1,5 +1,14 @@ | |||
1 | # lingo-archipelago Releases | 1 | # lingo-archipelago Releases |
2 | 2 | ||
3 | ## v1.2.1 - 2024-03-29 | ||
4 | |||
5 | - Fixed the entrance to The Wanderer not opening after disconnecting from | ||
6 | Archipelago and connecting again without closing the game. | ||
7 | |||
8 | Download: | ||
9 | [lingo-archipelago-v1.2.1.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v1.2.1.zip)<br/> | ||
10 | Source: [v1.2.1](https://code.fourisland.com/lingo-archipelago/tag/?h=v1.2.1) | ||
11 | |||
3 | ## v1.2.0 - 2024-02-04 | 12 | ## v1.2.0 - 2024-02-04 |
4 | 13 | ||
5 | - The "Press P to skip puzzle" message will no longer appear when the cursor is | 14 | - The "Press P to skip puzzle" message will no longer appear when the cursor is |