Spaces:
Sleeping
Sleeping
| import json | |
| import random | |
| def main(): | |
| # 1. Load Verified Pool | |
| try: | |
| with open("data/verified_card_pool.json", "r", encoding="utf-8") as f: | |
| verified_data = json.load(f) | |
| except FileNotFoundError: | |
| print("Error: data/verified_card_pool.json not found.") | |
| return | |
| # 2. Load Card DB | |
| try: | |
| with open("data/cards_compiled.json", "r", encoding="utf-8") as f: | |
| db_data = json.load(f) | |
| except FileNotFoundError: | |
| print("Error: data/cards_compiled.json not found.") | |
| return | |
| # Map CardNo -> ID and Data | |
| member_no_map = {} | |
| member_data_map = {} | |
| for cid, cdata in db_data.get("member_db", {}).items(): | |
| member_no_map[cdata["card_no"]] = int(cid) | |
| member_data_map[int(cid)] = cdata | |
| live_no_map = {} | |
| live_data_map = {} | |
| for cid, cdata in db_data.get("live_db", {}).items(): | |
| live_no_map[cdata["card_no"]] = int(cid) | |
| live_data_map[int(cid)] = cdata | |
| # 3. Build Pools | |
| ability_member_ids = [] | |
| ability_live_ids = [] | |
| # Support verified_abilities (legacy) + members (new) | |
| source_members = verified_data.get("verified_abilities", []) + verified_data.get("members", []) | |
| for v_no in source_members: | |
| if v_no in member_no_map: | |
| ability_member_ids.append(member_no_map[v_no]) | |
| source_lives = verified_data.get("verified_lives", []) + verified_data.get("lives", []) | |
| for v_no in source_lives: | |
| if v_no in live_no_map: | |
| ability_live_ids.append(live_no_map[v_no]) | |
| print("\nPool Stats:") | |
| print(f" Members Available: {len(ability_member_ids)}") | |
| print(f" Lives Available: {len(ability_live_ids)}") | |
| NUM_DECKS = 5 | |
| print(f"\n=== GENERATING {NUM_DECKS} TEST DECKS ===") | |
| for d_i in range(NUM_DECKS): | |
| # 4. Generate Deck | |
| deck_members = [] | |
| if len(ability_member_ids) == 48: | |
| deck_members = ability_member_ids[:] # Exact Copy | |
| else: | |
| for _ in range(48): | |
| if ability_member_ids: | |
| idx = random.randint(0, len(ability_member_ids) - 1) | |
| deck_members.append(ability_member_ids[idx]) | |
| deck_lives = [] | |
| if len(ability_live_ids) == 12: | |
| deck_lives = ability_live_ids[:] # Exact Copy | |
| else: | |
| for _ in range(12): | |
| if ability_live_ids: | |
| idx = random.randint(0, len(ability_live_ids) - 1) | |
| deck_lives.append(ability_live_ids[idx]) | |
| else: | |
| deck_lives.append(999) | |
| # 5. Validate | |
| member_counts = {} | |
| for mid in deck_members: | |
| member_counts[mid] = member_counts.get(mid, 0) + 1 | |
| live_counts = {} | |
| for lid in deck_lives: | |
| live_counts[lid] = live_counts.get(lid, 0) + 1 | |
| # Check constraints | |
| violations = [] | |
| if len(deck_members) != 48: | |
| violations.append(f"Member Count {len(deck_members)} != 48") | |
| if len(deck_lives) != 12: | |
| violations.append(f"Live Count {len(deck_lives)} != 12") | |
| for mid, count in member_counts.items(): | |
| if count > 4: | |
| # data = member_data_map.get(mid, {}) | |
| # name = data.get("card_no", str(mid)) | |
| violations.append(f"Member {mid} count {count} > 4") | |
| for lid, count in live_counts.items(): | |
| if count > 4: | |
| violations.append(f"Live {lid} count {count} > 4") | |
| status = "PASS" if not violations else "FAIL" | |
| print(f"\nDeck {d_i + 1}: {status}") | |
| if violations: | |
| print(f" Violations ({len(violations)}):") | |
| for v in violations[:3]: | |
| print(f" - {v}") | |
| if len(violations) > 3: | |
| print(f" - ... and {len(violations) - 3} more") | |
| # Show detail for first deck only or if requested | |
| if d_i == 0: | |
| print("\n -- Sample Content (Top 3 Members) --") | |
| sorted_mids = sorted(member_counts.keys()) | |
| for i, mid in enumerate(sorted_mids): | |
| if i >= 3: | |
| break | |
| count = member_counts[mid] | |
| data = member_data_map.get(mid, {}) | |
| card_no = data.get("card_no", "Unknown") | |
| print(f" ID {mid:<4} | Qty {count} | {card_no}") | |
| print(" -- Sample Content (Top 3 Lives) --") | |
| sorted_lids = sorted(live_counts.keys()) | |
| for i, lid in enumerate(sorted_lids): | |
| if i >= 3: | |
| break | |
| count = live_counts[lid] | |
| data = live_data_map.get(lid, {}) | |
| card_no = data.get("card_no", "Unknown") | |
| print(f" ID {lid:<4} | Qty {count} | {card_no}") | |
| print("\nEND OF REPORT") | |
| if __name__ == "__main__": | |
| main() | |