small update

boss prototype, auto planter, visual reworks, bug fixes
This commit is contained in:
2026-08-29 10:45:34 +02:00
parent 6840b715de
commit feb4500c6c
31 changed files with 1293 additions and 213 deletions
+44 -15
View File
@@ -131,9 +131,9 @@ class RuneTest(unittest.TestCase):
self.assertIn(r2["id"], free)
self.assertNotIn(r1["id"], free)
def _ten_runes(self, data):
def _sac_runes(self, data):
ids = []
for _ in range(10):
for _ in range(runes.RUNE_SACRIFICE_COST):
ids.append(collection.add_rune("sapphire", data=data, save_now=False)["id"])
return ids
@@ -141,20 +141,20 @@ class RuneTest(unittest.TestCase):
r = collection.add_rune("ruby")
data = collection.load()
data["runes"][0]["pct"] = 25
sac = self._ten_runes(data)
sac = self._sac_runes(data)
collection.save(data)
err = collection.reroll_rune(r["id"], sac)
self.assertEqual(err, "")
new_pct = collection.load()["runes"][0]["pct"]
self.assertGreaterEqual(new_pct, 26) # at least 1% better
self.assertLessEqual(new_pct, 35)
self.assertEqual(len(collection.load()["runes"]), 1) # 10 consumed
self.assertEqual(len(collection.load()["runes"]), 1) # cost consumed
def test_reroll_brown_caps_at_15(self):
r = collection.add_rune("brown")
data = collection.load()
data["runes"][0]["pct"] = 5
sac = self._ten_runes(data)
sac = self._sac_runes(data)
collection.save(data)
err = collection.reroll_rune(r["id"], sac)
self.assertEqual(err, "")
@@ -166,27 +166,27 @@ class RuneTest(unittest.TestCase):
r = collection.add_rune("ruby")
data = collection.load()
data["runes"][0]["pct"] = 35
sac = self._ten_runes(data)
sac = self._sac_runes(data)
collection.save(data)
err = collection.reroll_rune(r["id"], sac)
self.assertEqual(err, "Already max roll")
self.assertEqual(len(collection.load()["runes"]), 11) # nothing consumed
self.assertEqual(len(collection.load()["runes"]), 1 + runes.RUNE_SACRIFICE_COST) # nothing consumed
def test_reroll_requires_exactly_ten(self):
def test_reroll_requires_exact_sacrifice_count(self):
r = collection.add_rune("ruby")
data = collection.load()
data["runes"][0]["pct"] = 25
sac = self._ten_runes(data)
sac = self._sac_runes(data)
collection.save(data)
self.assertEqual(collection.reroll_rune(r["id"], sac[:9]),
"Pick exactly 10 runes to sacrifice")
self.assertEqual(collection.reroll_rune(r["id"], sac[:runes.RUNE_SACRIFICE_COST - 1]),
f"Pick exactly {runes.RUNE_SACRIFICE_COST} runes to sacrifice")
def test_reroll_rejects_target_in_sacrifices(self):
r = collection.add_rune("ruby")
data = collection.load()
data["runes"][0]["pct"] = 25
sac = self._ten_runes(data)
sac[0] = r["id"] # 10 unique runes, but includes the upgrade target
sac = self._sac_runes(data)
sac[0] = r["id"] # unique runes, but includes the upgrade target
collection.save(data)
self.assertEqual(collection.reroll_rune(r["id"], sac),
"Cannot sacrifice the rune being upgraded")
@@ -196,7 +196,7 @@ class RuneTest(unittest.TestCase):
r2 = collection.add_rune("sapphire")
data = collection.load()
data["runes"][0]["pct"] = 25
sac = self._ten_runes(data)
sac = self._sac_runes(data)
sac[0] = r2["id"] # sacrifice the equipped rune
collection.save(data)
self._evolve_to(self.plant, 1, 10, 2)
@@ -338,6 +338,16 @@ class RuneTest(unittest.TestCase):
self.assertEqual(len(collection.rune_inventory()), before)
self.assertEqual(collection.available_coins(), 50)
def test_pearl_is_t2_crit_rune(self):
self.assertEqual(runes.tier("pearl"), 2)
self.assertEqual(runes.effect_for("pearl"), "crit")
self.assertEqual(runes.max_pct("pearl"), 40)
self.assertEqual(runes.roll_range("pearl"), "20–40%")
for _ in range(50):
self.assertGreaterEqual(runes.roll_pct("pearl"), 20)
self.assertLessEqual(runes.roll_pct("pearl"), 40)
self.assertEqual(runes.name("pearl"), "Pearl Rune")
class RuneBattleEffectTest(unittest.TestCase):
def _unit(self, name="A", team=TEAM_PLAYER, ptype="radiant", atk=50, spd=5,
@@ -378,7 +388,7 @@ class RuneBattleEffectTest(unittest.TestCase):
b = Battle([self._unit()], [t])
b.start()
b._shield(t, 100)
self.assertEqual(t.status["shield"], 130)
self.assertEqual(sum(a for a, _ in t.status["shield"]), 130)
def test_yellow_rune_boosts_healing(self):
heal = Skill("Mend", power=40, kind="heal", target="ally")
@@ -412,6 +422,25 @@ class RuneBattleEffectTest(unittest.TestCase):
b.use_skill(a, hit, t)
self.assertEqual(t.status["wilt"][1], 3) # lasts 3 turns
def test_pearl_rune_raises_crit_chance(self):
a = self._unit(runes=[("crit", 0.30)])
b = Battle([a], [self._unit("T", TEAM_ENEMY, "garden")])
b.start()
self.assertAlmostEqual(b._crit(a), 0.30)
def test_pearl_runes_stack_additively(self):
a = self._unit(runes=[("crit", 0.20), ("crit", 0.20)])
b = Battle([a], [self._unit("T", TEAM_ENEMY, "garden")])
b.start()
self.assertAlmostEqual(b._crit(a), 0.40)
def test_pearl_rune_adds_on_top_of_base_crit(self):
a = self._unit(runes=[("crit", 0.25)])
a.crit = 0.10
b = Battle([a], [self._unit("T", TEAM_ENEMY, "garden")])
b.start()
self.assertAlmostEqual(b._crit(a), 0.35)
if __name__ == "__main__":
unittest.main()