Le problème
Battlefield 6 est sorti avec Portal, une boîte à outils pour programmer des modes personnalisés. Je voulais le Match à mort par équipe dont se souviennent les joueurs des anciens jeux de tir : un court temps de préparation, la première équipe à 75 éliminations gagne, un tableau des scores lisible, et des réapparitions qui ne vous lâchent pas face à l'ennemi.
Ce que j'ai construit
Une expérience Portal écrite en TypeScript avec le SDK officiel et empaquetée avec esbuild. Chaque match s'ouvre sur un compte à rebours de 15 secondes, puis dure 10 minutes ou jusqu'à ce qu'une équipe atteigne 75 éliminations. Une interface sur mesure affiche les scores des deux équipes, l'objectif et le chrono ; un tableau des scores suit pour chaque joueur éliminations, morts, assistances, ratio E/M et taux de tirs à la tête. L'annonceur réagit à 20, 40 et 65 éliminations, à chaque changement d'équipe en tête, et à deux minutes, une minute et 30 secondes de la fin. Les points d'apparition sont des objets placés dans les scènes Godot du SDK pour deux cartes, lus au début du match grâce à leurs identifiants.
Défis techniques
- Des apparitions équitables. À chaque réapparition, je mesure pour chaque point la distance à l'ennemi vivant le plus proche, je garde ceux qui atteignent au moins 80 % de la meilleure distance et j'en tire un au hasard : les apparitions restent sûres sans devenir prévisibles.
- Un SDK tout neuf. Demander un objet inexistant renvoie quand même un objet : les points d'apparition sont donc détectés en vérifiant leur position à la main. Les objets ne pouvant pas être désactivés, les repères utilisés sont déplacés hors de la carte. Chaque contournement est commenté dans le code.
- Le tri du tableau des scores. Une variante de la fonction de tri compte à partir de zéro alors que la documentation indique un. Un contributeur a corrigé le tri et ajouté un en-tête dynamique par une pull request, que j'ai intégrée.
Résultat
J'ai construit ce mode dans les deux semaines qui ont suivi la sortie de Battlefield 6, et son code source est public sur GitHub. Il n'est plus maintenu.