Erfolge entfernt, der Bildschirm zeigt nur noch Statistik

- Die dreizehn Erfolge samt Belohnungen, Meldungen und Spielstandfeld sind weg
- Der bisherige Erfolgs-Bildschirm heißt Statistik und zeigt Kämpfe, Tagesaufgabe,
  Bestenliste, beste Karten und den CSV-Export

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
This commit is contained in:
Team3
2026-09-17 21:37:58 +02:00
parent 43073351b0
commit 89db101137
11 changed files with 29 additions and 120 deletions

View File

@@ -93,7 +93,7 @@ func _initialize() -> void:
test_ki_besser_als_gierig()
test_ki_spiele_enden()
test_spielstand_migration()
test_erfolge_und_tagesaufgabe()
test_tagesaufgabe()
test_kampagne()
test_fallen()
test_ki_sieht_fallen_nicht()
@@ -648,29 +648,25 @@ func test_spielstand_migration() -> void:
var alt := {"coins": 300, "collection": {"f_kobold": 2, "unbekannt": 1}, "deck": ["f_kobold", "f_kobold"]}
var p := Profile.from_dict(alt)
check(p.coins == 300 and p.collection == {"f_kobold": 2} and p.deck.size() == 2, "Version 1 gelesen")
check(p.stats.games == 0 and p.achievements.is_empty() and p.campaign_stage == 0, "Standardwerte ergänzt")
check(p.stats.games == 0 and p.campaign_stage == 0, "Standardwerte ergänzt")
check(p.settings.volume == 0.8 and p.settings.animations, "Einstellungen Standard")
p.stats.wins = 3
p.achievements.append("erster_sieg")
p.campaign_stage = 2
p.settings.volume = 0.3
var d := p.to_dict()
check(d.version == Profile.SAVE_VERSION, "Version gespeichert")
var p2 := Profile.from_dict(JSON.parse_string(JSON.stringify(d)))
check(p2.stats.wins == 3 and p2.achievements == ["erster_sieg"] and p2.campaign_stage == 2, "Version 2 gelesen")
check(p2.stats.wins == 3 and p2.campaign_stage == 2, "Version 2 gelesen")
check(is_equal_approx(p2.settings.volume, 0.3), "Einstellungen gelesen")
func test_erfolge_und_tagesaufgabe() -> void:
func test_tagesaufgabe() -> void:
Profile.today_override = "2026-09-16"
var p := Profile.starter()
var coins := p.coins
var reward := p.record_battle(true, 1, p.deck_cards())
check(reward == Profile.REWARD_WIN[1], "Duell-Belohnung")
check("erster_sieg" in p.achievements and "duellant" in p.achievements, "Erfolge Erster Sieg und Duellant")
check(not ("tischherr" in p.achievements), "Herr des Tisches noch offen")
check(p.coins == coins + reward + 100 + (p.daily_task().reward if p.daily.done else 0), "Münzen inklusive Erfolge")
check(p.notices.size() >= 2, "Meldungen vorhanden")
check(p.coins == coins + reward + (p.daily_task().reward if p.daily.done else 0), "Münzen verbucht")
p.take_notices()
check(p.notices.is_empty(), "Meldungen abgeholt")
check(p.daily.date == "2026-09-16" and p.daily.task != "", "Tagesaufgabe gesetzt")
@@ -690,14 +686,12 @@ func test_erfolge_und_tagesaufgabe() -> void:
p.refresh_daily()
check(p.daily.date == "2026-09-17" and not p.daily.done and p.daily.progress == 0, "neuer Tag, neue Aufgabe")
Profile.today_override = ""
# Mono-Deck-Erfolg
var mono := []
for cid in ["f_funke", "f_kobold", "f_wolf", "f_feuerball", "f_asche", "f_glutpfeil", "f_elementar"]:
for i in 3:
mono.append(Cards.by_id(cid))
mono = mono.slice(0, 20)
p.record_battle(true, 3, mono)
check("elementarist" in p.achievements and "tischherr" in p.achievements, "Elementarist und Herr des Tisches")
check(p.stats.wins == 3 and p.stats.wins_by_opp["1"] == 2, "Statistik")
@@ -719,7 +713,7 @@ func test_kampagne() -> void:
check(p.campaign_stage == 1 and reward == Profile.REWARD_LOSS, "Niederlage schaltet nichts frei")
p.campaign_stage = 9
p.record_battle(true, 5, p.deck_cards(), 9)
check(p.campaign_stage == 10 and "kampagnenheld" in p.achievements, "Kampagne abgeschlossen")
check(p.campaign_stage == 10, "Kampagne abgeschlossen")
var sim := Game.new_battle_with(Profile.starter().deck_cards(), Campaign.opponents(0, r), r)
var guard := 0
while sim.winner == "" and guard < 300:
@@ -1140,7 +1134,7 @@ func test_kapitel_zwei_und_merkmalwahl() -> void:
check(g.human.perks == ["feuer_angriff"] and g.log.any(func(l): return l.begins_with("Du: Feuerwesen")), "eigenes Merkmal wirkt und steht im Verlauf")
p.campaign_stage = 19
p.record_battle(true, 5, p.deck_cards(), 19)
check(p.campaign_stage == 20 and "elementmeister" in p.achievements, "Kapitel 2 abgeschlossen")
check(p.campaign_stage == 20, "Kapitel 2 abgeschlossen")
var v := Profile.from_dict(JSON.parse_string(JSON.stringify(p.to_dict())))
check(v.perk == "feuer_angriff" and v.campaign_stage == 20, "Version 5 gelesen")
@@ -1163,7 +1157,6 @@ func test_bestenliste() -> void:
check(p.records.streak == 0 and p.records.best_streak == 2, "Niederlage bricht die Serie")
for i in 5:
p.record_battle(true, 1, mono, -1, [], 10)
check("serie" in p.achievements, "Siegesserie-Erfolg")
var path := "user://test_statistik.csv"
check(p.export_stats(path) == "", "Statistik exportiert")
var text := FileAccess.get_file_as_string(path)

View File

@@ -165,7 +165,7 @@ func _ready() -> void:
await frames(3)
var fast := OS.get_environment("DINGER_FAST") != ""
var suite := [test_menu_und_regeln, test_gamepad_menue, test_booster, test_deckbau, test_gegnerauswahl, test_einstellungen,
test_erfolge, test_kampagne, test_werkstatt, test_sprache, test_anleitung, test_anleitung2,
test_statistik, test_kampagne, test_werkstatt, test_sprache, test_anleitung, test_anleitung2,
test_kampf_fortsetzen, test_gamepad_deckbau, test_deckcode, test_elementbooster]
if not fast:
suite += [test_kampf.bind(2, 3), test_kampf_abbrechen]
@@ -202,13 +202,8 @@ func test_booster() -> void:
var scr = screen()
check(scr is BoosterScreen, "Boosterbildschirm")
var coins: int = main.profile.coins
var ach_before: int = main.profile.achievements.size()
await click(scr.b_buy)
var bonus := 0
for a in Profile.ACHIEVEMENTS:
if a.id in main.profile.achievements.slice(ach_before):
bonus += a.reward
check(main.profile.coins == coins - Profile.BOOSTER_COST + bonus, "Booster bezahlt (plus Erfolgsmünzen %d)" % bonus)
check(main.profile.coins == coins - Profile.BOOSTER_COST, "Booster bezahlt")
check(scr.cards.size() == 5 and scr.revealed.is_empty(), "5 verdeckte Karten")
await shot("03_booster_zu")
var backs: Array = scr.slots.get_children().filter(func(c): return c is BoosterScreen.CardBack)
@@ -573,15 +568,15 @@ func test_einstellungen() -> void:
check(screen() is MenuScreen, "zurück im Menü")
func test_erfolge() -> void:
await click(find_button("Erfolge"))
check(screen() is AchievementsScreen, "Erfolge geöffnet")
func test_statistik() -> void:
await click(find_button("Statistik"))
check(screen() is StatsScreen, "Statistik geöffnet")
var csv := "user://statistik.csv"
if FileAccess.file_exists(csv):
DirAccess.remove_absolute(ProjectSettings.globalize_path(csv))
await click(find_button("Statistik exportieren"))
check(FileAccess.file_exists(csv) and "Gespeichert" in screen().export_label.text, "Statistik exportiert")
await shot("14_erfolge")
await shot("14_statistik")
await click(find_button("Zurück"))
check(screen() is MenuScreen, "zurück im Menü")