extends Node func _ready(): var runtime = global.get_node("Runtime") # Some helpful logging. if Steam.isSubscribed(): global._print("Provisioning successful! Build ID: %d" % Steam.getAppBuildId()) else: global._print("Provisioning failed.") # Undo the load screen removing our cursor get_tree().get_root().set_disable_input(false) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # Increase the WebSocket input buffer size so that we can download large # data packages. ProjectSettings.set_setting("network/limits/websocket_client/max_in_buffer_kb", 8192) switcher.layer = 4 # Create the global AP manager, if it doesn't already exist. if not global.has_node("Archipelago"): var ap_script = runtime.load_script("manager.gd") var ap_instance = ap_script.new() ap_instance.name = "Archipelago" ap_instance.SCRIPT_client = runtime.load_script("client.gd") ap_instance.SCRIPT_keyboard = runtime.load_script("keyboard.gd") ap_instance.SCRIPT_locationListener = runtime.load_script("locationListener.gd") ap_instance.SCRIPT_minimap = runtime.load_script("minimap.gd") ap_instance.SCRIPT_victoryListener = runtime.load_script("victoryListener.gd") ap_instance.SCRIPT_websocketserver = runtime.load_script("vendor/WebSocketServer.gd") global.add_child(ap_instance) # Let's also inject any scripts we need to inject now. installScriptExtension(runtime.load_script("animationListener.gd")) installScriptExtension(runtime.load_script("collectable.gd")) installScriptExtension(runtime.load_script("door.gd")) installScriptExtension(runtime.load_script("keyHolder.gd")) installScriptExtension(runtime.load_script("keyHolderChecker.gd")) installScriptExtension(runtime.load_script("keyHolderResetterListener.gd")) installScriptExtension(runtime.load_script("painting.gd")) installScriptExtension(runtime.load_script("paintingAuto.gd")) installScriptExtension(runtime.load_script("panel.gd")) installScriptExtension(runtime.load_script("pauseMenu.gd")) installScriptExtension(runtime.load_script("player.gd")) installScriptExtension(runtime.load_script("saver.gd")) installScriptExtension(runtime.load_script("teleport.gd")) installScriptExtension(runtime.load_script("teleportListener.gd")) installScriptExtension(runtime.load_script("visibilityListener.gd")) installScriptExtension(runtime.load_script("worldport.gd")) installScriptExtension(runtime.load_script("worldportListener.gd")) var proto_script = runtime.load_script("../generated/proto.gd") var gamedata_script = runtime.load_script("gamedata.gd") var gamedata_instance = gamedata_script.new(proto_script) gamedata_instance.load(runtime.read_path("../generated/data.binpb")) gamedata_instance.name = "Gamedata" global.add_child(gamedata_instance) var messages_script = runtime.load_script("messages.gd") var messages_instance = messages_script.new() messages_instance.name = "Messages" messages_instance.SCRIPT_rainbowText = runtime.load_script("rainbowText.gd") global.add_child(messages_instance) var effects_script = runtime.load_script("effects.gd") var effects_instance = effects_script.new() effects_instance.name = "Effects" global.add_child(effects_instance) var textclient_script = runtime.load_script("textclient.gd") var textclient_instance = textclient_script.new() textclient_instance.name = "Textclient" global.add_child(textclient_instance) var compass_overlay_script = runtime.load_script("compass_overlay.gd") var compass_overlay_instance = compass_overlay_script.new() compass_overlay_instance.name = "Compass" compass_overlay_instance.SCRIPT_compass = runtime.load_script("compass.gd") global.add_child(compass_overlay_instance) var ap = global.get_node("Archipelago") var gamedata = global.get_node("Gamedata") ap.ap_connected.connect(connectionSuccessful) ap.could_not_connect.connect(connectionUnsuccessful) ap.connect_status.connect(connectionStatus) # Populate textboxes with AP settings. get_node("../Panel/server_box").text = ap.ap_server get_node("../Panel/player_box").text = ap.ap_user get_node("../Panel/password_box").text = ap.ap_pass var history_box = get_node("../Panel/connection_history") if ap.connection_history.is_empty(): history_box.disabled = true else: history_box.disabled = false var i = 0 for details in ap.connection_history: history_box.get_popup().add_item("%s (%s)" % [details[1], details[0]], i) i += 1 history_box.get_popup().id_pressed.connect(historySelected) # Show client version. var version = gamedata.objects.get_version() get_node("../Panel/title").text = ( "ARCHIPELAGO (%d.%d.%d)" % [version.get_major(), version.get_minor(), version.get_patch()] ) # Increase font size in text boxes. get_node("../Panel/server_box").add_theme_font_size_override("font_size", 36) get_node("../Panel/player_box").add_theme_font_size_override("font_size", 36) get_node("../Panel/password_box").add_theme_font_size_override("font_size", 36) # Set up version mismatch dialog. get_node("../Panel/VersionMismatch").confirmed.connect(startGame) get_node("../Panel/VersionMismatch").get_cancel_button().pressed.connect( versionMismatchDeclined ) # Set up buttons. get_node("../Panel/connect_button").pressed.connect(_connect_pressed) get_node("../Panel/quit_button").pressed.connect(_back_pressed) func _connect_pressed(): get_node("../Panel/connect_button").disabled = true var ap = global.get_node("Archipelago") ap.ap_server = get_node("../Panel/server_box").text ap.ap_user = get_node("../Panel/player_box").text ap.ap_pass = get_node("../Panel/password_box").text ap.saveSettings() ap.connectToServer() func _back_pressed(): var ap = global.get_node("Archipelago") ap.disconnect_from_ap() ap.client.sendQuit() get_tree().quit() # Adapted from https://gitlab.com/Delta-V-Modding/Mods/-/blob/main/game/ModLoader.gd func installScriptExtension(childScript: Resource): # Force Godot to compile the script now. # We need to do this here to ensure that the inheritance chain is # properly set up, and multiple mods can chain-extend the same # class multiple times. # This is also needed to make Godot instantiate the extended class # when creating singletons. # The actual instance is thrown away. childScript.new() var parentScript = childScript.get_base_script() var parentScriptPath = parentScript.resource_path global._print("ModLoader: Installing script extension over %s" % parentScriptPath) childScript.take_over_path(parentScriptPath) func connectionStatus(message): var popup = get_node("../Panel/AcceptDialog") popup.title = "Connecting to Archipelago" popup.dialog_text = message popup.exclusive = true popup.get_ok_button().visible = false popup.popup_centered() func connectionSuccessful(): var ap = global.get_node("Archipelago") var gamedata = global.get_node("Gamedata") # Check for major version mismatch. if ap.apworld_version[0] != gamedata.objects.get_version().get_major(): get_node("../Panel/AcceptDialog").exclusive = false var popup = get_node("../Panel/VersionMismatch") popup.title = "Version Mismatch!" popup.dialog_text = ( "This slot was generated using v%d.%d.%d of the Lingo 2 apworld,\nwhich has a different major version than this client (v%d.%d.%d).\nIt is highly recommended to play using the correct version of the client.\nYou may experience bugs or logic issues if you continue." % [ ap.apworld_version[0], ap.apworld_version[1], ap.apworld_version[2], gamedata.objects.get_version().get_major(), gamedata.objects.get_version().get_minor(), gamedata.objects.get_version().get_patch() ] ) popup.exclusive = true popup.popup_centered() return startGame() func startGame(): var ap = global.get_node("Archipelago") # Save connection details var connection_details = [ap.ap_server, ap.ap_user, ap.ap_pass] if ap.connection_history.has(connection_details): ap.connection_history.erase(connection_details) ap.connection_history.push_front(connection_details) if ap.connection_history.size() > 10: ap.connection_history.resize(10) ap.saveSettings() # Switch to the_entry Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) global.user = ap.getSaveFileName() global.universe = "lingo" global.map = "the_entry" unlocks.resetCollectables() unlocks.resetData() ap.setup_keys() unlocks.loadCollectables() unlocks.loadData() unlocks.unlockKey("capslock", 1) if ap.shuffle_worldports: settings.worldport_fades = "default" else: settings.worldport_fades = "never" clearResourceCache("res://objects/meshes/gridDoor.tscn") clearResourceCache("res://objects/nodes/collectable.tscn") clearResourceCache("res://objects/nodes/door.tscn") clearResourceCache("res://objects/nodes/keyHolder.tscn") clearResourceCache("res://objects/nodes/listeners/animationListener.tscn") clearResourceCache("res://objects/nodes/listeners/keyHolderChecker.tscn") clearResourceCache("res://objects/nodes/listeners/keyHolderResetterListener.tscn") clearResourceCache("res://objects/nodes/listeners/teleportListener.tscn") clearResourceCache("res://objects/nodes/listeners/visibilityListener.tscn") clearResourceCache("res://objects/nodes/listeners/wo
extends CanvasLayer
var player
var drawer
var sprite
var label
var cell_left
var cell_top
var cell_right
var cell_bottom
var cell_width
var cell_height
var center_x_min
var center_x_max
var center_y_min
var center_y_max
func _ready():
player = get_tree().get_root().get_node("scene/player")
var svc = PanelContainer.new()
svc.anchor_left = 1.0
svc.anchor_top = 1.0
svc.anchor_right = 1.0
svc.anchor_bottom = 1.0
svc.offset_left = -320.0
svc.offset_top = -320.0
svc.offset_right = -64.0
svc.offset_bottom = -64.0
svc.clip_contents = true
add_child(svc)
var background_color = Color.WHITE
var world_env = get_tree().get_root().get_node("scene/WorldEnvironment")
if world_env != null and world_env.environment != null:
if world_env.environment.background_mode == Environment.BG_COLOR:
background_color = world_env.environment.background_color
elif (
world_env.environment.background_mode == Environment.BG_SKY
and world_env.environment.sky != null
and world_env.environment.sky.sky_material != null
):
var sky = world_env.environment.sky.sky_material
if sky is PhysicalSkyMaterial:
background_color = sky.ground_color
elif sky is ProceduralSkyMaterial:
background_color = sky.sky_top_color
var stylebox = StyleBoxFlat.new()
stylebox.bg_color = Color(background_color, 0.6)
svc.add_theme_stylebox_override("panel", stylebox)
drawer = Node2D.new()
svc.add_child(drawer)
var gridmap = get_tree().get_root().get_node("scene/GridMap")
if gridmap == null:
visible = false
return
cell_left = 0
cell_top = 0
cell_right = 0
cell_bottom = 0
for pos in gridmap.get_used_cells():
if pos.x < cell_left:
cell_left = pos.x
if pos.x > cell_right:
cell_right = pos.x
if pos.z < cell_top:
cell_top = pos.z
if pos.z > cell_bottom:
cell_bottom = pos.z
cell_width = cell_right - cell_left + 1
cell_height = cell_bottom - cell_top + 1
var rendered = _renderMap(gridmap)
var image_texture = ImageTexture.create_from_image(rendered)
sprite = Sprite2D.new()
sprite.texture = image_texture
sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
sprite.scale = Vector2(2, 2)
sprite.centered = false
drawer.add_child(sprite)
label = Label.new()
label.theme = preload("res://assets/themes/baseUI.tres")
label.add_theme_font_size_override("font_size", 32)
label.text = "@"
drawer.add_child(label)
#var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
#var global_tl = gridmap.to_global(local_tl)
#var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom))
#var global_br = gridmap.to_global(local_br)
center_x_min = 0
center_x_max = cell_width - 128
center_y_min = 0
center_y_max = cell_height - 128
if center_x_max < center_x_min:
center_x_min = (center_x_min + center_x_max) / 2
center_x_max = center_x_min
if center_y_max < center_y_min:
center_y_min = (center_y_min + center_y_max) / 2
center_y_max = center_y_min
func _process(_delta):
if visible == false:
return
drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2
drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2
label.position.x = (player.position.x - cell_left) * 2 - 16
label.position.y = (player.position.z - cell_top) * 2 - 16
func _renderMap(gridmap):
var ap = global.get_node("Archipelago")
var heights = {}
var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8)
rendered.fill(Color.TRANSPARENT)
var meshes_node = get_tree().get_root().get_node("scene/Meshes")
if meshes_node != null:
_renderMeshNode(ap, gridmap, meshes_node, rendered)
for pos in gridmap.get_used_cells():
var in_plane = Vector2i(pos.x, pos.z)
if in_plane in heights and heights[in_plane] > pos.y:
continue
heights[in_plane] = pos.y
var cell_item = gridmap.get_cell_item(pos)
var mesh = gridmap.mesh_library.get_item_mesh(cell_item)
var material = mesh.surface_get_material(0)
var color = ap.color_by_material_path.get(material.resource_path, Color.TRANSPARENT)
rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color)
return rendered
func _renderMeshNode(ap, gridmap, mesh, rendered):
if mesh is MeshInstance3D:
var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top))
var global_tl = gridmap.to_global(local_tl)
var mesh_material = mesh.get_surface_override_material(0)
if mesh_material != null:
var mesh_color = ap.color_by_material_path.get(
mesh_material.resource_path, Color.TRANSPARENT
)
for y in range(
max(mesh.position.z - mesh.scale.z / 2 - global_tl.z, 0),
min(mesh.position.z + mesh.scale.z / 2 - global_tl.z, cell_height)
):
for x in range(
max(mesh.position.x - mesh.scale.x / 2 - global_tl.x, 0),
min(mesh.position.x + mesh.scale.x / 2 - global_tl.x, cell_width)
):
rendered.set_pixel(x, y, mesh_color)
for child in mesh.get_children():
_renderMeshNode(ap, gridmap, child, rendered)