diff --git a/src/ui/help_text.gd b/src/ui/help_text.gd index 0218c41..6be373d 100644 --- a/src/ui/help_text.gd +++ b/src/ui/help_text.gd @@ -49,7 +49,7 @@ static func text() -> String: ["1 / 2 / 3 / 4", "Pinselmodus: Heben / Senken / Glätten / Malen"], ["[ / ]", "Pinselgröße: Klein (4 m) / Mittel (12 m) / Groß (32 m) zyklisch"], ["Linksklick-Ziehen", "Boden formen bzw. malen"], - ["Strg+Linksklick-Ziehen", "Gegenteil: senken (bei Heben) / heben (bei Senken) / Gras zurückmalen"], + ["Strg+Linksklick-Ziehen", "Gegenteil: senken (bei Heben) / heben (bei Senken) / Steppe zurückmalen"], ])) out += _header("Datei & Undo") out += _table(_rows([ diff --git a/src/ui/main.gd b/src/ui/main.gd index a8b0035..8d5dcc7 100644 --- a/src/ui/main.gd +++ b/src/ui/main.gd @@ -1815,10 +1815,10 @@ func _enter_terrain_mode() -> void: return tool_mode = "terrain" terrain_mod.terrain_panel.visible = true - help_label.text = "Linksklick-Ziehen: Boden formen oder malen · Strg+Linksklick: Gegenteil / Gras zurück ·\n1/2/3/4: Heben/Senken/Glätten/Malen · [ / ]: Pinselgröße Klein/Mittel/Groß ·\nPinselgröße & Material rechts · Rechte Maustaste: Flug · Strg+Z: letzter Strich weg" + help_label.text = "Linksklick-Ziehen: Boden formen oder malen · Strg+Linksklick: Gegenteil / Steppe zurück ·\n1/2/3/4: Heben/Senken/Glätten/Malen · [ / ]: Pinselgröße Klein/Mittel/Groß ·\nPinselgröße & Material rechts · Rechte Maustaste: Flug · Strg+Z: letzter Strich weg" terrain_mod.terrain_edit_btn.button_pressed = true terrain_tool.call("set_brush_mode", terrain_mod._selected_terrain_mode()) - _set_status("Terrain-Modus an: LINKSKLICK-Ziehen formt den Boden, im Malen-Modus färbt er das Gelände (Gras/Sand/Fels). Regler rechts stellen Pinsel und Stärke ein.") + _set_status("Terrain-Modus an: LINKSKLICK-Ziehen formt den Boden, im Malen-Modus färbt er das Gelände (Steppe/Sand/Fels …). Regler rechts stellen Pinsel und Stärke ein.") func _leave_terrain_mode() -> void: diff --git a/src/ui/panels/terrain_panel.gd b/src/ui/panels/terrain_panel.gd index 0124a89..ec37caa 100644 --- a/src/ui/panels/terrain_panel.gd +++ b/src/ui/panels/terrain_panel.gd @@ -95,7 +95,7 @@ func build() -> void: mat_scroll.add_child(mat_grid) terrain_palette.add_child(mat_scroll) var mat_labels := [ - "🌿 Gras", "🏖 Sand", "🪨 Fels", "🌱 Sattgras", + "🏜 Steppe", "🏖 Sand", "🪨 Fels", "🌱 Sattgras", "🍂 Vertrocknet", "🍀 Moos", "🟫 Erde", "🛤 Pfad", "⛏ Umgegraben", "🧱 Schotter", "🟤 Lehm", "🏜 Sand hell", "🏜 Sand rost", "🗻 Basalt", "⛰ Geröll", "🌧 Schlamm", @@ -178,7 +178,7 @@ func build() -> void: terrain_panel.add_child(terrain_weich_slider) terrain_panel.add_child(_muted_label( - "Linksklick-Ziehen formt bzw. malt (je nach Werkzeug), Strg+Linksklick macht das Gegenteil — im Malen-Modus malt Strg+Klick Gras zurück. " + "Linksklick-Ziehen formt bzw. malt (je nach Werkzeug), Strg+Linksklick macht das Gegenteil — im Malen-Modus malt Strg+Klick Steppe (Grundboden) zurück. " + "Jeder Strich ist EIN Rückgängig-Schritt (Strg+Z). Rechte Maustaste = Flug, ESC beendet den Terrain-Modus.")) # --- Bauen (Karte t_97ea59c5): Modular-Builder-Pieces im App-Skelett --- diff --git a/src/ui/resize_map_dialog.gd b/src/ui/resize_map_dialog.gd index ab9e21d..c870f66 100644 --- a/src/ui/resize_map_dialog.gd +++ b/src/ui/resize_map_dialog.gd @@ -76,7 +76,7 @@ func _init() -> void: _fill_spin(size_z_edit) vbox.add_child(size_z_edit) - var hint := _make_label("Erlaubt: 256–4096 m. Die Karte bleibt mittig — das bestehende Terrain\nbehaftet seine Weltposition, die neue Randzone wird flach (Gras).") + var hint := _make_label("Erlaubt: 256–4096 m. Die Karte bleibt mittig — das bestehende Terrain\nbehaftet seine Weltposition, die neue Randzone wird flach (Steppe).") hint.modulate = Color(1, 1, 1, 0.7) vbox.add_child(hint) @@ -188,7 +188,7 @@ func _update_preview() -> void: lines.append("Beim Verkleinern geht nichts verloren — alles liegt innerhalb der neuen Grenzen.") elif grow: preview_label.modulate = Color(1, 1, 1, 0.7) - lines.append("Beim Vergrößern bleibt alles erhalten — die neue Randzone wird flaches Gras.") + lines.append("Beim Vergrößern bleibt alles erhalten — die neue Randzone wird flache Steppe.") # Spawn-Speicher-Warnung (R2-Befund): V11 verlangt ≥ 4 Punkte je Team beim # SPEICHERN — nach dem Entfernen drohen Teams unter den Deckwert. diff --git a/src/viewport/terrain_contour.gdshader b/src/viewport/terrain_contour.gdshader index e6a0654..909061e 100644 --- a/src/viewport/terrain_contour.gdshader +++ b/src/viewport/terrain_contour.gdshader @@ -25,7 +25,7 @@ uniform float index_staerke : hint_range(0.0, 1.0) = 0.75; // im Client. Nicht gesetzt → ausschalten (vertex_only-Modus). uniform sampler2DArray albedo_array : source_color, filter_linear_mipmap, repeat_enable; uniform float layer_count = 20.0; -uniform float tile_size = 1.0; +uniform float tile_size = 3.0; uniform float texturen_an = 0.0; // 1.0 = Texturen aktiv (vom Mesh-Code gesetzt) // Splat-Gewichtstextur (Karte t_7a0a6b79 — weiche Übergänge): je Texel die @@ -87,6 +87,20 @@ vec2 warp(vec2 g) { return g + o * 0.9; // eine Oktave: Quest-Budget (8 Hash statt 16) } +// Anti-Wiederholung (Karte 25.10., Sly: „Texturen wiederholen sich zu krass“): +// Kachel 3 m statt 1 m; zweite Abtastung gedreht + 2,3× größer, ein +// großflächiges Rauschen (~9 m) mischt beide, ein zweites (~30 m) variiert die +// Helligkeit leicht. 2 Albedo-Fetches je Material statt 1. +vec3 alb_anti(float id, vec2 wp) { + float T = max(tile_size, 0.05); + vec2 uv1 = wp / T; + vec2 uv2 = vec2(0.8196 * wp.x - 0.5729 * wp.y, 0.5729 * wp.x + 0.8196 * wp.y) / (T * 2.3) + vec2(0.37, 0.71); + vec3 a = texture(albedo_array, vec3(uv1, id)).rgb; + vec3 b = texture(albedo_array, vec3(uv2, id)).rgb; + vec3 col = mix(a, b, smoothstep(0.35, 0.65, vnoise(wp * 0.11))); + return col * mix(0.88, 1.08, vnoise(wp * 0.035 + vec2(17.0, 3.0))); +} + float mat_id(ivec2 p) { return clamp(floor(texelFetch(material_map, p, 0).r * 255.0 + 0.5), 0.0, layer_count - 1.0); } @@ -159,9 +173,7 @@ void fragment() { float m1 = max(material_res - 1.0, 1.0); vec2 g = clamp(warp(clamp(map_uv, 0.0, 1.0) * m1), vec2(0.0), vec2(m1)); vec3 t2 = top2(g); - vec2 uv = world_pos.xz / max(tile_size, 0.05); - vec3 alb = mix(texture(albedo_array, vec3(uv, t2.y)).rgb, - texture(albedo_array, vec3(uv, t2.x)).rgb, t2.z); + vec3 alb = mix(alb_anti(t2.y, world_pos.xz), alb_anti(t2.x, world_pos.xz), t2.z); col = alb * col; // Tönung/Shading multipliziert (wie Client) } // --- Konturlinien (unverändert, Karte t_3ebe4086) --- diff --git a/src/viewport/terrain_mesh.gd b/src/viewport/terrain_mesh.gd index 179306b..7acbb23 100644 --- a/src/viewport/terrain_mesh.gd +++ b/src/viewport/terrain_mesh.gd @@ -157,8 +157,7 @@ func _apply_texture_uniforms(mat: ShaderMaterial) -> void: albedo.create_from_images(imgs) mat.set_shader_parameter("albedo_array", albedo) mat.set_shader_parameter("layer_count", float(imgs.size())) - mat.set_shader_parameter("tile_size", - float(arrays.tile_size) if arrays.tile_size > 0.0 else 1.0) + mat.set_shader_parameter("tile_size", 3.0) # Spiegel Client TILE_SIZE (Karte 25.10.) mat.set_shader_parameter("texturen_an", 1.0)