KI bewertet Kontrolle, Deckstärke mit Kurve und Statistik, Gegnervorschau, Deck-Vorschlag, Schwierigkeitstipp, DeckGen/NetState ausgelagert, Wasser gestärkt
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPgKvy5W9WRNFHjkm5QsHx
This commit is contained in:
@@ -70,7 +70,7 @@ var card_stats := {} # id -> {"played", "games", "wins"}
|
||||
var booster_since_mythic := 0
|
||||
var tutorial_done := false
|
||||
var perk := "" # gewähltes eigenes Merkmal (nach Kapitel 1)
|
||||
var records := {"streak": 0, "best_streak": 0, "fastest_win": 0}
|
||||
var records := {"streak": 0, "best_streak": 0, "fastest_win": 0, "loss_streak": 0}
|
||||
var challenge_week := -1 # Woche der zuletzt bestandenen Herausforderung
|
||||
|
||||
## Das aktive Deck (Kartenliste des gewählten Slots).
|
||||
@@ -174,7 +174,7 @@ static func from_dict(d: Dictionary) -> Profile:
|
||||
p.perk = ""
|
||||
var rc = d.get("records", {})
|
||||
p.records = {"streak": int(rc.get("streak", 0)), "best_streak": int(rc.get("best_streak", 0)),
|
||||
"fastest_win": int(rc.get("fastest_win", 0))}
|
||||
"fastest_win": int(rc.get("fastest_win", 0)), "loss_streak": int(rc.get("loss_streak", 0))}
|
||||
p.challenge_week = int(d.get("challenge_week", -1))
|
||||
return p
|
||||
|
||||
@@ -380,11 +380,17 @@ func record_battle(won: bool, n_opp: int, deck_used: Array, stage: int = -1, pla
|
||||
stats.games += 1
|
||||
if won:
|
||||
records.streak += 1
|
||||
records.loss_streak = 0
|
||||
records.best_streak = maxi(records.best_streak, records.streak)
|
||||
if turns > 0 and (records.fastest_win == 0 or turns < records.fastest_win):
|
||||
records.fastest_win = turns
|
||||
else:
|
||||
records.streak = 0
|
||||
records.loss_streak += 1
|
||||
var tip := suggest_difficulty()
|
||||
if tip != "" and stage < 0 and challenge.is_empty():
|
||||
notices.append("Tipp: %s. Schwierigkeit %s?" % [
|
||||
"%d Siege in Folge" % records.streak if won else "%d Niederlagen in Folge" % records.loss_streak, DIFFICULTIES[tip].name])
|
||||
for cid in played_ids:
|
||||
_stat(cid).played += 1
|
||||
var seen := {}
|
||||
@@ -477,10 +483,71 @@ func difficulty() -> Dictionary:
|
||||
return DIFFICULTIES.get(settings.get("difficulty", "normal"), DIFFICULTIES.normal)
|
||||
|
||||
|
||||
## Vorschlag: nach drei Siegen in Folge eine Stufe rauf, nach drei Niederlagen runter. "" = kein Vorschlag.
|
||||
func suggest_difficulty() -> String:
|
||||
var order := ["leicht", "normal", "schwer"]
|
||||
var i := order.find(str(settings.get("difficulty", "normal")))
|
||||
if records.streak >= 3 and i < order.size() - 1:
|
||||
return order[i + 1]
|
||||
if records.loss_streak >= 3 and i > 0:
|
||||
return order[i - 1]
|
||||
return ""
|
||||
|
||||
|
||||
## Eigene Deckstärke, mit Kartenstatistik gewichtet.
|
||||
func deck_rating(cards: Array = []) -> float:
|
||||
var deck_used: Array = cards if not cards.is_empty() else deck_cards()
|
||||
return Game.deck_rating(deck_used, card_stats)
|
||||
|
||||
|
||||
## Zielstärke der Gegnerdecks: eigene Deckstärke mal Schwierigkeitsfaktor.
|
||||
func target_rating(cards: Array = []) -> float:
|
||||
var deck_used: Array = cards if not cards.is_empty() else deck_cards()
|
||||
return Game.deck_rating(deck_used) * float(difficulty().factor)
|
||||
return deck_rating(cards) * float(difficulty().factor)
|
||||
|
||||
|
||||
## Tauscht die schwächste Karte des aktiven Decks gegen cid, wenn das Deck dadurch stärker und gültig bleibt.
|
||||
## dry_run: nur prüfen. Gibt "" zurück oder den Grund, warum nicht.
|
||||
func improve_deck_with(cid: String, dry_run: bool = false) -> String:
|
||||
if collection.get(cid, 0) <= 0:
|
||||
return "Karte nicht in der Sammlung"
|
||||
var card := Cards.by_id(cid)
|
||||
if deck.count(cid) >= mini(collection[cid], Game.MAX_COPIES):
|
||||
return "Schon so oft im Deck wie möglich"
|
||||
var elems := Game.deck_elements(deck_cards())
|
||||
for e in card.elements:
|
||||
if not (e in elems):
|
||||
elems.append(e)
|
||||
if elems.size() > Game.MAX_DECK_ELEMENTS:
|
||||
return "Passt nicht zu den Elementen des Decks"
|
||||
var weakest := ""
|
||||
var weakest_value := Cards.card_value(card)
|
||||
for other in deck:
|
||||
if other == cid:
|
||||
continue
|
||||
var v := Cards.card_value(Cards.by_id(other))
|
||||
if v < weakest_value:
|
||||
weakest_value = v
|
||||
weakest = other
|
||||
if weakest == "":
|
||||
return "Keine schwächere Karte im Deck"
|
||||
if dry_run:
|
||||
return ""
|
||||
var trial: Array = deck.duplicate()
|
||||
trial[trial.find(weakest)] = cid
|
||||
var ok := Game.validate_deck(trial.map(func(id): return Cards.by_id(id)), collection)
|
||||
if not ok[0]:
|
||||
return ok[1]
|
||||
deck = trial
|
||||
return ""
|
||||
|
||||
|
||||
## Karten aus new_ids, die das aktive Deck verbessern würden.
|
||||
func deck_suggestions(new_ids: Array) -> Array:
|
||||
var out := []
|
||||
for cid in new_ids:
|
||||
if not (cid in out) and improve_deck_with(cid, true) == "":
|
||||
out.append(cid)
|
||||
return out
|
||||
|
||||
|
||||
func perk_unlocked() -> bool:
|
||||
|
||||
Reference in New Issue
Block a user