Le cycle Jour-Nuit au service du gameplay
dans Castlevania 2

Au rythme d'une aventure à monde ouvert, Castlevania 2 Simon's Quest invite le joueur dans une quête centrée sur l'exploration. Le titre, conçu pour la première Nes et sorti en 1990 sur le vieux continent, puise son originalité dans la dynamique de jeu inspirée par l'utilisation du cycle Jour-Nuit. Une mécanique intéressante qui dénote, à l'époque, un certain renouveau.

Pétries de limitations techniques, les premières générations de consoles sont néanmoins honorablement représentées par l'ingéniosité saisissante de certains créateurs de jeux vidéo. Parvenir à extirper l'innovation d'un environnement technologique difficile peut sembler hors sujet aujourd'hui mais c'est un exercice censé, peut-être, nous interpeler.

Des griffes dans la nuit

Chaque nuit, dans Simon's Quest, comme pour rappeler la tonalité horrifique du titre, les environnements succombent à des teintes de couleurs inquiétantes. Mais les effets ne sont pas seulement visuels et interviennent, par ailleurs, sur l'expérience de jeu en révélant des monstres plus dangereux et résistants la nuit tombée.

L'ambiance nocturne n'épargne pas les villes dont les rues (habituellement accueillantes en journée) sont alors infestées de zombies. Pour le joueur intrépide, affronter ces dangers apparait essentiel s'il souhaite obtenir le meilleur scénario de fin possible (lequel étant décroché sous réserve de compléter l'aventure en moins de 8 jours).

En ville, les
  ténèbres se joignent à la nuit.
En ville, les ténèbres se joignent à la nuit.

Castlevania 2 aménage le gameplay autour d'un concept simple mais riche en possibilités. Ici, les développeurs sont parvenus à faire preuve de créativité tout en réduisant leur dépendance aux technologies. Une source d'inspiration définitivement utile pour le créateur.

Le dépassement d'entier sur SDL_GetTicks
à l'attention des sages

La fonction SDL_GetTicks retourne un entier naturel sur 32 bits chargé de représenter le nombre de millisecondes écoulées depuis l'initialisation de la librairie SDL2. En apparence anodin, un dépassement d'entier (ou integer overflow) sur la valeur de retour de cette fonction devrait pourtant alerter nos sens.

Compréhension du problème

Une application SDL2 doit être exécutée de manière continue pendant 49 jours (soit 232 millisecondes) pour entrainer un dépassement d'entier sur Uint32 SDL_GetTicks(void) et provoquer la troncature du résultat. Ce cas particulier peut prêter à sourire mais privilégier les bonnes pratiques permet de se préparer efficacement en vue de situations plus critiques.

La solution élégante proposée par Raymond Chen dans son blog se transpose facilement à un contexte SDL2. En considérant StartTime comme la variable destinée à loger le temps de départ et IntervalTime comme la durée d'attente entre chaque frame, on obtient l'expression sécuritaire SDL_GetTicks() - StartTime >= IntervalTime.

Complément d’information

L'exemple illustré sur la page Wiki officielle de la fonction SDL_GetTicks souffre d'un problème d'overflow susceptible de valider prématurément la condition currentTime > lastTime + 1000. Dans l'exemple, la valeur exprimée par currentTime a de grandes chances de se trouver supérieure au résultat de l'expression lastTime + 1000 quand celui-ci s'inscrit au-delà des capacités de l'espace de stockage disponible.

À des fins d'archivage, Le code complet (extrait du Wiki de la librairie SDL2) est mis à disposition ci-dessous :

unsigned int lastTime = 0, currentTime;
while (!quit) {
 // do stuff
 // ...

 // Print a report once per second
 currentTime = SDL_GetTicks();
 if (currentTime > lastTime + 1000) {
  printf("Report: %d\n", variable);
  lastTime = currentTime;
 }
}