Jeu ASCII - un compromis entre authenticité et commodité

Bonjour à tous! En développant un jeu stylisé en mode texte, je suis arrivé à la contradiction attendue. D'une part, le jeu doit être saturé de l'esprit du mode texte, car pour cela je l'aime et, j'espère, les fans de jeux rétro vont l'aimer. D'un autre côté, je veux que le gameplay soit aussi agréable et moderne que possible. Dans cet article, je décrirai cinq points sur lesquels je me suis écarté du vrai mode texte. Ai-je réussi à garder l'ambiance alphanumérique du tube dans le jeu? Je demande à exprimer un avis!



1. Jeu de caractères


Absolument tous les graphiques du jeu sont créés à l'aide des caractères saisis au clavier. Pour être plus précis, les caractères de la table ASCII du 32ème au 126ème caractère sont utilisés.



Cependant, les textes du jeu sont localisés en plusieurs langues. Maintenant, je soutiens le russe et l'anglais en parallèle, mais je veux en ajouter quelques autres, y compris le chinois. Les caractères des tables ASCII, même étendus, ne sont clairement pas suffisants à ces fins.



Les boîtes de dialogue du jeu peuvent contenir des caractères n'appartenant pas à la plage authentique. Cependant, ces personnages ne sont pas impliqués dans la conception. Les graphiques sont en ASCII uniquement.

2. Précision des sous-caractères


Contrairement aux modes texte, ASCIIDENT utilise la précision des pixels pour déplacer les calques de texte et les sprites mobiles.



En mode texte, le déplacement d'un sprite d'une position ressemble à un saut notable. Pour un jeu aussi dynamique que ASCIIDENT - c'est inacceptable du point de vue de l'expérience de jeu moderne. Par conséquent, pour les sprites individuels et les calques de texte, qui seront discutés plus tard, j'ai effectué un mouvement fluide.

Pour maintenir l'authenticité, j'adhère à la règle suivante. À l'intérieur d'un calque de texte, tous les objets statiques sont clairement alignés sur la grille de caractères. De plus, chaque sprite se compose de caractères également alignés sur une grille de caractères.

Relativement les uns aux autres, les calques et les objets en mouvement peuvent être situés à une distance sous-symbolique. Cela garantit un mouvement fluide et, par conséquent, un gameplay confortable. C'est un tel compromis.

3. Parallaxe


Le jeu a plusieurs couches de texte qui se déplacent à différentes vitesses, réalisant l'effet de parallaxe. Les symboles des couches supérieures chevauchent les symboles des couches inférieures. Avec une précision de sous-caractère, le critère de chevauchement est une superposition de plus de 50% de la largeur et / ou de la hauteur de la cellule de texte. En utilisant un simple z-buffer, ce chevauchement est facile à implémenter.



La parallaxe avec un mouvement fluide des couches est une technique graphique très expressive. Oui, cela peut considérablement violer l'authenticité du mode texte. Cependant, j'ai décidé d'utiliser la parallaxe. Cela se révèle très bien.

4. Animation


Animation de sprites individuels dans le jeu "honnête", réalisé strictement en mode texte. La position de chaque caractère est alignée sur la grille de texte. Les animations sont obtenues en remplaçant les caractères dans les cellules.



J'ai trouvé qu'il était très important de maintenir l'intégrité des animations de sprites. C'est probablement la principale chose qui rend le jeu si rétro-attractif. De plus, avec ce type d'animation, il devient techniquement très simple de créer et d'éditer des sprites ASCII animés. Je n'ai pas pu résister et j'ai créé un éditeur ASCII intégré dans le jeu. À tout moment, n'importe quel élément graphique peut y être chargé et modifié. Vous pouvez, par exemple, modifier le coffre en ajoutant des cadres d'animation, et après avoir enregistré tous les coffres à tous les endroits du jeu, ils deviendront nouveaux. Tout joueur peut le faire, créant ainsi son propre mod du jeu.


Cependant, il vous faut parfois une animation fluide! Par exemple, dans le jeu, il y a un tel endroit où l'on fait pousser des fibres optiques biologiques. Un drone vole au-dessus des lits, ce qui irrigue la fibre optique avec un liquide toxique. Le liquide doit couler en douceur, sinon laid. Pour implémenter de tels effets, j'ai créé des générateurs de sprites et leur liaison à tous les autres sprites du monde du jeu. Techniquement, chaque goutte est un sprite distinct qui peut se déplacer avec une précision sous-pixel. Encore un compromis raisonnable.

5. Lumière, couleur et police


Beaucoup de gens à qui je montre le jeu font remarquer qu'il y a trop de couleurs dans mon jeu. Dans les modes texte, il n'y avait pas une telle richesse de nuances. Le fait est que j'ai implémenté un lightmap plein écran qui calcule un nombre illimité de sources lumineuses. Dans le même temps, la couleur de chaque caractère est de 24 bits (16 777 216 couleurs différentes). Parfois, l'image est colorée.



Pour émuler les modes de couleurs rétro, j'ai fait sept options supplémentaires: trois modes monochromes, deux modes 16 couleurs (DOS / Mac), 2 bits et le mode Game Boy. Le mode police LED est également disponible. Dans ce mode, chaque pixel de chaque caractère est séparé des pixels voisins. La vidéo ci-dessous montre tous les modes - comment ils affectent l'image.


L'algorithme de conversion des couleurs pour les modes monochromes l'a fait. Tout d'abord, je calcule la luminosité des couleurs (R, V, B):

V = 0,3 * R + 0,59 * G + 0,11 * B

Les moniteurs rétro monochromes ont des tonalités de couleur différentes pour une luminosité de symbole différente. Par conséquent, la teinte doit également changer. J'utilise une telle interpolation linéaire:

RR = sqrt (V) * (monoR1 * (1 - V) + monoR2 * V)

GG = sqrt (V) * (monoG1 * (1 - V) + monoG2 * V)

BB = sqrt (V ) * (monoB1 * (1 - V) + monoB2 * V)

Couleur finale (RR, GG, BB)

Pour les modes 16 couleurs, j'utilise un algorithme différent. Pour chaque couleur (R, G, B) je recherche la couleur la plus proche dans la palette. C'est tout.

Le mode 2 bits et Game Boy n'a que quatre couleurs dans la palette. Une simple recherche de la couleur la plus proche donne une image très sombre. Par conséquent, avant de chercher une couleur dans la palette, je fais la normalisation:

d = 1 / max (R, G, B)

normR = d * R, normG = d * G, normB = d * B

Les formules sont schématiques. Les contrôles de division par zéro n'ont pas été mentionnés. J'espère que tous ceux qui décident de jouer à ASCIIDENT pourront choisir eux-mêmes une palette de couleurs qui réchauffera au maximum son âme rétro.

6. Console avec un mode texte honnête


Dans le processus de création du jeu, l'idée est venue de mettre des terminaux informatiques avec un mode texte honnête dans le monde du jeu. Vous pouvez les approcher, vous connecter et travailler / jouer.

Si le jeu lui-même est stylisé en mode texte 80x25 avec un défilement fluide et une parallaxe des couches de texte, alors l'écran du terminal intégré a une résolution de 72x20 caractères sans possibilité d'aller au-delà de cette grille.

Toutes les applications pour les terminaux embarqués (y compris le chargeur de démarrage) sont écrites dans le langage de programmation DUHASM. Ce langage est similaire à Assembler, mais possède des variables et des tableaux dynamiques. Voici, par exemple, un morceau de code de jeu Pi-astre Hanter:



Une fonctionnalité amusante est que les boucles sont implémentées dans le cadre de constructions conditionnelles, où LOOP est placé au lieu de END.

Au lancement, le jeu charge les applications à partir des fichiers * .duhasm et les compile en code octet. Lorsqu'un joueur active la console, un interprète honnête est lancé.

Pour le moment, j'ai écrit deux jeux sur DUHASM, qui sont déjà disponibles dans la version actuelle. Il est prévu d'écrire un éditeur de code (également sur DUHASM bien sûr) afin que chaque joueur puisse essayer de créer une application / un jeu que tous les autres joueurs verront.


J'espère que je n'ai pas en vain dépensé beaucoup d'efforts et de temps pour implémenter cette fonctionnalité et qu'il y aura des gens qui l'aimeront. Le langage DUHASM a certainement besoin d'être raffiné. Je n'aime pas vraiment comment, par exemple, les fonctions sont appelées avec des arguments. Selon l'histoire du jeu, le langage DUHASM a proposé un cyborg semi-sensible qui s'est échappé du laboratoire des pirates de l'espace. Étonnamment, ce langage de programmation a pris racine à la périphérie de la partie habitée de l'univers.

CONCLUSION


Eh bien, il y avait beaucoup de compromis - un ensemble de personnages, la précision des sous-personnages, l'animation, les couleurs. Mais aussi pour conserver un sentiment d'authenticité au mode texte, j'ai beaucoup entrepris au cours de ces plus de deux ans de développement. Pour obtenir plus de commentaires et comprendre si je vais dans la bonne direction, j'ai décidé de démarrer le jeu en accès anticipé dans Steam . Il y a quelque chose de magiquement attrayant dans les modes texte. Lorsqu'une image peut être tapée avec des caractères sur le clavier, il est parfois difficile de résister et de ne pas démarrer le jeu avec l'éditeur ASCII intégré, et même de ne pas dessiner le prototype d'un nouveau mini-jeu, qui sera ensuite implémenté dans le langage DUHASM.



Merci à tous! Jusqu'à!

All Articles