Guide Admin ElementaQuest
Manuel du créateur de contenu : ajouter cartes, monstres, lieux géographiques, événements et missions. Couvre aussi les réglages d'équilibrage en live et la gestion des comptes joueurs.
is_admin()=true). Les sections 1-5 traitent du contenu jouable. La 6 est le levier d'équilibrage. La 7 est l'outil support. La 8 dépanne les problèmes courants.
Introduction
Accès à la console admin
Connexion via ElementaQuest_Admin.html. La console n'est accessible qu'aux comptes ayant is_admin() = true. Pour octroyer le rôle admin à un nouveau compte :
insert into public.admin_users (user_id) values ('UUID-DU-USER');
Structure de la console
| Onglet | Usage |
|---|---|
| 📊 Dashboard | Stats globales, derniers joueurs inscrits, activité live |
| 📍 Géo-locations | Lister/éditer les lieux disponibles pour la chasse |
| ✦ Événements | Créer/gérer Battle Royale et Boss Hunt |
| ➕ Créer | Création rapide d'une nouvelle géo-location |
| 👤 Joueurs | Recherche, reset, octroi de boosters/cartes |
| 🃏 Catalogue | Cartes et monstres existants (read-only en V1) |
| 📋 Missions | Templates de missions quotidiennes/hebdo |
| ⚙️ Réglages | Config live (rates booster, paliers Expert, coûts tickets…) |
1. Cartes
33 cartes au catalogue. Stockées dans la table public.cards. L'édition se fait actuellement en SQL ou via l'éditeur catalogue (V2 prévue). Voici la structure et les règles à respecter.
Schéma d'une carte
flammes, vague_deferlante. Sert de clé étrangère partout.atk (attaque), def (défense), heal (soin pur), special (effets sans dégât direct)atk = dégâts, pour def = bouclier, pour heal = PV récupérés, pour special selon l'effet.Effets supportés (moteur Phase C)
| Code | Description | Params utilisés |
|---|---|---|
pierce | Ignore les boucliers de l'adversaire | — |
shieldbreak | Détruit le bouclier de l'adv (Nova Solaire) | — |
lifesteal | Inflige X dégâts + soigne effectVal au self | effectVal |
freeze | Gèle l'adversaire 1 tour (passe son tour) | — |
boost | +50% dégâts sur prochaine attaque (Surpuissance) | — |
burn | Brûlure : effectVal dégâts/tour pendant effectDur | effectVal, effectDur |
dot | DoT : effectVal dégâts au tour suivant (Pluie Acide) | effectVal, effectDur |
heal_persistent | Soin persistant : value PV/tour pendant effectDur | effectDur |
block_persistent | Bloque tous dégâts pendant effectDur (Citadelle) | effectDur |
revive | Charge passive : ressuscite à effectVal PV à la mort | effectVal |
fire_boost | Inflige value, +effectVal sur prochaine carte feu | value, effectVal |
cancelskill | Inflige value, annule prochaine compétence adv (Extinction) | value |
reflect | Bouclier value + renvoie effectVal en cas d'attaque | value, effectVal |
leg_water | 40 dég + 20 PV self + gel adv (Diluvium) | — |
leg_marée | value dég/tour ×effectDur + 5 PV/tour ×effectDur | value, effectDur |
Limites & règles
- Maximum 1 carte légendaire par deck (trigger DB
trg_check_deck_leg_limit). - Un deck contient exactement 12 cartes + 1 monstre (validé front + back).
- Les variants gold/ultime du monstre n'affectent pas les cartes — uniquement les PV de base (100/120/150).
- Les cartes obtenues via boosters s'accumulent dans
user_cards(quantity++).
Ajouter une nouvelle carte (SQL)
insert into public.cards (id, name, type, cat, value, rarity, effect, effectVal, effectDur, description)
values (
'tornade', -- id slug
'Tornade', -- name
'eau', -- type
'atk', -- cat
18, -- value (dégâts)
'rare', -- rarity
'freeze', -- effect
null, null, -- effectVal, effectDur
'Inflige 18 dégâts et gèle l''adversaire 1 tour.'
);
type et sa rarity. Pas de table booster_pool séparée.
2. Monstres
3 monstres × 3 variants = 9 entités. Stockés dans public.monsters. Chaque monstre a 1 compétence active.
Schéma
aquonix, pyrakos, terragor.standard (100 PV), gold (120 PV), ultime (150 PV).give_starter_deck() si tu veux qu'il soit choisissable à l'inscription.
3. Géo-locations
Les lieux à découvrir. Stockés dans public.geo_locations. Création via l'onglet ➕ Créer de la console (recommandé) ou par SQL.
Schéma essentiel
geo_tags.radius_km du lieu est ignoré — c'est le réglage global geo.expert.validation_radius_km (défaut 80 km) qui s'applique à TOUS les lieux. Configurable dans ⚙️ Réglages.
Bon usage des indices
| Niveau | Style | Exemple (Tour Eiffel) |
|---|---|---|
| hint | Vague, atmosphérique | "Une dame de fer surveille la lumière." |
| hint_2 | Pays/région | "Capitale de l'amour, en Europe." |
| hint_3 | Quartier/repère proche | "À côté du Champ-de-Mars, 7e arrondissement." |
4. Événements
Événements temporaires : Battle Royale ou Boss Hunt. Onglet ✦ Événements. Stockés dans public.geo_events.
Battle Royale (BR)
Tous les joueurs cherchent le même lieu sur une fenêtre de temps. Score final = distance la plus proche.
- br_attempts : nombre d'essais autorisés (default 2 : un essai chaud/froid + un final)
- retry payant : 5 tickets = +1 essai supplémentaire (si activé via ⚙️
tickets.cost.br_retry) - best score conservé : un retry moins bon ne dégrade pas le score
- Coût d'entrée : 1 ticket par participation (configurable)
Boss Hunt (mode quiz)
Quiz 5 questions sur le lieu mystère. Réussite = découverte instantanée. Échec = cooldown configurable.
- boss_cooldown_minutes : temps entre 2 tentatives (default 1440 = 24h)
- skip cooldown : 1 ticket pour relancer immédiatement (configurable)
- Quiz généré dynamiquement à partir du lieu cible
status='draft' n'est pas visible des joueurs. Passer à active dès que les dates starts_at / ends_at sont définies. ended = clôturé, classement final calculé.
5. Missions
Missions quotidiennes (3) et hebdomadaires (2) tirées au hasard depuis mission_templates. Onglet 📋 Missions.
Triggers supportés
| Trigger | Quand ça incrémente ? |
|---|---|
open_booster | Ouverture d'un booster |
complete_geo_session | Découverte d'un lieu (n'importe quel mode) |
win_pvp | Victoire PvP (ranked ou casual) |
win_pvp_ranked | Victoire ranked uniquement |
win_expert | Session Expert terminée (peu importe le tier) |
recycle_card | Recyclage d'une carte |
play_card | Jouer une carte en combat (avec filtre type/rarity possible) |
Récompenses
Définies dans le template (reward_type + reward_value). Les principales :
booster: 1 booster du type spécifiéshards: éclats (= recycle_points convertibles)ticket: géo-tickets bonuspoints: points de score
6. Réglages (game_config)
L'onglet ⚙️ Réglages permet de modifier en live ~30 paramètres d'équilibrage sans redéploiement. Les changements sont propagés au client au prochain refresh (cache 5 min côté Booster/GeoHunt).
Catégories disponibles
| Catégorie | Que contrôle ? |
|---|---|
missions | Nombre de missions/jour, points bonus weekend |
boosters | Taux de drop par booster (somme = 100), pity légendaire |
geo | Paliers Expert (max_attempts par tier), rayon validation Expert |
pvp | ELO delta ranked, paliers milestone (boosters tous les N matchs) |
combat | HP par variant monstre, multiplicateurs élémentaires |
tickets | Coûts échange de tickets, BR/Boss skip, retry, toggles échange de tickets |
Validation automatique
- int / float : bornes
min_value/max_valuerespectées - percent_set : la somme des % doit faire 100 (rejet sinon)
- bool : toggle ON/OFF visuel
- tier_map : structure d'objet validée par les clés attendues
default_value). Pratique en cas de mauvais réglage. Le RPC est admin_reset_game_config.
7. Gestion joueurs
Onglet 👤 Joueurs. Recherche par username, email ou UUID.
Actions disponibles
| Action | RPC | Effet |
|---|---|---|
| Reset complet | admin_reset_user | Vide cartes/boosters/decks/stats. Garde le compte et le profile. |
| Octroi booster | grant_booster | Ajoute N boosters d'un type au joueur. (Pour compensation/bug.) |
| Reset starter | give_starter_deck | Si compte cassé : redonne le monstre starter + 4 boosters. |
8. Dépannage
"Permission denied for function X"
La fonction est révoquée pour authenticated. Soit elle est interne (correct), soit elle a été oubliée par K2. Vérifier :
-- Liste des EXECUTE accordés
select grantee, routine_name, privilege_type
from information_schema.routine_privileges
where routine_schema = 'public' and routine_name = 'NOM_RPC';
Si besoin : grant execute on function public.NOM_RPC(...) to authenticated;
Trigger anti-leg ne fonctionne pas
Vérifier que trg_check_deck_leg_limit existe et utilise jsonb_array_elements_text() (pas unnest) pour parser card_ids. Voir SQL B4_fix_trigger.
Game_config non chargé en client
Le cache côté client est de 5 minutes. Pour forcer un refresh immédiat : vider window.__gameConfig dans la console du navigateur, puis rafraîchir la page.
// Dans la console DevTools du navigateur
window.__gameConfig = null;
location.reload();
Joueur bloqué dans une room PvP zombie
Lancer manuellement cleanup_zombie_rooms() ou attendre le job auto (toutes les 10 min). Sinon, fermer la room directement :
update public.match_rooms
set status = 'ended', ended_at = now()
where id = 'UUID-ROOM' and status in ('waiting','playing');
Ouverture booster sans cartes ajoutées
Vérifier que le tirage côté client (Booster.html) appelle bien onBoosterOpened() à la fin (qui décrémente user_boosters + insert dans user_cards). Si seulement le visuel a fonctionné mais pas la DB, refaire un tirage. La V2 prévoit de déplacer cette logique côté serveur (RPC open_booster) pour éviter ces désynchros — voir K2 dans la roadmap.