small update
boss prototype, auto planter, visual reworks, bug fixes
This commit is contained in:
+44
-15
@@ -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()
|
||||
Reference in New Issue
Block a user