#!/usr/bin/env python3 """ Test mode for QLPyCon - Simulates game events to test UI Run with: python3 test_ui.py """ import curses import time import json import logging import queue import threading import sys from config import VERSION from state import GameState from parser import EventParser from ui import UIManager logger = logging.getLogger('test_ui') def simulate_game_events(game_state, parser, ui): """Simulate game events for testing""" # Wait for UI to initialize time.sleep(1) ui.print_message("=== TEST MODE - SIMULATING GAME EVENTS ===\n") ui.print_message(f"QLPyCon {VERSION} Test Mode\n\n") # Event 1: Match start time.sleep(2) event = { "TYPE": "MATCH_STARTED", "DATA": { "TIME": 0, "PLAYERS": [ {"NAME": "^1RedWarrior"}, {"NAME": "^4BlueSniper"} ] } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) # Event 2: Players join teams time.sleep(2) event = { "TYPE": "PLAYER_SWITCHTEAM", "DATA": { "TIME": 5, "KILLER": { "NAME": "^1RedWarrior", "TEAM": "RED", "OLD_TEAM": "SPECTATOR" } } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) time.sleep(1) event = { "TYPE": "PLAYER_SWITCHTEAM", "DATA": { "TIME": 6, "KILLER": { "NAME": "^4BlueSniper", "TEAM": "BLUE", "OLD_TEAM": "SPECTATOR" } } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) # Event 3: Some kills for i in range(10): time.sleep(3) match_time = 10 + (i * 5) event = { "TYPE": "PLAYER_DEATH", "DATA": { "TIME": match_time, "KILLER": { "NAME": "^1RedWarrior", "TEAM": "RED", "WEAPON": ["ROCKET", "RAILGUN", "LIGHTNING"][i % 3], "HEALTH": 100 - (i * 10) }, "VICTIM": { "NAME": "^4BlueSniper", "TEAM": "BLUE" } } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) # Counter-kill time.sleep(2) event = { "TYPE": "PLAYER_DEATH", "DATA": { "TIME": match_time + 2, "KILLER": { "NAME": "^4BlueSniper", "TEAM": "BLUE", "WEAPON": ["PLASMA", "GRENADE", "SHOTGUN"][i % 3], "HEALTH": 50 }, "VICTIM": { "NAME": "^1RedWarrior", "TEAM": "RED" } } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) # Event 4: Chat messages time.sleep(2) ui.print_message("^1RedWarrior^7: ^2gg!\n") time.sleep(1) ui.print_message("^4BlueSniper^7: ^2nice shots\n") # Event 5: Medal time.sleep(2) event = { "TYPE": "PLAYER_MEDAL", "DATA": { "TIME": 120, "NAME": "^1RedWarrior", "MEDAL": "EXCELLENT" } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) # Event 6: Match end time.sleep(3) event = { "TYPE": "MATCH_REPORT", "DATA": { "TIME": 180, "TSCORE0": "12", "TSCORE1": "8" } } result = parser.parse_event(json.dumps(event)) if result: ui.print_message(result) ui.update_server_info(game_state) ui.print_message("\n=== TEST COMPLETE ===\n") ui.print_message("Press Ctrl-C twice to quit\n") def test_main(screen): """Main test loop""" # Initialize UI ui = UIManager(screen, "tcp://127.0.0.1:27961 [TEST MODE]") # Setup logging log_handler = ui.setup_logging() logger.addHandler(log_handler) logger.setLevel(logging.INFO) # Initialize game state game_state = GameState() # Set some initial server info game_state.server_info.hostname = "^3Test Server [Demo Mode]" game_state.server_info.map = "bloodrun" game_state.server_info.gametype = "Team Deathmatch" game_state.server_info.timelimit = "10" game_state.server_info.fraglimit = "50" game_state.server_info.maxclients = "16" ui.update_server_info(game_state) # Create parser parser = EventParser(game_state) # Display startup message ui.print_message(f"*** QL pyCon Version {VERSION} - TEST MODE ***\n") ui.print_message("This mode simulates game events to test the UI\n") ui.print_message("Watch the timer tick in real-time!\n\n") # Start event simulation in background thread sim_thread = threading.Thread( target=simulate_game_events, args=(game_state, parser, ui), daemon=True ) sim_thread.start() # Setup input queue (even though we won't use it much) input_queue = ui.setup_input_queue() # Main loop - just keep updating UI try: while True: # Update server info display (this will show live timer) ui.update_server_info(game_state) # Process any user input while not input_queue.empty(): command = input_queue.get() ui.print_message(f">>> {command}\n") ui.print_message("[Test mode: commands not sent to server]\n") time.sleep(0.1) # Update 10 times per second except KeyboardInterrupt: pass if __name__ == '__main__': try: curses.wrapper(test_main) except KeyboardInterrupt: print("\nTest mode exited.")