rts-commander / docs /MIGRATION.md
Luigi's picture
deploy(web): full clean snapshot with app code and assets
12d64f8
|
raw
history blame
11.2 kB
# ๐Ÿ”„ Migration Guide: Pygame โ†’ Web Application
## Vue d'ensemble de la migration
Ce document explique comment le jeu RTS original en Pygame a รฉtรฉ transformรฉ en application web moderne.
## ๐ŸŽฏ Objectifs de la migration
1. โœ… **Accessibilitรฉ** : Jouer dans le navigateur sans installation
2. โœ… **Portabilitรฉ** : Compatible tous systรจmes d'exploitation
3. โœ… **Hรฉbergement** : Dรฉployable sur HuggingFace Spaces
4. โœ… **UI/UX** : Interface moderne et intuitive
5. โœ… **Architecture** : Prรชt pour le multijoueur
## ๐Ÿ“Š Comparaison des architectures
### Architecture Pygame (Avant)
```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Application Monolithique โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ main.py (2909 lignes) โ”‚ โ”‚
โ”‚ โ”‚ - Rendu Pygame โ”‚ โ”‚
โ”‚ โ”‚ - Logique de jeu โ”‚ โ”‚
โ”‚ โ”‚ - Input handling โ”‚ โ”‚
โ”‚ โ”‚ - IA โ”‚ โ”‚
โ”‚ โ”‚ - Tout dans un fichier โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ”‚ Dรฉpendances: โ”‚
โ”‚ - pygame (GUI desktop) โ”‚
โ”‚ - llama-cpp-python (IA) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```
### Architecture Web (Aprรจs)
```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Frontend (Client) โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ HTML5 Canvas + JavaScript โ”‚ โ”‚
โ”‚ โ”‚ - Rendu 2D โ”‚ โ”‚
โ”‚ โ”‚ - Input handling โ”‚ โ”‚
โ”‚ โ”‚ - UI/UX moderne โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ†• WebSocket
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Backend (Serveur) โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ FastAPI + Python โ”‚ โ”‚
โ”‚ โ”‚ - Logique de jeu โ”‚ โ”‚
โ”‚ โ”‚ - Game loop โ”‚ โ”‚
โ”‚ โ”‚ - IA โ”‚ โ”‚
โ”‚ โ”‚ - ร‰tat du jeu โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```
## ๐Ÿ”„ Mapping des composants
### Rendu (Rendering)
| Pygame | Web |
|--------|-----|
| `pygame.display.set_mode()` | HTML5 `<canvas>` |
| `pygame.Surface` | `CanvasRenderingContext2D` |
| `pygame.draw.rect()` | `ctx.fillRect()` |
| `pygame.draw.circle()` | `ctx.arc()` + `ctx.fill()` |
| `screen.blit()` | `ctx.drawImage()` |
| `pygame.display.flip()` | `requestAnimationFrame()` |
### Input Handling
| Pygame | Web |
|--------|-----|
| `pygame.event.get()` | `addEventListener('click')` |
| `pygame.mouse.get_pos()` | `event.clientX/Y` |
| `pygame.key.get_pressed()` | `addEventListener('keydown')` |
| `MOUSEBUTTONDOWN` | `mousedown` event |
| `KEYDOWN` | `keydown` event |
### Game Loop
| Pygame | Web |
|--------|-----|
| `while running:` loop | `requestAnimationFrame()` (client) |
| `clock.tick(60)` | 20 ticks/sec (serveur) |
| Direct update | WebSocket communication |
| Synchrone | Asynchrone |
### ร‰tat du jeu
| Pygame | Web |
|--------|-----|
| Variables globales | `GameState` class |
| Listes Python | Dictionnaires avec UUID |
| Mรฉmoire locale | Serveur + sync WebSocket |
## ๐Ÿ“ ร‰tapes de migration
### 1. Analyse du code original โœ…
**Fichiers analysรฉs** :
- `main.py` (2909 lignes) - Jeu principal
- `entities.py` - Classes Unit et Building
- `core/game.py` - Logique de jeu
- `balance.py` - ร‰quilibrage
- `systems/*` - Systรจmes (combat, pathfinding, etc.)
**Fonctionnalitรฉs identifiรฉes** :
- 5 types d'unitรฉs
- 6 types de bรขtiments
- Systรจme de ressources (Ore, Gems, Credits)
- IA ennemie
- Fog of war
- Production queue
- Pathfinding A*
### 2. Architecture backend โœ…
**Choix techniques** :
- FastAPI : Framework moderne, documentation auto
- WebSocket : Communication temps rรฉel
- Dataclasses : Types structurรฉs
- Async/await : Performance I/O
**Implรฉmentation** :
```python
# app.py (600+ lignes)
- FastAPI app avec routes
- WebSocket manager
- GameState avec logique
- Classes Unit, Building, Player
- Game loop 20 ticks/sec
- AI simple
```
### 3. Frontend moderne โœ…
**Technologies** :
- HTML5 Canvas : Rendu performant
- Vanilla JS : Pas de dรฉpendances lourdes
- CSS3 : Design moderne
- WebSocket API : Communication
**Composants crรฉรฉs** :
- `index.html` : Structure UI complรจte
- `styles.css` : Design professionnel
- `game.js` : Client de jeu complet
### 4. UI/UX Design โœ…
**Amรฉliorations** :
- Top bar avec ressources et stats
- Sidebars gauche/droite
- Minimap interactive
- Contrรดles camรฉra
- Notifications toast
- Loading screen
- Drag-to-select
- Animations fluides
**Palette de couleurs** :
```css
--primary-color: #4A90E2 (Bleu)
--secondary-color: #E74C3C (Rouge)
--success-color: #2ECC71 (Vert)
--warning-color: #F39C12 (Orange)
--dark-bg: #1a1a2e (Fond sombre)
```
### 5. Docker & Dรฉploiement โœ…
**Dockerfile** :
```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 7860
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
```
**HuggingFace Spaces** :
- README.md avec mรฉtadonnรฉes
- Configuration sdk: docker
- Port 7860 (standard HF)
## ๐ŸŽจ Amรฉliorations UI/UX
### Interface utilisateur
**Avant (Pygame)** :
- Interface basique
- Boutons simples
- Pas de minimap
- Contrรดles limitรฉs
- Pas de feedback visuel
**Aprรจs (Web)** :
- Interface professionnelle
- Design moderne avec gradients
- Minimap interactive
- Contrรดles intuitifs
- Animations et transitions
- Notifications en temps rรฉel
- Barres de progression
- Icรดnes emoji
### Expรฉrience utilisateur
| Aspect | Pygame | Web |
|--------|--------|-----|
| Installation | Requise | Aucune |
| Plateforme | Desktop uniquement | Tous navigateurs |
| Partage | Impossible | URL simple |
| Mise ร  jour | Manuelle | Automatique |
| Feedback | Limitรฉ | Riche |
## ๐Ÿ”ง Dรฉfis et solutions
### Dรฉfi 1 : Rendu temps rรฉel
**Problรจme** : Pygame gรจre le rendu directement, Web nรฉcessite Canvas
**Solution** :
```javascript
// Game loop client avec requestAnimationFrame
function render() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawTerrain();
drawBuildings();
drawUnits();
requestAnimationFrame(render);
}
```
### Dรฉfi 2 : Communication client-serveur
**Problรจme** : Pygame est monolithique, Web nรฉcessite sync
**Solution** :
- WebSocket pour communication bidirectionnelle
- ร‰tat cรดtรฉ serveur (source de vรฉritรฉ)
- Mises ร  jour incrรฉmentales
- Optimistic UI updates
### Dรฉfi 3 : ร‰tat du jeu
**Problรจme** : Variables globales vs รฉtat distribuรฉ
**Solution** :
```python
class GameState:
def __init__(self):
self.units: Dict[str, Unit] = {}
self.buildings: Dict[str, Building] = {}
self.players: Dict[int, Player] = {}
# ...
def to_dict(self):
# Sรฉrialisation pour WebSocket
return {...}
```
### Dรฉfi 4 : Performance
**Problรจme** : Latence rรฉseau vs jeu local
**Solution** :
- Game loop 20 ticks/sec (suffisant)
- Interpolation cรดtรฉ client
- Prediction local
- Compression donnรฉes
## ๐Ÿ“ˆ Mรฉtriques de migration
### Lignes de code
| Composant | Pygame | Web | Changement |
|-----------|--------|-----|------------|
| Backend | 2909 | 600 | -79% |
| Frontend | 0 | 1200 | NEW |
| CSS | 0 | 800 | NEW |
| **Total** | 2909 | 2600 | -11% |
### Fonctionnalitรฉs
| Catรฉgorie | Pygame | Web | Status |
|-----------|--------|-----|--------|
| Unitรฉs | 5 types | 5 types | โœ… Migrรฉ |
| Bรขtiments | 6 types | 6 types | โœ… Migrรฉ |
| Ressources | 3 types | 3 types | โœ… Migrรฉ |
| IA | Complexe | Simple | โš ๏ธ Simplifiรฉ |
| Fog of war | Oui | Oui | โœ… Migrรฉ |
| Pathfinding | A* | A suivre | ๐Ÿ“ TODO |
| Combat | Oui | Oui | โœ… Migrรฉ |
| UI | Basique | Moderne | โœ… Amรฉliorรฉ |
## ๐Ÿš€ Avantages de la migration
### 1. Accessibilitรฉ
- โœ… Aucune installation requise
- โœ… Fonctionne partout
- โœ… Partage facile
### 2. Dรฉveloppement
- โœ… Sรฉparation concerns
- โœ… Code plus maintenable
- โœ… Tests plus faciles
### 3. Dรฉploiement
- โœ… Docker containerisรฉ
- โœ… CI/CD simple
- โœ… Scaling horizontal
### 4. Expรฉrience utilisateur
- โœ… UI moderne
- โœ… Responsive
- โœ… Feedback riche
## ๐Ÿ“š Leรงons apprises
### Technique
1. **WebSocket > HTTP polling** : Latence faible, bidirectionnel
2. **Canvas > DOM** : Performance rendu
3. **Server authoritative** : Sรฉcuritรฉ, cohรฉrence
4. **Dataclasses** : Type safety Python
### Architecture
1. **Sรฉparer client/serveur** : Flexibilitรฉ
2. **ร‰tat immuable** : Debugging facile
3. **Event-driven** : Scalabilitรฉ
4. **Async/await** : Performance
### UI/UX
1. **Feedback visuel** : Crucial
2. **Animations** : Engagement
3. **Responsive design** : Accessibilitรฉ
4. **Minimap** : Navigation
## ๐ŸŽฏ Prochaines รฉtapes
### Court terme
- [ ] Implรฉmenter pathfinding A*
- [ ] Amรฉliorer IA
- [ ] Ajouter sons
- [ ] Tests unitaires
### Moyen terme
- [ ] Multijoueur rรฉel
- [ ] Systรจme de compte
- [ ] Classements
- [ ] Campagne
### Long terme
- [ ] Mobile app
- [ ] Tournois
- [ ] Modding support
- [ ] Esports ready
## ๐Ÿ“– Ressources
### Documentation
- [FastAPI](https://fastapi.tiangolo.com/)
- [WebSocket API](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)
- [Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API)
- [HuggingFace Spaces](https://huggingface.co/docs/hub/spaces)
### Outils
- [Docker](https://www.docker.com/)
- [Uvicorn](https://www.uvicorn.org/)
- [Pydantic](https://docs.pydantic.dev/)
---
**Migration rรฉussie ! ๐ŸŽ‰**
De Pygame desktop ร  Web application moderne en conservant toutes les fonctionnalitรฉs essentielles et en amรฉliorant l'expรฉrience utilisateur.