Major networking overhaul to reduce latency and bandwidth: UDP Protocol Implementation: - Created UDP server handler with sequence number tracking (uint32 with wrapping support) - Implemented 1000-packet window for reordering tolerance - Packet structure: [seq_num(4) + msg_type(1) + update_id(2) + payload] - Handles 4+ billion packets without sequence number issues - Auto-fallback to TCP on >20% packet loss Binary Codec with Schema Versioning: - Extensible field-based format with version negotiation - Position encoding: 11-bit packed (6-bit x + 5-bit y for 40x30 grid) - Delta encoding for snake bodies: 2 bits per segment direction - Variable-length integers for compact numbers - String encoding: up to 16 chars with 4-bit length prefix - Player ID hashing: CRC32 for compact representation - zlib compression for payload reduction Partial Update System: - Splits large game states into independent packets <1280 bytes (IPv6 MTU) - Each packet is self-contained (packet loss affects only subset of snakes) - Smart snake segmenting for very long snakes (>100 segments) - Player name caching: sent once per player, then omitted - Metadata (food, game_running) separated from snake data 32-Player Support: - Extended COLOR_SNAKES array to 32 distinct colors - Server enforces MAX_PLAYERS=32 limit - Player names limited to MAX_PLAYER_NAME_LENGTH=16 - Name validation and sanitization - Color assignment with rotation through 32 colors Desktop Client Components: - UDP client with automatic TCP fallback - Partial state reassembly and tracking - Sequence validation and duplicate detection - Statistics tracking for fallback decisions Web Client Components: - 32-color palette matching Python colors - JavaScript binary codec (mirrors Python implementation) - Partial state tracker for reassembly - WebRTC DataChannel transport skeleton (for future use) - Graceful fallback to WebSocket Server Integration: - UDP server on port 8890 (configurable via --udp-port) - Integrated with existing TCP (8888) and WebSocket (8889) servers - Proper cleanup on shutdown - Command-line argument: --udp-port (0 to disable, default 8890) Performance Improvements: - ~75% bandwidth reduction (binary + compression vs JSON) - All packets guaranteed <1280 bytes (safe for all networks) - UDP eliminates TCP head-of-line blocking for lower latency - Independent partial updates gracefully handle packet loss - Delta encoding dramatically reduces snake body size Comprehensive Testing: - 46 tests total, all passing (100% success rate) - 15 UDP protocol tests (sequence wrapping, packet parsing, compression) - 20 binary codec tests (encoding, delta compression, strings, varint) - 11 partial update tests (splitting, reassembly, packet loss resilience) Files Added: - src/shared/binary_codec.py: Extensible binary serialization - src/shared/udp_protocol.py: UDP packet handling with sequence numbers - src/server/udp_handler.py: Async UDP server - src/server/partial_update.py: State splitting logic - src/client/udp_client.py: Desktop UDP client with TCP fallback - src/client/partial_state_tracker.py: Client-side reassembly - web/binary_codec.js: JavaScript binary codec - web/partial_state_tracker.js: JavaScript reassembly - web/webrtc_transport.js: WebRTC transport (ready for future use) - tests/test_udp_protocol.py: UDP protocol tests - tests/test_binary_codec.py: Binary codec tests - tests/test_partial_updates.py: Partial update tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
18 lines
1.6 KiB
JSON
18 lines
1.6 KiB
JSON
{
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(mkdir:*)",
|
|
"Bash(git init:*)",
|
|
"Bash(python:*)",
|
|
"Bash(pip install:*)",
|
|
"Bash(git log:*)",
|
|
"Bash(git add:*)",
|
|
"Bash(git commit -m \"$(cat <<''EOF''\nImplement stuck snake mechanics, persistent colors, and length display\n\nMajor gameplay changes:\n- Snakes no longer die from collisions\n- When blocked, snakes get \"stuck\" - head stays in place, tail shrinks by 1 per tick\n- Snakes auto-unstick when obstacle clears (other snakes move/shrink away)\n- Minimum snake length is 1 (head-only)\n- Game runs continuously without rounds or game-over state\n\nColor system:\n- Each player gets a persistent color for their entire connection\n- Colors assigned on join, rotate through available colors\n- Color follows player even after disconnect/reconnect\n- Works for both desktop and web clients\n\nDisplay improvements:\n- Show snake length instead of score\n- Length accurately reflects current snake size\n- Updates in real-time as snakes grow/shrink\n\nServer fixes:\n- Fixed HTTP server initialization issues\n- Changed default host to 0.0.0.0 for network multiplayer\n- Improved file serving with proper routing\n\nTesting:\n- Updated all collision tests for stuck mechanics\n- Added tests for stuck/unstick behavior\n- Added tests for color persistence\n- All 12 tests passing\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nEOF\n)\")",
|
|
"Bash(git push:*)",
|
|
"Bash(git commit:*)",
|
|
"Bash(cat:*)"
|
|
],
|
|
"deny": [],
|
|
"ask": []
|
|
}
|
|
} |