File size: 3,138 Bytes
463f868
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use crate::core::logic::*;
use crate::test_helpers::*;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn debug_q203_trace() {
        let mut state = GameState::default();
        let db = load_real_db();

        let live_id = 358;
        let niji_member_id = 4430;

        state.debug.debug_mode = true;

        // 1. Verify card data
        let member = db.get_member(niji_member_id);
        println!("=== MEMBER LOOKUP ===");
        println!(
            "get_member({}) = {:?}",
            niji_member_id,
            member.map(|m| (&m.name, &m.groups, m.card_id))
        );

        let live = db.get_live(live_id);
        println!("=== LIVE LOOKUP ===");
        println!(
            "get_live({}) = {:?}",
            live_id,
            live.map(|l| (&l.name, l.card_id))
        );
        if let Some(l) = live {
            println!("Live abilities count: {}", l.abilities.len());
            if !l.abilities.is_empty() {
                println!("Ability 0 trigger: {:?}", l.abilities[0].trigger);
                println!("Ability 0 bytecode: {:?}", l.abilities[0].bytecode);
                println!(
                    "Ability 0 conditions count: {}",
                    l.abilities[0].conditions.len()
                );
            }
        }

        // 2. Setup state
        state.players[0].live_zone[0] = live_id;
        state.players[0].stage[0] = niji_member_id;
        for _ in 0..5 {
            state.players[0].energy_zone.push(3001);
        }
        state.players[0].set_energy_tapped(0, true);

        // 3. Call handle_energy
        println!("\n=== HANDLE_ENERGY ===");
        let mut ctx = AbilityContext {
            source_card_id: niji_member_id,
            player_id: 0,
            activator_id: 0,
            ..Default::default()
        };
        let instr = crate::core::logic::interpreter::instruction::BytecodeInstruction::new(81, 1, 0, 0);
        crate::core::logic::interpreter::handlers::handle_energy(
            &mut state, &db, &mut ctx, &instr, 0,
        );
        println!(
            "activated_energy_group_mask = {} (binary: {:b})",
            state.players[0].activated_energy_group_mask,
            state.players[0].activated_energy_group_mask
        );
        println!("Expected: bit 2 set = 4 (binary: 100)");
        assert!(
            (state.players[0].activated_energy_group_mask & (1 << 2)) != 0,
            "FAIL: Energy mask does NOT have bit 2 set! Actual: {}",
            state.players[0].activated_energy_group_mask
        );

        // 4. Trigger OnLiveStart
        println!("\n=== TRIGGER ON_LIVE_START ===");
        state.trigger_abilities(&db, TriggerType::OnLiveStart, &ctx);
        state.process_trigger_queue(&db);

        println!("\n=== RESULT ===");
        println!(
            "live_score_bonus = {} (expected: 1)",
            state.players[0].live_score_bonus
        );
        assert_eq!(
            state.players[0].live_score_bonus, 1,
            "live_score_bonus should be 1"
        );
    }
}