diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-23 11:49:35 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2025-09-23 11:49:35 -0400 |
| commit | 558fabd029f52dafdf04c6de29ef09d7789ef27b (patch) | |
| tree | f9f412986989410f111ee4b9cc3eba708cf0a302 /client | |
| parent | b78c93122f856940f7492e3dbc7dc5fbb798e14b (diff) | |
| download | lingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.tar.gz lingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.tar.bz2 lingo2-archipelago-558fabd029f52dafdf04c6de29ef09d7789ef27b.zip | |
[Client] Stop using a camera for minimap
Diffstat (limited to 'client')
| -rw-r--r-- | client/Archipelago/minimap.gd | 178 |
1 files changed, 118 insertions, 60 deletions
| diff --git a/client/Archipelago/minimap.gd b/client/Archipelago/minimap.gd index 2702bb1..15993fb 100644 --- a/client/Archipelago/minimap.gd +++ b/client/Archipelago/minimap.gd | |||
| @@ -1,9 +1,18 @@ | |||
| 1 | extends CanvasLayer | 1 | extends CanvasLayer |
| 2 | 2 | ||
| 3 | var player | 3 | var player |
| 4 | var camera | 4 | var drawer |
| 5 | var sprite | ||
| 5 | var label | 6 | var label |
| 6 | var map_bounds = null | 7 | |
| 8 | var cell_left | ||
| 9 | var cell_top | ||
| 10 | var cell_right | ||
| 11 | var cell_bottom | ||
| 12 | var center_x_min | ||
| 13 | var center_x_max | ||
| 14 | var center_y_min | ||
| 15 | var center_y_max | ||
| 7 | 16 | ||
| 8 | 17 | ||
| 9 | func _ready(): | 18 | func _ready(): |
| @@ -22,72 +31,121 @@ func _ready(): | |||
| 22 | 31 | ||
| 23 | var sv = SubViewport.new() | 32 | var sv = SubViewport.new() |
| 24 | sv.size = Vector2i(256, 256) | 33 | sv.size = Vector2i(256, 256) |
| 34 | sv.disable_3d = true | ||
| 25 | svc.add_child(sv) | 35 | svc.add_child(sv) |
| 26 | 36 | ||
| 27 | camera = Camera3D.new() | 37 | var background_color = Color.WHITE |
| 28 | camera.position.y = 5 | 38 | |
| 29 | camera.rotation_degrees.x = -90 | 39 | var world_env = get_tree().get_root().get_node("scene/WorldEnvironment") |
| 30 | camera.projection = Camera3D.PROJECTION_ORTHOGONAL | 40 | if world_env != null and world_env.environment != null: |
| 31 | camera.size = 128.0 | 41 | if world_env.environment.background_mode == Environment.BG_COLOR: |
| 32 | camera.far = 10 | 42 | background_color = world_env.environment.background_color |
| 33 | sv.add_child(camera) | 43 | elif ( |
| 44 | world_env.environment.background_mode == Environment.BG_SKY | ||
| 45 | and world_env.environment.sky != null | ||
| 46 | and world_env.environment.sky.sky_material != null | ||
| 47 | ): | ||
| 48 | var sky = world_env.environment.sky.sky_material | ||
| 49 | if sky is PhysicalSkyMaterial: | ||
| 50 | background_color = sky.ground_color | ||
| 51 | elif sky is ProceduralSkyMaterial: | ||
| 52 | background_color = sky.sky_top_color | ||
| 53 | |||
| 54 | var background_image = Image.create_empty(256, 256, false, Image.FORMAT_RGBA8) | ||
| 55 | background_image.fill(background_color) | ||
| 56 | |||
| 57 | var background_texture = ImageTexture.create_from_image(background_image) | ||
| 58 | var background = Sprite2D.new() | ||
| 59 | background.texture = background_texture | ||
| 60 | background.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST | ||
| 61 | background.centered = false | ||
| 62 | sv.add_child(background) | ||
| 63 | |||
| 64 | drawer = Node2D.new() | ||
| 65 | sv.add_child(drawer) | ||
| 66 | |||
| 67 | var gridmap = get_tree().get_root().get_node("scene/GridMap") | ||
| 68 | if gridmap == null: | ||
| 69 | visible = false | ||
| 70 | return | ||
| 71 | |||
| 72 | cell_left = 0 | ||
| 73 | cell_top = 0 | ||
| 74 | cell_right = 0 | ||
| 75 | cell_bottom = 0 | ||
| 76 | |||
| 77 | for pos in gridmap.get_used_cells(): | ||
| 78 | if pos.x < cell_left: | ||
| 79 | cell_left = pos.x | ||
| 80 | if pos.x > cell_right: | ||
| 81 | cell_right = pos.x | ||
| 82 | if pos.z < cell_top: | ||
| 83 | cell_top = pos.z | ||
| 84 | if pos.z > cell_bottom: | ||
| 85 | cell_bottom = pos.z | ||
| 86 | |||
| 87 | var cell_width = cell_right - cell_left + 1 | ||
| 88 | var cell_height = cell_bottom - cell_top + 1 | ||
| 89 | |||
| 90 | var heights = {} | ||
| 91 | |||
| 92 | var rendered = Image.create_empty(cell_width, cell_height, false, Image.FORMAT_RGBA8) | ||
| 93 | rendered.fill(Color.TRANSPARENT) | ||
| 94 | |||
| 95 | for pos in gridmap.get_used_cells(): | ||
| 96 | var in_plane = Vector2i(pos.x, pos.z) | ||
| 97 | |||
| 98 | if in_plane in heights and heights[in_plane] > pos.y: | ||
| 99 | continue | ||
| 100 | |||
| 101 | heights[in_plane] = pos.y | ||
| 102 | |||
| 103 | var cell_item = gridmap.get_cell_item(pos) | ||
| 104 | var mesh = gridmap.mesh_library.get_item_mesh(cell_item) | ||
| 105 | var material = mesh.surface_get_material(0) | ||
| 106 | var color = material.albedo_color | ||
| 107 | |||
| 108 | rendered.set_pixel(pos.x - cell_left, pos.z - cell_top, color) | ||
| 109 | |||
| 110 | var image_texture = ImageTexture.create_from_image(rendered) | ||
| 111 | sprite = Sprite2D.new() | ||
| 112 | sprite.texture = image_texture | ||
| 113 | sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST | ||
| 114 | sprite.scale = Vector2(2, 2) | ||
| 115 | sprite.centered = false | ||
| 116 | drawer.add_child(sprite) | ||
| 34 | 117 | ||
| 35 | label = Label.new() | 118 | label = Label.new() |
| 36 | label.theme = preload("res://assets/themes/baseUI.tres") | 119 | label.theme = preload("res://assets/themes/baseUI.tres") |
| 37 | label.add_theme_font_size_override("font_size", 32) | 120 | label.add_theme_font_size_override("font_size", 32) |
| 38 | label.text = "@" | 121 | label.text = "@" |
| 39 | add_child(label) | 122 | drawer.add_child(label) |
| 40 | 123 | ||
| 41 | var gridmap = get_tree().get_root().get_node("scene/GridMap") | 124 | var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top)) |
| 42 | if gridmap != null: | 125 | var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom)) |
| 43 | var cell_left = 0 | 126 | var global_tl = gridmap.to_global(local_tl) |
| 44 | var cell_top = 0 | 127 | var global_br = gridmap.to_global(local_br) |
| 45 | var cell_right = 0 | 128 | |
| 46 | var cell_bottom = 0 | 129 | center_x_min = 0 |
| 47 | 130 | center_x_max = cell_width - 128 | |
| 48 | for pos in gridmap.get_used_cells(): | 131 | center_y_min = 0 |
| 49 | if pos.x < cell_left: | 132 | center_y_max = cell_height - 128 |
| 50 | cell_left = pos.x | 133 | |
| 51 | if pos.x > cell_right: | 134 | if center_x_max < center_x_min: |
| 52 | cell_right = pos.x | 135 | center_x_min = (center_x_min + center_x_max) / 2 |
| 53 | if pos.z < cell_top: | 136 | center_x_max = center_x_min |
| 54 | cell_top = pos.z | 137 | |
| 55 | if pos.z > cell_bottom: | 138 | if center_y_max < center_y_min: |
| 56 | cell_bottom = pos.z | 139 | center_y_min = (center_y_min + center_y_max) / 2 |
| 57 | 140 | center_y_max = center_y_min | |
| 58 | var local_tl = gridmap.map_to_local(Vector3i(cell_left, 0, cell_top)) | ||
| 59 | var local_br = gridmap.map_to_local(Vector3i(cell_right, 0, cell_bottom)) | ||
| 60 | var global_tl = gridmap.to_global(local_tl) | ||
| 61 | var global_br = gridmap.to_global(local_br) | ||
| 62 | map_bounds = [ | ||
| 63 | min(global_tl.x, global_br.x) + 64, | ||
| 64 | max(global_tl.x, global_br.x) - 64, | ||
| 65 | min(global_tl.z, global_br.z) + 64, | ||
| 66 | max(global_tl.z, global_br.z) - 64 | ||
| 67 | ] | ||
| 68 | |||
| 69 | if map_bounds[1] < map_bounds[0]: | ||
| 70 | map_bounds[0] = (map_bounds[0] + map_bounds[1]) / 2 | ||
| 71 | map_bounds[1] = map_bounds[0] | ||
| 72 | |||
| 73 | if map_bounds[3] < map_bounds[2]: | ||
| 74 | map_bounds[2] = (map_bounds[2] + map_bounds[3]) / 2 | ||
| 75 | map_bounds[3] = map_bounds[2] | ||
| 76 | |||
| 77 | if map_bounds == null: | ||
| 78 | label.position.x = 1712.0 | ||
| 79 | label.position.y = 872.0 | ||
| 80 | #label.offset_right = 1743.0 | ||
| 81 | #label.offset_bottom = 907.0 | ||
| 82 | 141 | ||
| 83 | 142 | ||
| 84 | func _process(_delta): | 143 | func _process(_delta): |
| 85 | if map_bounds == null: | 144 | if visible == false: |
| 86 | camera.position.x = player.position.x | 145 | return |
| 87 | camera.position.z = player.position.z | 146 | |
| 88 | else: | 147 | drawer.position.x = clamp(player.position.x - cell_left - 64, center_x_min, center_x_max) * -2 |
| 89 | camera.position.x = clamp(player.position.x, map_bounds[0], map_bounds[1]) | 148 | drawer.position.y = clamp(player.position.z - cell_top - 64, center_y_min, center_y_max) * -2 |
| 90 | camera.position.z = clamp(player.position.z, map_bounds[2], map_bounds[3]) | 149 | |
| 91 | 150 | label.position.x = (player.position.x - cell_left) * 2 - 16 | |
| 92 | label.position.x = 1600 + (player.position.x - camera.position.x) * 2 + 128 - 16 | 151 | label.position.y = (player.position.z - cell_top) * 2 - 16 |
| 93 | label.position.y = 760 + (player.position.z - camera.position.z) * 2 + 128 - 16 | ||
