Rolldown wirksam gemacht: Bank-Board-Swap, Carry-Käufe im Roll, Spike an Level statt Runde
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -193,7 +193,15 @@ def grab_carousel_unit(p: PlayerState, pool: Pool, rng: random.Random) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def fill_board(p: PlayerState, artifact: dict) -> None:
|
def fill_board(p: PlayerState, artifact: dict) -> None:
|
||||||
"""Wie in TFT: freie Board-Plätze werden beim Kampfstart von der Bank aufgefüllt."""
|
"""Freie Board-Plätze auffüllen und stärkere Bank-Units einwechseln."""
|
||||||
p.bench.sort(key=lambda u: -unit_worth(artifact, u))
|
p.bench.sort(key=lambda u: -unit_worth(artifact, u))
|
||||||
while len(p.board) < p.level and p.bench:
|
while len(p.board) < p.level and p.bench:
|
||||||
p.board.append(p.bench.pop(0))
|
p.board.append(p.bench.pop(0))
|
||||||
|
for i, u in enumerate(p.board):
|
||||||
|
if not p.bench:
|
||||||
|
break
|
||||||
|
best = max(p.bench, key=lambda b: unit_worth(artifact, b))
|
||||||
|
if unit_worth(artifact, best) > unit_worth(artifact, u):
|
||||||
|
p.bench.remove(best)
|
||||||
|
p.bench.append(u)
|
||||||
|
p.board[i] = best
|
||||||
|
|||||||
@@ -12,21 +12,25 @@ from tft.sim.player import InvalidAction, PlayerState
|
|||||||
from tft.sim.pool import Pool
|
from tft.sim.pool import Pool
|
||||||
|
|
||||||
ARCHETYPES = {
|
ARCHETYPES = {
|
||||||
|
# roll_at_level: ab diesem Level (und Stage >= 4) wird auf roll_floor gerollt.
|
||||||
"fast8": {
|
"fast8": {
|
||||||
"level_targets": {"2-1": 4, "2-5": 5, "3-2": 6, "4-1": 7, "4-2": 8, "5-2": 9},
|
"level_targets": {"2-1": 4, "2-5": 5, "3-2": 6, "4-1": 7, "4-2": 8, "5-2": 9},
|
||||||
"roll_rounds": {"4-2": 30, "5-2": 20},
|
"roll_at_level": 8,
|
||||||
|
"roll_floor": 30,
|
||||||
"roll_low_hp": 40,
|
"roll_low_hp": 40,
|
||||||
"slow_roll_level": None,
|
"slow_roll_level": None,
|
||||||
},
|
},
|
||||||
"streaker": {
|
"streaker": {
|
||||||
"level_targets": {"2-1": 4, "2-5": 5, "3-1": 6, "3-5": 7, "4-5": 8, "5-5": 9},
|
"level_targets": {"2-1": 4, "2-5": 5, "3-1": 6, "3-5": 7, "4-5": 8, "5-5": 9},
|
||||||
"roll_rounds": {"4-1": 30, "4-5": 20},
|
"roll_at_level": 7,
|
||||||
|
"roll_floor": 30,
|
||||||
"roll_low_hp": 50,
|
"roll_low_hp": 50,
|
||||||
"slow_roll_level": None,
|
"slow_roll_level": None,
|
||||||
},
|
},
|
||||||
"reroll": {
|
"reroll": {
|
||||||
"level_targets": {"2-1": 4, "2-5": 5, "3-2": 6, "5-1": 7, "6-1": 8},
|
"level_targets": {"2-1": 4, "2-5": 5, "3-2": 6, "5-1": 7, "6-1": 8},
|
||||||
"roll_rounds": {},
|
"roll_at_level": None,
|
||||||
|
"roll_floor": 30,
|
||||||
"roll_low_hp": 40,
|
"roll_low_hp": 40,
|
||||||
"slow_roll_level": 6, # ab Level 6: Gold über 50 verrollen (Slow-Roll)
|
"slow_roll_level": 6, # ab Level 6: Gold über 50 verrollen (Slow-Roll)
|
||||||
},
|
},
|
||||||
@@ -69,8 +73,9 @@ def act(p: PlayerState, pool: Pool, artifact: dict, cfg: dict, rng: random.Rando
|
|||||||
floor = 50
|
floor = 50
|
||||||
if p.level >= max(params["level_targets"].values()):
|
if p.level >= max(params["level_targets"].values()):
|
||||||
floor = 50 # Endstufe erreicht: Überschuss in Upgrades rollen
|
floor = 50 # Endstufe erreicht: Überschuss in Upgrades rollen
|
||||||
if label in params["roll_rounds"]:
|
roll_level = params.get("roll_at_level")
|
||||||
floor = params["roll_rounds"][label]
|
if roll_level is not None and p.level >= roll_level and rnd["stage"] >= 4:
|
||||||
|
floor = params["roll_floor"]
|
||||||
if rnd["stage"] >= 4 and p.hp < params["roll_low_hp"]:
|
if rnd["stage"] >= 4 and p.hp < params["roll_low_hp"]:
|
||||||
floor = 0 # Not-Rolldown bei niedrigem Leben
|
floor = 0 # Not-Rolldown bei niedrigem Leben
|
||||||
|
|
||||||
@@ -102,13 +107,15 @@ def _buy_from_shop(p: PlayerState, pool: Pool, artifact: dict) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def _buy_upgrades(p: PlayerState, pool: Pool, artifact: dict) -> None:
|
def _buy_upgrades(p: PlayerState, pool: Pool, artifact: dict) -> None:
|
||||||
|
"""Im Rolldown: Kopien für Upgrades UND neue starke Carries (4-Cost+) kaufen."""
|
||||||
for slot, api in enumerate(list(p.shop)):
|
for slot, api in enumerate(list(p.shop)):
|
||||||
if api is None:
|
if api is None:
|
||||||
continue
|
continue
|
||||||
cost = artifact["static"]["units"][api]["cost"]
|
cost = artifact["static"]["units"][api]["cost"]
|
||||||
owned = sum(1 for u in p.board + p.bench
|
owned = sum(1 for u in p.board + p.bench
|
||||||
if u["api_name"] == api and u["stars"] < 3)
|
if u["api_name"] == api and u["stars"] < 3)
|
||||||
if p.gold >= cost and owned >= 1:
|
wants = owned >= 1 or (cost >= 4 and len(p.bench) < 7)
|
||||||
|
if p.gold >= cost and wants:
|
||||||
try:
|
try:
|
||||||
player.buy(p, slot, pool, artifact)
|
player.buy(p, slot, pool, artifact)
|
||||||
except InvalidAction:
|
except InvalidAction:
|
||||||
|
|||||||
Reference in New Issue
Block a user