LovecaSim / engine /tests /cards /test_nonfiction.py
trioskosmos's picture
Upload folder using huggingface_hub
bb3fbf9 verified
print("STARTING SCRIPT")
from engine.game.game_state import initialize_game
from engine.models.enums import Area, Group
def test_nonfiction_ability_1_center_cost_diff():
# {{live_start.png|ライブ開始時}}自分のセンターエリアにいる『Liella!』のメンバーのコストが、相手のセンターエリアにいるメンバーより高い場合、このカードのスコアを+1する。
state = initialize_game(use_real_data=True)
p0 = state.players[0]
p1 = state.players[1]
# Setup Live Card: Nonfiction
card_no = "PL!SP-bp4-024-L"
card_id = -1
for cid, c in state.live_db.items():
if c.card_no == card_no:
card_id = cid
break
assert card_id != -1, "Card not found"
# Inject a mock high cost center for P0
p0_center_id = 9999
import numpy as np
from engine.models.card import MemberCard
# P0 Center: Liella (Group 3), Cost 5
p0_member = MemberCard(
card_id=p0_center_id,
card_no="test-p0",
name="Kanon",
cost=5,
hearts=np.zeros(7, dtype=np.int32),
blade_hearts=np.zeros(7, dtype=np.int32),
blades=1,
groups=[Group.LIELLA],
)
state.member_db[p0_center_id] = p0_member
# P1 Center: Cost 2
p1_center_id = 9998
p1_member = MemberCard(
card_id=p1_center_id,
card_no="test-p1",
name="Rival",
cost=2,
hearts=np.zeros(7, dtype=np.int32),
blade_hearts=np.zeros(7, dtype=np.int32),
blades=1,
)
state.member_db[p1_center_id] = p1_member
# Area.CENTER is 1
p0.stage[Area.CENTER] = p0_center_id
p1.stage[Area.CENTER] = p1_center_id
# Play Nonfiction to Live Zone
p0.live_zone = [card_id]
# Ability 1
ability = state.live_db[card_id].abilities[0]
# Trigger manually
print("DEBUG: Triggering Ability 1")
state.triggered_abilities.append((0, ability, {"card_id": card_id}))
state._process_rule_checks()
print("DEBUG: Finished _process_rule_checks Ability 1")
# Check if score boosted in live_score_bonus
assert p0.live_score_bonus == 1
# Case 2: Cost is Lower
p0.live_score_bonus = 0
p0_member.cost = 1
print("DEBUG: Triggering Ability 1 (Case 2)")
state.triggered_abilities.append((0, ability, {"card_id": card_id}))
state._process_rule_checks()
print("DEBUG: Finished _process_rule_checks Ability 1 (Case 2)")
# Should fail condition, no boost
assert p0.live_score_bonus == 0
def test_nonfiction_ability_2_left_side_hearts():
# {{live_start.png|ライブ開始時}}自分のステージの左サイドエリアにいる『Liella!』のメンバーが{{heart_02.png|heart02}}を3つ以上持つ場合、そのメンバーは、ライブ終了時まで、{{icon_blade.png|ブレード}}{{icon_blade.png|ブレード}}を得る。
state = initialize_game(use_real_data=True)
p0 = state.players[0]
card_no = "PL!SP-bp4-024-L"
card_id = -1
for cid, c in state.live_db.items():
if c.card_no == card_no:
card_id = cid
break
# Setup Left Side Member (Area.LEFT = 0)
left_id = 8888
import numpy as np
from engine.models.card import MemberCard
from engine.models.enums import Group
# Liella member, has Heart02 x3
# Heart02 assumed Red (Index 1)
hearts = np.zeros(7, dtype=np.int32)
hearts[1] = 3 # 3 Red Hearts
left_member = MemberCard(
card_id=left_id,
card_no="test-left",
name="Kekeru",
cost=2,
hearts=hearts,
blade_hearts=np.zeros(7, dtype=np.int32),
blades=1,
groups=[Group.LIELLA],
)
state.member_db[left_id] = left_member
p0.stage[Area.LEFT] = left_id
p0.live_zone = [card_id]
# Ability 2
ability = state.live_db[card_id].abilities[1]
from engine.models.ability import TriggerType
assert ability.trigger == TriggerType.ON_LIVE_START
# Execute
print("DEBUG: Triggering Ability 2")
state.triggered_abilities.append((0, ability, {"card_id": card_id}))
state._process_rule_checks()
print("DEBUG: Finished _process_rule_checks Ability 2")
# Check Buff
base_blades = left_member.blades # 1
# Use PlayerState method for effective blades
current_blades = p0.get_effective_blades(Area.LEFT, state.member_db)
assert current_blades == base_blades + 2
print("DEBUG: Ability 2 Test Passed")
if __name__ == "__main__":
test_nonfiction_ability_1_center_cost_diff()
test_nonfiction_ability_2_left_side_hearts()
print("ALL TESTS PASSED")