Documentation Joueur
Cette page explique comment jouer et programmer un robot dans Learn From Scraps sans devoir lire le code du projet.
Principe
Chaque robot possede un script. Au debut de son tour, le moteur execute la fonction d'entree my_turn, ou son alias localise mon_tour. Les actions appelees dans ce script consomment des points d'action, modifient la position du robot, attaquent, soignent, lisent la carte ou changent le terrain.
Exemple minimal :
my_turn {
say("Ready")
move_forward()
sword_swing()
}
Tour de jeu
- Le robot commence son tour avec ses points d'action disponibles.
- Les actions sont executees dans l'ordre du script.
- Certaines actions coutent plus cher si elles sont repetees dans le meme tour, par exemple move_forward, move_backward, jump et dash.
- Si une action est impossible, le moteur peut depenser les AP puis journaliser un avertissement de gameplay selon l'action.
- Les getters comme get_pos_x() ou scan_tile(x, y) ne sont pas des actions de combat : ils servent a lire l'etat du jeu.
Carte et tuiles
Les cartes utilisent des codes courts :
| Code | Sens | Effet general |
|---|
| FL | Floor | Tuile normale praticable. |
| WL | Wall | Mur destructible selon les actions. |
| IW | Indestructible Wall | Mur infranchissable et non destructible. |
| HO | Hole | Trou, dangereux ou bloquant selon l'action. |
| SP | Spikes | Pieges/pics, infligent des degats quand un robot arrive dessus. |
| WA | Water | Eau, traitee comme obstacle par la perception actuelle. |
Programmer son robot
Utilisez my_turn comme point d'entree :
my_turn { if (scan_tile(1, 0) = "enemy") { sword_swing() } else { move_forward() } } Vous pouvez creer des fonctions :
my_turn {
if (scan_tile(1, 0) = "enemy") {
sword_swing()
} else {
move_forward()
}
}
def attack_if_close {
if (scan_tile(1, 0) = "enemy") {
sword_swing()
}
}
my_turn {
attack_if_close()
}
Lire l'environnement
Les blocs de perception permettent de prendre des decisions :
- get_pos_x() et get_pos_y() donnent votre position.
- scan_tile(x, y) renvoie empty, ally, enemy, obstacle ou out_of_bounds.
- is_tile_empty(x, y) indique si une tuile peut etre consideree vide.
- get_tile_type(x, y) renvoie le code de tuile comme FL ou WL.
- get_tile_occupant_type(x, y) renvoie ally, enemy, unknown_entity, none, obstacle ou out_of_bounds.
- get_tile_occupant_id(x, y) renvoie l'id visible de l'occupant, ou une chaine vide.
- get_entity_x(id), get_entity_y(id), get_entity_health(id), is_entity_alive(id) et get_entity_team(id) lisent une entite connue.
Actions principales
- Mouvement : move_forward, move_backward, turn, face_north, face_south, face_east, face_west, jump, dash.
- Attaque : sword_swing, spear, kick, pistol, grenade, bazooka, lighter, fire_wave, tazer, lazer, ultra_lazer.
- Support : heal, cooling_system, repair_system, say.
- Terrain : place_trap, dig.
Alias localises
Les exemples historiques de cette page gardent les noms d'action anglais, mais le backend accepte aussi des alias ASCII pour les scripts de joueurs :
La reference complete est dans Reference Blocs.
- Francais : mon_tour, fonction, repeter, tourner, avancer, reculer, regarder_nord, charger, lancer_grenade, soigner, creuser, dire.
- Espagnol : mi_turno, funcion, repetir, girar, avanzar, retroceder, mirar_norte, embestir, lanzar_granada, curar, cavar, decir.
Effets de statut
- overheat inflige des degats pendant plusieurs tours et peut etre retire avec cooling_system().
- short-circuit reduit les AP et peut etre retire avec repair_system().
Conseils
- Utilisez say("message") pour deboguer visuellement une strategie.
- Testez d'abord des scripts courts.
- Lisez la carte avec les getters avant de lancer une action risquee.
- Gardez assez d'AP pour vous repositionner apres une attaque.
- Les actions a zone ou projectile peuvent toucher plusieurs cases selon leur pattern.
Guide LiteralScraps
LiteralScraps est le langage de script execute par le moteur. Sa grammaire actuelle est definie dans backend/LFS.Scripting/Grammar/LiteralScraps.g4.
Point d'entree
Un script doit contenir une seule fonction d'entree :
my_turn { move_forward() } Aliases d'entree acceptes :
- my_turn
- mon_tour
- mein_zug
- mi_turno
- minha_vez
my_turn {
move_forward()
}
Fonctions
Les fonctions peuvent etre declarees avec def, function, definir, définir, fonction, funktion, funcion, función ou função.
def step_twice { move_forward() move_forward() } my_turn { step_twice() } Les fonctions peuvent recevoir des parametres :
def step_twice {
move_forward()
move_forward()
}
my_turn {
step_twice()
}
def speak(message) {
say(message)
}
my_turn {
speak("Hello")
}
Variables
Une variable est creee ou remplacee avec =.
my_turn {
x = get_pos_x()
y = get_pos_y()
say("Position checked")
}
Conditions
Les mots-cles reconnus sont if, si, wenn et else, sinon, sonst, sino, senão.
my_turn {
if (scan_tile(1, 0) = "enemy") {
sword_swing()
} else {
move_forward()
}
}
Boucles
repeat repete un bloc un nombre fixe de fois.
my_turn { repeat(2) { move_forward() } } while repete tant qu'une condition reste vraie.
my_turn { while (get_pos_x() < 3) { move_forward() } } Aliases de boucle :
- repeat, repeter, répéter, wiederhole, repetir
- while, tantque, solange, mientras, enquanto
my_turn {
repeat(2) {
move_forward()
}
}
my_turn {
while (get_pos_x() < 3) {
move_forward()
}
}
Retour de fonction
return, retourne, retour, zurück, devuelve et retorna renvoient une valeur.
def enemy_ahead {
return scan_tile(1, 0) = "enemy"
}
Expressions
LiteralScraps accepte :
- nombres entiers ou decimaux
- chaines entre guillemets doubles
- variables
- appels de fonctions
- parentheses
- operations +, -, *, /
- comparaisons >, <, =, !=, >=, <=
- logique booleenne avec & et |
Erreurs frequentes
- Plus d'une fonction d'entree dans le meme script.
- Appeler une action inconnue.
- Appeler un getter avec le mauvais nombre d'arguments.
- Appeler say() sans message.
- Appeler grenade avec un seul argument : elle accepte grenade() ou grenade(x, y).
- Utiliser une syntaxe for : le token existe dans la grammaire, mais la regle for n'est pas active dans le parser actuel.
Reference Blocs
Cette reference decrit les blocs actuellement supportes par le backend. Elle est basee sur la grammaire LiteralScraps, les builtins de perception et configs_json/GameConfig.json.
Blocs de langage
| Bloc | Syntaxe | Usage | Placeholder image |
|---|
| Entree de tour | my_turn { ... } ou mon_tour { ... } | Point d'entree execute au debut du tour du robot. Une seule entree est autorisee par script. | assets/images/blocks/language/my-turn.png |
| Fonction | def name { ... } / function name { ... } / définir name { ... } | Isole une logique reutilisable. Peut recevoir des parametres. | assets/images/blocks/language/function.png |
| Appel | name() ou name(arg1, arg2) | Appelle une fonction utilisateur, un getter ou une action. | assets/images/blocks/language/function-call.png |
| Variable | name = expression | Stocke une valeur temporaire pendant l'execution du script. | assets/images/blocks/language/variable-set.png |
| Condition | if (condition) { ... } else { ... } | Execute un bloc selon une condition. Alias: if, si, wenn; else, sinon, sonst, sino, senão. | assets/images/blocks/language/if-else.png |
| Repeat | repeat(3) { ... } | Repete un bloc un nombre fixe de fois. Alias: repeat, répéter, wiederhole, repetir. | assets/images/blocks/language/repeat.png |
| While | while (get_pos_x() < 3) { ... } | Repete un bloc tant que la condition reste vraie. Alias: while, tantque, solange, mientras, enquanto. | assets/images/blocks/language/while.png |
| Return | return expression | Renvoie une valeur depuis une fonction. Alias: return, retourne, retour, zurück, devuelve, retorna. | assets/images/blocks/language/return.png |
| Operations | a + b, a - b, a * b, a / b | Calcule une expression numerique. | assets/images/blocks/language/operators.png |
| Comparaisons | >, <, =, !=, >=, <= | Compare deux expressions. | assets/images/blocks/language/comparators.png |
| Logique | condition & condition, condition | condition | Combine des conditions booleennes. | assets/images/blocks/language/boolean-logic.png |
Getters et perception
| Getter | Syntaxe | Retour / usage | Placeholder image |
|---|
| Position X | get_pos_x() | Coordonnée X du robot courant. | assets/images/blocks/getters/get-pos-x.png |
| Position Y | get_pos_y() | Coordonnée Y du robot courant. | assets/images/blocks/getters/get-pos-y.png |
| Scanner une tuile | scan_tile(x, y) | Renvoie empty, ally, enemy, obstacle ou out_of_bounds; enregistre aussi la connaissance de la tuile. | assets/images/blocks/getters/scan-tile.png |
| Tuile vide | is_tile_empty(x, y) | Renvoie si la tuile est lisible, non obstacle et sans entite vivante. | assets/images/blocks/getters/is-tile-empty.png |
| Type de tuile | get_tile_type(x, y) | Renvoie un code comme FL, WL, IW, HO, SP, WA, ou une chaine vide si inconnu. | assets/images/blocks/getters/get-tile-type.png |
| Type d'occupant | get_tile_occupant_type(x, y) | Renvoie ally, enemy, unknown_entity, none, obstacle ou out_of_bounds. | assets/images/blocks/getters/get-tile-occupant-type.png |
| Id d'occupant | get_tile_occupant_id(x, y) | Renvoie l'id visible de l'occupant ou une chaine vide. | assets/images/blocks/getters/get-tile-occupant-id.png |
| X d'une entite | get_entity_x("id") | Renvoie X pour une entite connue, sinon -1. | assets/images/blocks/getters/get-entity-x.png |
| Y d'une entite | get_entity_y("id") | Renvoie Y pour une entite connue, sinon -1. | assets/images/blocks/getters/get-entity-y.png |
| Vie d'une entite | get_entity_health("id") | Renvoie les PV connus, sinon -1. | assets/images/blocks/getters/get-entity-health.png |
| Entite vivante | is_entity_alive("id") | Renvoie si l'entite connue est vivante. | assets/images/blocks/getters/is-entity-alive.png |
| Equipe d'une entite | get_entity_team("id") | Renvoie l'index d'equipe connu, sinon -1. | assets/images/blocks/getters/get-entity-team.png |
Actions de mouvement
| Action | Alias script | Cout AP | Usage / limites | Placeholder image |
|---|
| Turn | turn, tourner | 0 | turn(degrees) tourne le robot. Sans argument, le runtime applique 90 degres par defaut. | assets/images/blocks/movement/turn.png |
| Face North | face_north | 0 | Oriente le robot vers le nord. | assets/images/blocks/movement/face-north.png |
| Face South | face_south | 0 | Oriente le robot vers le sud. | assets/images/blocks/movement/face-south.png |
| Face East | face_east | 0 | Oriente le robot vers l'est. | assets/images/blocks/movement/face-east.png |
| Face West | face_west | 0 | Oriente le robot vers l'ouest. | assets/images/blocks/movement/face-west.png |
| Move Forward | move_forward, avancer | baseCost + usageCount, base 1 | Avance d'une tuile. Les arguments numeriques peuvent modifier le nombre de pas. | assets/images/blocks/movement/move-forward.png |
| Move Backward | move_backward, reculer | baseCost + usageCount, base 1 | Recule d'une tuile. Les arguments numeriques peuvent modifier le nombre de pas. | assets/images/blocks/movement/move-backward.png |
| Jump | jump, sauter | previousCost + usageCount, base 2 | Saute de deux tuiles avec le pattern path-forward. | assets/images/blocks/movement/jump.png |
| Dash | dash, precipitation | previousCost + usageCount * 2, base 2 | Fonce jusqu'a trois tuiles, inflige 3 degats en collision via line-contact. | assets/images/blocks/movement/dash.png |
Actions offensives
| Action | Alias script | Cout AP | Usage / limites | Placeholder image |
|---|
| Sword Swing | sword_swing, coup_d_epee | 1 | Arc melee devant le robot, 10 degats. | assets/images/blocks/offense/sword-swing.png |
| Spear | spear, lance | 2 | Ligne de contact jusqu'a 2 cases, 9 degats. | assets/images/blocks/offense/spear.png |
| Kick | kick, coup_de_pied | 2 | Case melee devant, 7 degats, pousse de 3 tuiles avec bonus contre mur/trou. | assets/images/blocks/offense/kick.png |
| Pistol | pistol, pistolet | 2 | Projectile ligne jusqu'a 8 cases, 6 degats, bloque par WL, IW, SHIELD. | assets/images/blocks/offense/pistol.png |
| Grenade | grenade | 4 | grenade() cible par defaut 5 cases devant; grenade(x, y) cible des coordonnees. Explosion rayon 1, 12 degats, peut toucher l'utilisateur et detruire des murs. | assets/images/blocks/offense/grenade.png |
| Bazooka | bazooka, lance_roquettes | 5 | Projectile jusqu'a 10 cases, 20 degats, detruit les murs destructibles, peut toucher l'utilisateur. | assets/images/blocks/offense/bazooka.png |
| Lighter | lighter, briquet | 3 | Melee devant, applique overheat a 100%, pas de degats directs. | assets/images/blocks/offense/lighter.png |
| Fire Wave | fire_wave, vague_de_feu | 4 | Anneau rayon 1 autour du robot, 10 degats, overheat a 35%. | assets/images/blocks/offense/fire-wave.png |
| Tazer | tazer, taser | 2 | Melee devant, 12 degats, short-circuit a 35%. | assets/images/blocks/offense/tazer.png |
| Lazer | lazer, laser | 4 | Ligne laser jusqu'a 10 cases, perce les ennemis, 12 degats, short-circuit a 35%, bloque par murs. | assets/images/blocks/offense/lazer.png |
| Ultra Lazer | ultra_lazer, ultra_laser | 7 | Ligne laser jusqu'a 12 cases, 25 degats, perce ennemis et murs, short-circuit a 100%, une fois par tour. | assets/images/blocks/offense/ultra-lazer.png |
Support et terrain
| Action | Alias script | Cout AP | Usage / limites | Placeholder image |
|---|
| Place Trap | place_trap, poser_piege | 4 | Place des pics sur la tuile FL vide devant le robot; degats de piege 4. | assets/images/blocks/terrain/place-trap.png |
| Heal | heal, soigner | 2 | Soigne 6 PV, limite aux PV max; journalise un warning si le robot est deja full life. | assets/images/blocks/support/heal.png |
| Cooling System | cooling_system, systeme_de_refroidissement | 3 | Retire overheat; si absent, depense les AP et journalise un warning. | assets/images/blocks/support/cooling-system.png |
| Repair System | repair_system, systeme_de_reparation | 3 | Retire short-circuit; si absent, depense les AP et journalise un warning. | assets/images/blocks/support/repair-system.png |
| Dig | dig, creuser | 2 | Cible devant le robot; transforme WL -> FL ou FL -> HO; IW, SP, WA, HO, hors carte et occupe journalisent un warning. | assets/images/blocks/terrain/dig.png |
| Say | say, dire | 0 | say("message") affiche/journalise un message. Requiert exactement un argument. | assets/images/blocks/support/say.png |
Effets
| Effet | Source actuelle | Comportement |
|---|
| overheat | lighter, fire_wave | Inflige 10 degats par tour pendant 3 tours; retire par cooling_system. |
| short-circuit | tazer, lazer, ultra_lazer | Reduit les AP de 20% pendant 2 tours; retire par repair_system. |
Regles importantes
- Les actions non throwable n'acceptent pas de coordonnees cible.
- Les throwables avec pattern throw-point, actuellement grenade, acceptent 0 ou 2 arguments.
- Les degats allies dependent de combatOptions.friendlyFire; l'auto-hit depend des parametres de l'action.
- Les getters sont journalises comme informations, pas comme actions.