# Exile UI (native Linux)

Réécriture native pour Linux de [Lailloken/Exile-UI](https://github.com/Lailloken/Exile-UI)
(à l'origine un overlay AutoHotkey v1.1, Windows uniquement).

Cible : **Path of Exile 2**, **X11 et Wayland** (KDE Plasma 6 testé).
Stack : **Tauri v2** (backend Rust) + **SvelteKit/TypeScript** (frontend), livré en **AppImage**.

### Wayland

Un overlay de jeu a besoin de capacités que Wayland interdit aux clients
(se positionner soi-même, rester au-dessus, hotkeys globaux, détection de la
fenêtre active). L'app **force donc le backend XWayland** au démarrage quand un
serveur X (réel ou XWayland) est joignable — PoE2 tournant lui-même en XWayland
(Proton), les deux partagent le même espace X11 et tout fonctionne. Rien à
configurer. Pour les sessions X11 c'est sans effet.

> Si le compositeur replace/ne garde pas l'overlay au-dessus, créer une **règle
> de fenêtre KWin** pour « Exile UI Overlay » : *Garder au-dessus = Oui*,
> position/taille forcées, *ignorer la barre des tâches*. Jouer en **plein écran
> fenêtré** (borderless).

## Fonctionnalités

Socle + **Act-Tracker / leveling**, **timer de run**, **profils de personnage**
et **zone-layout viewer**.

### Act-Tracker / leveling

- Lecture en continu du `Client.txt` du jeu (détection de zone et de niveau via
  les lignes `Generating level … area "…"` et `… is now level N`).
- Détection automatique du chemin du log (installations Steam courantes +
  `libraryfolders.vdf`), ou saisie manuelle.
- **Overlay transparent, click-through, toujours au-dessus** du jeu, affichant
  le guide de leveling pas-à-pas (données PoE2 du projet d'origine), avec rendu
  du langage de balisage (`(img:)`, `(color:)`, `(quest:)`, `areaid… ;; nom`, `||`).
- **Progression automatique** : le guide avance quand on entre dans la zone
  cible d'une étape ; resynchronisation si on dévie.
- **Hotkeys globaux** configurables (suivant / précédent / afficher-masquer).
- Branche **league-start** vs non-league-start du guide.
- L'overlay n'apparaît que lorsque le jeu est au premier plan (optionnel).

### Timer de run

- Chronomètre de speedrun campagne : temps total + **splits par acte**, calqué
  sur le timer de l'outil d'origine.
- **Pause automatique** en ville/hideout et sur **inactivité (AFK)** — la
  détection AFK se fait par polling de la souris via `xdotool` (les API d'idle
  sont absentes sous Wayland/XWayland).
- Pause manuelle distincte de la pause automatique.

### Profils de personnage

- Profils créés manuellement, **liés à un personnage in-game par son nom**
  (reconnu dans le log) — pas d'API GGG (OAuth réservé).
- Chaque profil garde sa **propre progression**, sa branche de guide et son
  **timer** (avec splits par acte).

### Zone-layout viewer

- Sélecteur de layouts de zone interactif, **porté de l'`act-decoder`** AHK :
  arbre de décision sur les images groupées par `areaID`, qu'on affine
  manuellement selon ce qu'on voit à l'écran (aucune capture d'écran — ToS).
- Images de layouts PoE2 embarquées dans `static/layouts/`.

Réglages et profils persistés dans `~/.config/exile-ui/config.json`.

## Développement

Prérequis : Rust, Node 18+, et les libs Tauri (`webkit2gtk-4.1`, `gtk3`,
`libsoup-3.0`), plus `xdotool` (détection de la fenêtre active).

```bash
cd exile-ui
npm install
npm run tauri dev      # lancement en mode dev
npm run tauri build    # produit l'AppImage + .deb dans src-tauri/target/release/bundle/
```

> Sur certains systèmes le bundling AppImage nécessite
> `APPIMAGE_EXTRACT_AND_RUN=1 npm run tauri build` (FUSE).

## Architecture

```
src/                     frontend (SvelteKit, SPA)
  lib/api.ts             pont commandes/events Tauri
  lib/markup.ts          parseur du langage de balisage du guide → HTML
  lib/StepView.svelte    rendu d'une étape du guide (lignes + optionnels)
  lib/Overlay.svelte     fenêtre overlay (label "overlay")
  lib/Settings.svelte    fenêtre principale / réglages / profils (label "main")
  lib/Layouts.svelte     fenêtre du zone-layout viewer (label "layout")
  lib/layouts.ts         arbre de décision des layouts (manifest areaID → chemins)
src-tauri/src/
  lib.rs                 état partagé, commandes, fenêtres, hotkeys
  logwatch.rs            tail du Client.txt → parsing → events + progression
  leveltracker.rs        chargement du guide/zones, logique de progression
  timer.rs               timer de run (total + splits par acte, pauses auto/AFK)
  poe.rs                 détection du log + fenêtre active (X11/xdotool)
  config.rs              persistance config + profils de personnage
src-tauri/data/          données PoE2 embarquées (guide2, areas2, gems2)
static/layouts/          images de layouts de zone (zone-layout viewer)
```

Les fenêtres chargent le même bundle SPA ; la vue est choisie selon le label de
la fenêtre (`overlay`, `main`, `layout`).

## Crédits

Données de leveling, zones et gemmes dérivées du projet original
[Lailloken/Exile-UI](https://github.com/Lailloken/Exile-UI). Ce fork n'est ni
affilié ni approuvé par Grinding Gear Games.
