update
This commit is contained in:
@@ -90,14 +90,14 @@ func _initialize() -> void:
|
||||
|
||||
|
||||
func test_kartenpool() -> void:
|
||||
check(Cards.all().size() == 77, "77 Karten")
|
||||
check(Cards.all().size() == 81, "81 Karten")
|
||||
check(Cards.all().all(func(c): return c.elements.size() == 1 and c.elements[0] in Cards.ELEMENTS), "jede Karte hat genau ein Element")
|
||||
for e in Cards.ELEMENTS:
|
||||
check(Cards.all().any(func(c): return c.elements == [e]), "Element vorhanden: " + e)
|
||||
for c in Cards.all():
|
||||
check(c.health > 0 and c.cost == maxi(1, floori((2 * c.attack + c.health) / 3.0)), "Kosten = (2 · Angriff + Leben) / 3, abgerundet: " + c.id)
|
||||
check(c.health > 0 and c.cost == floori((2 * c.attack + c.health) / 3.0), "Kosten = (2 · Angriff + Leben) / 3, abgerundet: " + c.id)
|
||||
check(c.keywords.is_empty() and c.text() == "", "Karten kommen ohne Eigenschaften: " + c.id)
|
||||
check(C("f_kobold").cost == 1 and C("f_wolf").cost == 2 and C("ff_phoenix").cost == 7 and C("e_wall").cost == 1 and C("f_drache").cost == 5, "Kostenbeispiele")
|
||||
check(C("f_funke").cost == 0 and C("f_kobold").cost == 1 and C("f_wolf").cost == 2 and C("ff_phoenix").cost == 7 and C("e_wall").cost == 1 and C("f_drache").cost == 5, "Kostenbeispiele, 0/2 kostet nichts")
|
||||
var a := C("f_wolf")
|
||||
var b := C("f_wolf")
|
||||
a.keywords.append("Spott")
|
||||
@@ -111,7 +111,7 @@ func test_kombos() -> void:
|
||||
check(Cards.combo_name(["Feuer", "Wasser", "Erde"]) == "Chimäre", "drei Elemente sind eine Chimäre")
|
||||
|
||||
|
||||
## Mana: 5 im ersten Zug, jede Runde eins mehr, der Rest verfällt; Legen kostet die Kartenkosten.
|
||||
## Mana: 1 im ersten Zug, jede Runde eins mehr, der Rest verfällt; Legen kostet die Kartenkosten.
|
||||
func test_mana_und_kosten() -> void:
|
||||
var s := setup(["f_wolf", "f_drache"])
|
||||
var g: Game = s[0]
|
||||
@@ -120,10 +120,10 @@ func test_mana_und_kosten() -> void:
|
||||
h.max_energy = 0
|
||||
h.turns = 0
|
||||
g.begin_turn(h)
|
||||
check(h.energy == Game.START_MANA and h.max_energy == Game.START_MANA, "erster Zug: 5 Mana")
|
||||
check(h.energy == Game.START_MANA and h.max_energy == Game.START_MANA, "erster Zug: 1 Mana")
|
||||
h.energy = 3 # Rest
|
||||
g.begin_turn(h)
|
||||
check(h.energy == Game.START_MANA + 1, "zweiter Zug: 6 Mana, der Rest ist verfallen")
|
||||
check(h.energy == Game.START_MANA + 1, "zweiter Zug: 2 Mana, der Rest ist verfallen")
|
||||
for i in 20:
|
||||
g.begin_turn(h)
|
||||
check(h.energy == Game.START_MANA + 21, "keine Obergrenze")
|
||||
@@ -133,7 +133,8 @@ func test_mana_und_kosten() -> void:
|
||||
check(Cards.fusion_value(4, 2) == 5 and Cards.fusion_value(8, 1) == 9 and Cards.fusion_value(2, 2) == 3 and Cards.fusion_value(0, 4) == 4 and Cards.fusion_value(8, 8) == 11, "Fusionswert: besserer Wert plus ein Drittel des schwächeren")
|
||||
|
||||
|
||||
## Start: fünf bezahlbare Karten, keine Wahl. Ziehen: 1 Mana, eine bezahlbare Karte vom Stapel.
|
||||
## Start: fünf im ersten Zug bezahlbare Karten, keine Wahl. Jeder Zug beginnt mit einer Karte;
|
||||
## Ziehen: 2 Mana, eine weitere bezahlbare Karte vom Stapel.
|
||||
func test_ziehen() -> void:
|
||||
var r := RandomNumberGenerator.new()
|
||||
r.seed = 1
|
||||
@@ -141,14 +142,17 @@ func test_ziehen() -> void:
|
||||
check(g.deck.size() == Cards.all().size() * DeckGen.COPIES - 2 * Game.START_HAND, "Stapel: jede Karte dreimal, zehn schon ausgegeben")
|
||||
for p in g.players:
|
||||
check(p.hand.size() == Game.START_HAND, "Start: fünf Karten auf der Hand")
|
||||
check(p.hand.all(func(c): return c.cost <= Game.START_MANA + p.start_bonus), "nur Karten, die im ersten Zug spielbar sind")
|
||||
check(p.hand.all(func(c): return c.cost <= Game.START_MANA), "nur Karten, die im ersten Zug spielbar sind")
|
||||
check(p.hand.all(func(c): return c != Cards.by_id(c.id)), "eigene Exemplare")
|
||||
var first: Game.Player = g.current()
|
||||
check(g.draw(first) == "Deine Hand ist voll", "fünf Handkarten sind das Limit")
|
||||
first.hand.pop_back()
|
||||
check(g.draw(first) == "Nicht genug Mana", "im ersten Zug reicht das Mana nicht zum Ziehen")
|
||||
first.energy = 3
|
||||
first.max_energy = 3
|
||||
var mana := first.energy
|
||||
var deck_before := g.deck.size()
|
||||
check(g.draw(first) == "" and first.energy == mana - 1 and first.hand.size() == Game.START_HAND, "gezogen: 1 Mana, eine Karte")
|
||||
check(g.draw(first) == "" and first.energy == mana - Game.DRAW_COST and first.hand.size() == Game.START_HAND, "gezogen: 2 Mana, eine Karte")
|
||||
check(first.hand.back().cost <= first.max_energy and g.deck.size() == deck_before - 1, "bezahlbar; zu teure liegen wieder unten im Stapel")
|
||||
first.energy = 0
|
||||
first.hand.pop_back()
|
||||
@@ -165,10 +169,25 @@ func test_ziehen() -> void:
|
||||
var seen_expensive := false
|
||||
for i in 12:
|
||||
first.hand = []
|
||||
first.energy = 20
|
||||
g.draw(first)
|
||||
if first.hand[0].cost > 5:
|
||||
seen_expensive = true
|
||||
check(seen_expensive, "mit 20 Mana kommen auch teure Karten")
|
||||
# Zugbeginn: eine Karte gratis, solange die Hand nicht voll ist
|
||||
var g5 := Game.new_battle(r)
|
||||
var p1: Game.Player = g5.current()
|
||||
var p2: Game.Player = g5.enemy_of(p1)
|
||||
g5.end_turn()
|
||||
check(p2.hand.size() == Game.START_HAND, "volle Hand: zu Zugbeginn kommt nichts")
|
||||
p2.hand.pop_back()
|
||||
p2.hand.pop_back()
|
||||
g5.end_turn()
|
||||
p1.hand.pop_back()
|
||||
g5.end_turn()
|
||||
check(p2.hand.size() == Game.START_HAND - 1 and p2.hand.back().cost <= p2.max_energy, "Zugbeginn: eine bezahlbare Karte gezogen")
|
||||
g5.end_turn()
|
||||
check(p1.hand.size() == Game.START_HAND, "auch der Startspieler zieht zu Zugbeginn")
|
||||
|
||||
|
||||
## Gelegte Wesen greifen erst im nächsten Zug an; kein Durchschlag, keine Heilung zu Zugbeginn.
|
||||
@@ -219,12 +238,12 @@ func test_elementvorteil() -> void:
|
||||
var wolf := put(o, "f_wolf") # Feuer 3/2
|
||||
var life: int = o.life
|
||||
g.attack(tiefen, wolf)
|
||||
check(wolf.health <= 0 and o.life == life and tiefen.health == 6 - 3, "Wasser gegen Feuer: +1 beim Zuschlagen, der Konter bleibt gleich, nichts schlägt durch")
|
||||
check(wolf.health <= 0 and o.life == life and tiefen.health == 6 - 2, "Wasser gegen Feuer: +1 beim Zuschlagen, der Konter macht 1 weniger, nichts schlägt durch")
|
||||
var s3 := setup()
|
||||
var w3 := put(s3[1], "f_wolf")
|
||||
var t3 := put(s3[2], "w_tiefen")
|
||||
s3[0].attack(w3, t3)
|
||||
check(t3.health == 6 - 2 and w3.health <= 0, "Feuer gegen Wasser: 1 weniger Schaden, der Konter bleibt gleich")
|
||||
check(t3.health == 6 - 2 and w3.health == 2 - 5, "Feuer gegen Wasser: 1 weniger Schaden, der Konter macht 1 mehr")
|
||||
var s2 := setup()
|
||||
var g2: Game = s2[0]
|
||||
var geist := put(s2[1], "w_geist") # Wasser 2/2
|
||||
@@ -451,7 +470,7 @@ func test_verschmelzen() -> void:
|
||||
check(hc.name == "Dampf" and hc.attack == 5 and hc.health == 7 and hc.cost == 5 and hc.fusions == 1, "Dampf auf der Hand mit 5/7 und Kosten 5")
|
||||
var lava := Cards.fused(C("f_asche"), C("f_kobold"), 4, 8)
|
||||
check(Cards.fused(lava, C("f_kobold")).attack == 5 and Cards.fused(lava, C("f_kobold")).health == 9, "ein Kobold macht Lava 4/8 zu 5/9, nie schlechter")
|
||||
check(g4.play_card(h4, hc) == "" and h4.energy == 4 and h4.board.back().name == "Dampf", "Ausspielen kostet die neuen Kosten")
|
||||
check(g4.play_card(h4, hc) == "" and h4.energy == 9 - 5 and h4.board.back().name == "Dampf", "Ausspielen kostet die neuen Kosten")
|
||||
check(g4.log.any(func(l): return l == "Flammenwolf und Tiefenwächter verschmelzen auf der Hand zu Dampf (5/7)."), "Verlauf")
|
||||
|
||||
|
||||
@@ -475,18 +494,16 @@ func test_gleiche_regeln() -> void:
|
||||
r.seed = 0
|
||||
var g := Game.new_battle(r)
|
||||
var first: Game.Player = g.players[0]
|
||||
check(g.current() == first and first.max_energy == Game.START_MANA and first.energy == Game.START_MANA, "Startspieler: 5 Mana, kein Bonus")
|
||||
check(g.current() == first and first.max_energy == Game.START_MANA and first.energy == Game.START_MANA, "Startspieler: 1 Mana, kein Bonus")
|
||||
check(g.players.all(func(p): return p.hand.size() == Game.START_HAND), "jeder beginnt mit fünf Karten")
|
||||
for p in g.players:
|
||||
check(p.life == Game.START_LIFE, "gleiches Leben")
|
||||
if p != first:
|
||||
check(p.start_bonus == 1, "Nachzieher: Bonus offen")
|
||||
g.end_turn()
|
||||
var second: Game.Player = g.players[1]
|
||||
check(g.current() == second and second.energy == Game.START_MANA + 1, "Nachzieher: 5 Mana plus Ausgleich")
|
||||
check(g.current() == second and second.energy == Game.START_MANA, "Nachzieher: ebenfalls 1 Mana, kein Ausgleich")
|
||||
for i in 2:
|
||||
g.end_turn()
|
||||
check(g.current() == second and second.max_energy == Game.START_MANA + 1 and second.energy == Game.START_MANA + 1, "Ausgleich nur einmal, Rest verfällt")
|
||||
check(g.current() == second and second.max_energy == Game.START_MANA + 1 and second.energy == Game.START_MANA + 1, "zweiter Zug: 2 Mana")
|
||||
|
||||
|
||||
func test_zugreihenfolge() -> void:
|
||||
@@ -756,11 +773,11 @@ func test_merkmale() -> void:
|
||||
var archi: Game.Player = g3.opponent
|
||||
check(g3.players[0] == g3.human, "feste Reihenfolge: Mensch beginnt")
|
||||
g3.end_turn()
|
||||
check(g3.current() == archi and archi.energy == Game.START_MANA + 2 + 1, "Archimagier hat im ersten Zug 2 Mana mehr (plus Ausgleich)")
|
||||
check(g3.current() == archi and archi.energy == Game.START_MANA + 2, "Archimagier hat im ersten Zug 2 Mana mehr")
|
||||
var nyx: Game.Player = Campaign.opponent(5)
|
||||
var g4 := Game.new_battle_with(nyx, r, true)
|
||||
g4.end_turn()
|
||||
check(nyx.max_energy == Game.START_MANA and nyx.energy == Game.START_MANA + 1 + 1, "Nyx bekommt 1 Mana mehr je Zug")
|
||||
check(nyx.max_energy == Game.START_MANA and nyx.energy == Game.START_MANA + 1, "Nyx bekommt 1 Mana mehr je Zug")
|
||||
|
||||
|
||||
func test_ki_zwei_schritte() -> void:
|
||||
|
||||
@@ -331,7 +331,7 @@ func test_gegnerauswahl() -> void:
|
||||
var opp: Game.Player = hard.game.opponent
|
||||
check(opp.max_life == Profile.DIFFICULTIES.schwer.life and hard.smart_ai, "Schwer: Gegner mit %d Leben, Vorausschau-KI" % Profile.DIFFICULTIES.schwer.life)
|
||||
check(hard.game.human.hand.size() == Game.START_HAND and hard.hand_views.size() == Game.START_HAND, "Start: fünf Karten auf der Hand")
|
||||
check(hard.game.human.hand.all(func(c): return c.cost <= Game.START_MANA + 1), "alle fünf sind im ersten Zug spielbar")
|
||||
check(hard.game.human.hand.all(func(c): return c.cost <= Game.START_MANA), "alle fünf sind im ersten Zug spielbar")
|
||||
await shot("05_starthand")
|
||||
check(hard.hero_panels[opp].position == BattleLayout.OPP_BOX.position, "der Gegner steht oben in der Mitte")
|
||||
await shot("11_kampf")
|
||||
@@ -507,7 +507,7 @@ func test_kampf_steuerung() -> void:
|
||||
g.human.hand = [Cards.by_id("f_wolf").copy()]
|
||||
scr.refresh()
|
||||
check(scr.hand_views.size() == 1 and scr.deck.enabled, "eine Handkarte, Stapel bereit")
|
||||
# Ziehen: 1 Mana weg, eine Karte landet auf der Hand
|
||||
# Ziehen: 2 Mana weg, eine Karte landet auf der Hand
|
||||
var mana: int = g.human.energy
|
||||
await click(scr.deck)
|
||||
check(g.human.energy == mana - Game.DRAW_COST and g.human.hand.size() == 2 and scr.hand_views.size() == 2, "gezogen: eine Karte auf der Hand")
|
||||
@@ -636,7 +636,7 @@ func test_kampf_elemente_und_verschmelzen() -> void:
|
||||
# Rechtsklick auf die Handkarte: Menü mit Verdeckt legen und Eigenschaften, ohne Verschmelzen
|
||||
await hover(scr.hand_views[0])
|
||||
await right_click_at(scr.hand_views[0].get_global_rect().get_center())
|
||||
check(scr.menu_layer.visible and find_button("Verdeckt legen ◆ 1", scr.menu_layer) != null and find_button("Spott ◆ 2", scr.menu_layer) != null, "Rechtsklick öffnet das Kartenmenü")
|
||||
check(scr.menu_layer.visible and find_button("Verdeckt legen ◆ %d" % g.human.hand[0].cost, scr.menu_layer) != null and find_button("Spott ◆ 2", scr.menu_layer) != null, "Rechtsklick öffnet das Kartenmenü")
|
||||
check(find_button("Verschmelzen mit … ◆ 1", scr.menu_layer) == null, "kein Verschmelzen im Rechtsklick-Menü")
|
||||
await shot("23_kartenmenue")
|
||||
await right_click()
|
||||
@@ -665,6 +665,10 @@ func test_kampf_elemente_und_verschmelzen() -> void:
|
||||
# Angriffsziel: Elementvorteil, verdeckte ohne Anzeige, Held gesperrt
|
||||
await click(scr.own_views[0])
|
||||
check(scr.selected == wolf and scr.tiles[falke.uid].matchup == 1 and scr.tiles[secret.uid].matchup == 0, "Angreifer gewählt: +1 gegen Luft, nichts gegen Verdeckte")
|
||||
check(scr.tiles[falke.uid].shown_stats() == [falke.power() - 1, falke.health], "der Falke zeigt seinen Konter gegen den Wolf (1 weniger) und sein echtes Leben")
|
||||
await hover(scr.tiles[falke.uid])
|
||||
check(scr.tiles[falke.uid].doomed and not scr.own_views[0].doomed and scr.own_views[0].shown_stats()[0] == wolf.power() + 1, "über dem Falken: er stirbt, der Wolf nicht, der Wolf schlägt mit +1 zu")
|
||||
await shot("23c_angreifer_gewaehlt")
|
||||
check(not g.can_attack(wolf, scr.opponent())[0], "Held nicht angreifbar, solange Wesen stehen")
|
||||
await click(scr.tiles[secret.uid])
|
||||
check(not secret.hidden and not (secret in scr.opponent().board), "Angriff deckt auf und tötet den Kobold")
|
||||
@@ -686,7 +690,7 @@ func test_kampf_elemente_und_verschmelzen() -> void:
|
||||
check(g.human.hand.size() == 2 and g.human.hand[0].name == "Inferno" and g.human.hand[0].attack == 3 and g.human.hand[0].health == 2, "zwei Kobolde auf der Hand zu Inferno 3/2")
|
||||
# Gamepad-Menü (Y) bietet Verdeckt legen und Verschmelzen mit …
|
||||
scr.open_menu(g.human.hand[0], Rect2(scr.hand_views[0].position, scr.hand_views[0].size), true)
|
||||
check(find_button("Verdeckt legen ◆ 2", scr.menu_layer) != null, "Gamepad-Menü: Verdeckt legen")
|
||||
check(find_button("Verdeckt legen ◆ %d" % g.human.hand[0].cost, scr.menu_layer) != null and g.human.hand[0].cost == 2, "Gamepad-Menü: Verdeckt legen, Inferno kostet 2")
|
||||
await click(find_button("Verschmelzen mit … ◆ 2", scr.menu_layer))
|
||||
check(scr.fuse_first == g.human.hand[0], "Partner wählen")
|
||||
await click(scr.hand_views[1])
|
||||
|
||||
Reference in New Issue
Block a user