Files
pirate-dice/tests/kampagne.gd
2026-09-16 18:35:59 +02:00

98 lines
4.6 KiB
GDScript

extends "res://tests/basis.gd"
## Kampagne: Wertung, Rang, Verschwinden und Rückkehr der Kapitäne,
## Speichern und Laden, und eine echte Partie gegen einen Kapitän im
## Simulationsmodus.
var game: Node
func _ready() -> void:
Kampagne.datei = "user://kampagne_test.json"
Kampagne.zuruecksetzen()
add_child(preload("res://scenes/main.tscn").instantiate())
await get_tree().process_frame
_lauf()
func _seats(alive: Array, namen: Array) -> Array:
var out: Array = []
for i in namen.size():
out.append({"name": namen[i], "alive": alive[i]})
return out
func _lauf() -> void:
# --- Wertung und Rang
_pruef("Start: 1000, Matrose", int(Kampagne.elo) == 1000 and Kampagne.mein_rang() == "Matrose")
_pruef("Rang steigt mit der Wertung", Kampagne.rang(1300) == "Kapitän" and Kampagne.rang(800) == "Schiffsjunge")
# --- Sieg: Kapitän verschwindet, Wertung steigt
Kampagne.aktiv = "Roter Jack"
Kampagne.ergebnis(_seats([true, false], ["Spieler", "Roter Jack"]), [1])
var jack: Dictionary = Kampagne.kapitaen("Roter Jack")
_pruef("Sieg: Wertung steigt", Kampagne.elo > 1000.0)
_pruef("Sieg: Kapitän geht auf See", int(jack.weg) == Kampagne.AUF_SEE and int(jack.geschlagen) == 1)
_pruef("Ergebnistext steht", Kampagne.letztes.begins_with("Sieg gegen Roter Jack"))
Kampagne.starten("Roter Jack")
_pruef("Kein Start gegen einen auf See", Kampagne.aktiv == "" and _find(get_tree().root, "Game") == null)
var vorher := Kampagne.elo
# --- Niederlage: Spieler fliegt vor dem Kapitän
Kampagne.aktiv = "Salz-Marie"
Kampagne.ergebnis(_seats([false, false, true], ["Spieler", "Salz-Marie", "Maat 1"]), [0, 1])
_pruef("Niederlage: Wertung sinkt", Kampagne.elo < vorher)
_pruef("Niederlage: Kapitänin bleibt", int(Kampagne.kapitaen("Salz-Marie").weg) == 0)
_pruef("Jack rückt näher", int(Kampagne.kapitaen("Roter Jack").weg) == Kampagne.AUF_SEE - 1)
# --- Sieg, weil der Kapitän vor dem Spieler ging, obwohl ein Maat gewann
Kampagne.aktiv = "Salz-Marie"
Kampagne.ergebnis(_seats([false, false, true], ["Spieler", "Salz-Marie", "Maat 1"]), [1, 0])
_pruef("Kapitän vor mir raus zählt als Sieg", int(Kampagne.kapitaen("Salz-Marie").weg) == Kampagne.AUF_SEE)
jack = Kampagne.kapitaen("Roter Jack")
_pruef("Jack ist zurück, stärker", int(jack.weg) == 0 and int(jack.stufe) == 1 and float(jack.elo) > 900.0)
# --- Speichern und Laden
var elo_alt := Kampagne.elo
Kampagne.speichern()
Kampagne.elo = 0.0
Kampagne.laden()
_pruef("Laden stellt Wertung und Kapitäne wieder her",
absf(Kampagne.elo - elo_alt) < 0.01 and int(Kampagne.kapitaen("Salz-Marie").weg) == Kampagne.AUF_SEE
and int(Kampagne.kapitaen("Roter Jack").stufe) == 1)
# --- Beute, Meldung, Siegchance, Ziel
_pruef("Nach dem Sieg ist Beute offen", Kampagne.beute_offen)
_pruef("Rückkehr wird gemeldet", Kampagne.meldungen.any(func(m): return "ist zurück" in String(m)))
var c_jack := Kampagne.siegchance(Kampagne.kapitaen("Roter Jack"))
var c_kraehe := Kampagne.siegchance(Kampagne.kapitaen("Admiral Krähe"))
_pruef("Siegchance: leicht hoch, schwer niedrig", c_jack > 0.5 and c_kraehe < 0.3)
Kampagne.elo = 1425.0
Kampagne.aktiv = "Salz-Marie"
Kampagne.ergebnis(_seats([true, false], ["Spieler", "Salz-Marie"]), [1])
_pruef("Zielrang erreicht: Kampagne gewonnen", Kampagne.gewonnen and Kampagne.meldungen.any(func(m): return "gewonnen" in String(m)))
Kampagne.elo = 1000.0
Kampagne.gewonnen = false
Kampagne.spielername = "Kaperfahrer"
Kampagne.beute = "peek"
Kampagne.kapitaen("Roter Jack").weg = 0
# --- Echte Partie gegen Jack im Simulationsmodus, mit Beute und Temperament
var partien_vorher := Kampagne.partien
Kampagne.starten("Roter Jack")
await _warte(func(): game = _find(get_tree().root, "Game"); return game != null, 20.0)
_pruef("Partie gegen den Kapitän steht", game != null and game.seats.size() == 2
and String(game.seats[1].name) == "Roter Jack" and int(game.seats[1].stufe) == 1)
_pruef("Spielername und Beute am Tisch", String(game.seats[0].name) == "Kaperfahrer"
and game.hand[0].has("peek") and game.hand[0].size() == 2 and Kampagne.beute == "")
_pruef("Kapitän bringt sein Temperament", float(game.seats[1].regler.get("bluff", 0.0)) == 0.65)
game.tempo = 0.0
game.simulation = true
game.seats[game.local_seat].ai = true
await _warte(func(): return game.phase == "over", 120.0)
_pruef("Partie endet", game.phase == "over")
_pruef("Ergebnis verbucht", Kampagne.partien == partien_vorher + 1 and Kampagne.aktiv == "" and Kampagne.letztes != "")
_pruef("Endfeld zeigt Wertung", game.hud.over_slot.visible and Kampagne.letztes in game.hud.over_title.text
and game.hud.over_karte.visible)
DirAccess.remove_absolute(ProjectSettings.globalize_path(Kampagne.datei))
_fertig()