L'Explorateur pose le piedThe Explorer sets foot

Marcher, nager, creuser, construire à deux, un casque sans visage, un serveur qui a toujours raison, et un objet lancé à 18 milliards de milliards de blocs par seconde.Walking, swimming, digging, building together, a faceless helmet, a server that is always right, and an item launched at 18 billion billion blocks per second.

Le monde a enfin quelqu'un pour le parcourir : l'Explorateur. On marche, on court, on saute, on nage. On s'accroupit pour longer un bord sans tomber. Les collisions suivent le monde au bloc près. Dans l'eau, on coule lentement, on remonte en nageant et on se hisse sur la berge.

The world finally has someone to roam it: the Explorer. You walk, run, jump and swim. You crouch to edge along a drop without falling. Collisions follow the world down to the block. In water you sink slowly, swim back up and haul yourself onto the bank.

On casse et on pose des blocs. Le temps de minage dépend de la dureté : la terre cède vite, la roche sombre résiste. Pendant qu'on creuse, le contour du bloc visé s'épaissit et un arc se remplit autour du réticule. Pas de fissures dessinées sur les faces : j'ai préféré un indicateur graphique, plus lisible et plus personnel. Le bloc cassé éclate en pixels à ses couleurs, et ce qu'il lâche reste posé au sol avec une lueur douce, à ramasser en passant.

You break and place blocks. Mining time depends on hardness: dirt gives way quickly, dark rock holds out. While you dig, the outline of the targeted block thickens and an arc fills up around the crosshair. No cracks drawn on the faces: I went for a graphic indicator, easier to read and more my own. The broken block bursts into pixels of its own colours, and whatever it drops rests on the ground with a soft glow, ready to be picked up as you walk by.

Minage : le contour s'épaissit et l'arc se remplit autour du réticuleMining: the outline thickens and the arc fills around the crosshair

L'Explorateur porte un casque blanc aux arêtes chanfreinées, un hublot cyan et une combinaison orange. On ne voit jamais son visage. Il est fait de cubes, animé sans images clés : les membres se balancent selon la vitesse et le casque s'incline. Par défaut, on le suit par-dessus l'épaule. La touche V passe en première personne, où l'on voit sa main gantée qui tient l'objet choisi et, au poignet, un petit appareil. Il servira plus tard.

The Explorer wears a white helmet with chamfered edges, a cyan visor and an orange suit. You never see a face. The model is made of cubes and animated without keyframes: limbs swing with speed and the helmet tilts. By default you follow over the shoulder. The V key switches to first person, where you see the gloved hand holding the selected item and, on the wrist, a small device. It will come in handy later.

L'inventaire compte 8 emplacements de barre rapide et 24 de réserve. Pourquoi 8 ? Parce que ça se répartit bien à la manette, et le jeu est pensé pour la manette autant que pour la souris. Toutes les commandes se remappent, et les textes s'affichent dans une police pixel dessinée pour le jeu.

The inventory has 8 hotbar slots and 24 storage slots. Why 8? Because it splits nicely on a gamepad, and the game is designed for a controller as much as for a mouse. Every control can be remapped, and text is displayed in a pixel font drawn specifically for the game.

Et tout ça marche à plusieurs. Deux joueurs se voient, construisent ensemble et voient les blocs de l'autre apparaître. Ada et Bob, dans l'animation ci-dessous, ne sont pas de vrais joueurs : ce sont des scripts de test, filmés par un troisième client. Pratique pour refaire la scène cent fois, et ils n'ont reçu aucune correction du serveur de toute la session.

And all of this works in multiplayer. Two players see each other, build together and watch each other's blocks appear. Ada and Bob, in the animation below, aren't real players: they are test scripts, filmed by a third client. Handy for replaying the scene a hundred times, and they did not receive a single server correction during the whole session.

Ada et Bob, deux joueurs scriptés, construisent un mur sur un serveur dédiéAda and Bob, two scripted players, build a wall on a dedicated server

Le serveur a toujours raison

The server is always right

Dans un jeu en ligne, la tentation est de laisser le joueur dire « je suis ici ». C'est rapide, mais un client modifié peut alors voler, traverser les murs ou casser un bloc à l'autre bout de la carte. Ici, c'est le serveur qui décide. Le jeu calcule lui-même ses déplacements pour rester réactif, mais le serveur vérifie que chacun tient dans ce qu'un Explorateur honnête peut faire : hauteur de saut, vitesse de chute, vitesse au sol, passage entre les blocs. Creuser ou poser un bloc est contrôlé aussi : portée, ligne de vue, durée de minage minimale.

In an online game, it is tempting to let the player say “I am here”. It is fast, but a modified client can then fly, walk through walls or break a block on the other side of the map. Here, the server decides. The game computes its own movement to stay responsive, but the server checks that each move fits what an honest Explorer can do: jump height, fall speed, ground speed, squeezing between blocks. Digging and placing are checked too: reach, line of sight, minimum mining time.

Le bug le plus mémorable du jalon n'avait pourtant rien à voir avec la triche. Casser un bloc à certains instants précis figeait le serveur. L'objet lâché reçoit un petit rebond calculé à partir du numéro de tick, et ce calcul se faisait sur un entier non signé. Au lieu de −2, il donnait un rebond de 18 milliards de milliards de blocs par seconde, et le serveur passait son temps à faire parcourir cette distance à l'objet. Une ligne corrigée, une vitesse maximale pour les objets, et un test qui casse des blocs sur sept ticks d'affilée pour couvrir tous les cas.

The most memorable bug of the milestone had nothing to do with cheating, though. Breaking a block at certain precise moments froze the server. The dropped item gets a small bounce computed from the tick number, and that calculation was done on an unsigned integer. Instead of −2, it produced a bounce of 18 billion billion blocks per second, and the server spent its time moving the item across that distance. One line fixed, a speed cap for items, and a test that breaks blocks on seven ticks in a row to cover every case.

Le serveur tient largement son budget, même avec vingt joueurs qui creusent et construisent en même temps. Un point reste à lisser : l'arrivée d'un nouveau joueur le fait encore hoqueter.

The server stays well within its budget, even with twenty players digging and building at the same time. One thing still needs smoothing: a new player joining still makes it hiccup.

Ce jalon a aussi donné son nom au jeu : RADIONAUT. SIGNAL reste le nom de code du projet. Prochaine étape : l'image. Les captures de ce billet montrent l'ancien rendu pour la dernière fois.

This milestone also gave the game its name: RADIONAUT. SIGNAL remains the project's code name. Next step: the visuals. The screenshots in this post show the old rendering for the last time.

En première personne : la main gantée et l'appareil au poignetFirst person: the gloved hand and the wrist device
La page de RADIONAUT →RADIONAUT game page → Tout le journalAll devlogs