update
This commit is contained in:
@@ -14,6 +14,10 @@ var zurueck_btn: Button ## "Zurück in Raum XY" nach einem Abbruch
|
||||
var solo_stufe: OptionButton
|
||||
var lobby_stufe: OptionButton
|
||||
|
||||
# Kampagne
|
||||
var kamp_kopf: Label
|
||||
var karte: Control
|
||||
|
||||
# Mehrspieler
|
||||
var name_edit: LineEdit
|
||||
var code_edit: LineEdit
|
||||
@@ -41,11 +45,16 @@ func _ready() -> void:
|
||||
screens["join"] = _screen(root, _build_join())
|
||||
screens["lobby"] = _screen(root, _build_lobby())
|
||||
screens["regeln"] = _screen(root, _build_regeln())
|
||||
screens["kampagne"] = _screen(root, _build_kampagne())
|
||||
|
||||
Net.lobby_changed.connect(_refresh)
|
||||
Net.connection_failed.connect(_on_failed)
|
||||
Net.server_closed.connect(_on_closed)
|
||||
_show("main")
|
||||
if Kampagne.zur_karte:
|
||||
Kampagne.zur_karte = false
|
||||
_show("kampagne")
|
||||
else:
|
||||
_show("main")
|
||||
|
||||
|
||||
# ------------------------------------------------------------ Aufbau
|
||||
@@ -63,6 +72,8 @@ func _show(which: String) -> void:
|
||||
for key: String in screens:
|
||||
screens[key].visible = key == which
|
||||
_sagen("")
|
||||
if which == "kampagne":
|
||||
_karte_fuellen()
|
||||
if which == "main" and zurueck_btn != null:
|
||||
zurueck_btn.visible = not Net.letzter_raum.is_empty()
|
||||
if zurueck_btn.visible:
|
||||
@@ -93,6 +104,82 @@ func _text(t: String, size: int, col := Color.WHITE) -> Label:
|
||||
return l
|
||||
|
||||
|
||||
## Gezeichnete Karte im Knete-Look: helle See, sandige Inseln unter jedem
|
||||
## Hafen, eine gestrichelte Route von leicht nach schwer.
|
||||
class Seekarte extends Control:
|
||||
func _draw() -> void:
|
||||
var g := size
|
||||
draw_rect(Rect2(Vector2.ZERO, g), Color(0.56, 0.74, 0.88))
|
||||
var sortiert: Array = Kampagne.kapitaene.duplicate()
|
||||
sortiert.sort_custom(func(a, b): return float(a.elo) < float(b.elo))
|
||||
var letzte := Vector2(-1, -1)
|
||||
for k in sortiert:
|
||||
var p: Vector2 = Vector2(k.pos) * g
|
||||
if letzte.x >= 0.0:
|
||||
var n := 14
|
||||
for i in n:
|
||||
if i % 2 == 0:
|
||||
draw_line(letzte.lerp(p, float(i) / n), letzte.lerp(p, float(i + 1) / n),
|
||||
Color(1, 1, 1, 0.45), 2.0)
|
||||
letzte = p
|
||||
for k in Kampagne.kapitaene:
|
||||
var p: Vector2 = Vector2(k.pos) * g
|
||||
var da: bool = int(k.weg) == 0
|
||||
draw_circle(p + Vector2(0, 6), 62.0, Color(0.0, 0.0, 0.0, 0.10))
|
||||
draw_circle(p, 62.0, Color(0.92, 0.84, 0.68) if da else Color(0.75, 0.78, 0.82))
|
||||
draw_circle(p + Vector2(-10, -30), 16.0, Color(0.35, 0.72, 0.44) if da else Color(0.6, 0.65, 0.66))
|
||||
draw_circle(p + Vector2(14, -34), 11.0, Color(0.35, 0.72, 0.44) if da else Color(0.6, 0.65, 0.66))
|
||||
|
||||
|
||||
## Die Seekarte: Kapitäne als Häfen. Wer auf See ist, steht ausgegraut da
|
||||
## mit der Zahl der Partien bis zur Rückkehr.
|
||||
func _build_kampagne() -> Control:
|
||||
var box := _box(940)
|
||||
box.add_child(_text("Seekarte", 26, Color(1.0, 0.82, 0.32)))
|
||||
kamp_kopf = _text("", 15, Color(0.85, 0.87, 0.92))
|
||||
box.add_child(kamp_kopf)
|
||||
karte = Seekarte.new()
|
||||
karte.custom_minimum_size = Vector2(920, 440)
|
||||
box.add_child(karte)
|
||||
var row := HBoxContainer.new()
|
||||
row.add_theme_constant_override("separation", 8)
|
||||
box.add_child(row)
|
||||
_button("Neu anfangen", row, func() -> void:
|
||||
Kampagne.zuruecksetzen()
|
||||
Kampagne.speichern()
|
||||
_karte_fuellen())
|
||||
_button("Zurück", row, _show.bind("main"))
|
||||
return box
|
||||
|
||||
|
||||
func _karte_fuellen() -> void:
|
||||
kamp_kopf.text = "Du: %s, Wertung %d · %d Partien, %d Siege" % [
|
||||
Kampagne.mein_rang(), int(round(Kampagne.elo)), Kampagne.partien, Kampagne.siege]
|
||||
for c in karte.get_children():
|
||||
if c is Button:
|
||||
karte.remove_child(c)
|
||||
c.queue_free()
|
||||
karte.queue_redraw()
|
||||
var groesse := karte.custom_minimum_size
|
||||
for k in Kampagne.kapitaene:
|
||||
var b := Button.new()
|
||||
var weg := int(k.weg)
|
||||
if weg > 0:
|
||||
b.text = "%s\nauf See · zurück in %d" % [k.name, weg]
|
||||
b.disabled = true
|
||||
else:
|
||||
b.text = "%s\n%s · %d" % [k.name, ["leicht", "normal", "schwer"][int(k.stufe)], int(round(k.elo))]
|
||||
b.pressed.connect(_on_kapitaen.bind(String(k.name)))
|
||||
b.custom_minimum_size = Vector2(170, 52)
|
||||
var p: Vector2 = k.pos
|
||||
b.position = Vector2(p.x * groesse.x - 85, p.y * groesse.y + 4)
|
||||
karte.add_child(b)
|
||||
|
||||
|
||||
func _on_kapitaen(name: String) -> void:
|
||||
Kampagne.starten(name)
|
||||
|
||||
|
||||
func _on_wieder_rein() -> void:
|
||||
_show("join")
|
||||
_sagen("Verbinde mit Raum %s …" % Net.letzter_raum.get("code", ""))
|
||||
@@ -184,6 +271,7 @@ func _build_main() -> Control:
|
||||
# Nach einem Verbindungsabbruch: derselbe Name, derselbe Code, ein Klick.
|
||||
zurueck_btn = _button("", box, _on_wieder_rein)
|
||||
zurueck_btn.visible = false
|
||||
_button("Kampagne", box, _show.bind("kampagne"))
|
||||
_button("Einzelspieler", box, _show.bind("single"))
|
||||
_button("Mehrspieler", box, _show.bind("multi"))
|
||||
_button("Regeln", box, _show.bind("regeln"))
|
||||
@@ -330,6 +418,7 @@ func _build_lobby() -> Control:
|
||||
# ------------------------------------------------------------ Aktionen
|
||||
|
||||
func _on_solo_start() -> void:
|
||||
Kampagne.kampagnenpartie = false
|
||||
Net.start_singleplayer("Spieler", solo_bots.value, solo_stufe.selected)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user