mardi 24 juillet 2012

Pause dans le développement

Voilà plusieurs mois que je travaille uniquement sur Strategos.
Je commence à être fatigué, je pense mettre en pause le développement du jeu pendant le mois d'Août.

Vacances !

dimanche 22 juillet 2012

Journal de Bord - 9

Decidemment, je prends du retard !

Et pourtant, la nouvelle version promise est prête depuis une semaine, et attend sagement sur mon bureau...
A vrai dire, il y a encore tellement de points à régler que j'ai du mal à relâcher mes versions pour l'instant !

Du coup, j'avance bien : je travaille en ce moment sur les animations des créatures.

Je vais maintenant faire mes propres créatures, à l'aide d'un graphiste qui a accepté de m'aider. Au lieu d'utiliser les fameux "characters" de la série RPG Maker, j'utilise un modèle similaire pour toutes les créatures, qui ressemble à ça :



Grâce à un gestionnaire d'animations fait maison, les sprites peuvent faire n'importe quelle taille, tant qu'elle reste constante, et les séquences (immobile, repos, mouvement...) peuvent avoir autant d'animations que l'on souhaite.

La vraie difficulté maintenant sera de produire les ressources. Après plusieurs échecs cuisants, je me suis rendu à l'évidence : je ne sais pas dessiner (le stickman plus haut est de moi au meilleur de ma forme)

mercredi 11 juillet 2012

Journal de Bord - 8

Ces dernières semaines m'ont permis de bien avancer !

J'ai pu finir le HUD, qui est maintenant très complet (plus rien ne nous échappe sur nos créatures !)
Le système de compétences et sorts est fonctionnel. Je pense enfin avoir fini les bases du moteur de jeu ! (il me reste deux ou trois trucs à régler avec le mode multijoueur en LAN).
Et il me reste encore à faire une intelligence artificielle pour jouer seul.

En tout cas, je suis content de voir que les mois passés à faire le moteur de jeu, et où j'avais l'impression de stagner, se montrent finalement tout à fait profitable maintenant.
Un exemple : j'ai travaillé plusieurs semaines sur le plateau de jeu. Le résultat est que maintenant je dispose de commandes assez puissantes et très simples d'usage, du genre creature.deplacer(emplacement), ou encore creature.get_spell(1).lancer(creature_ennemie). Ça peut paraître dérisoire ou évident, mais ces fonctions cachent en réalité de nombreuses manipulations de plus bas niveau, dont je n'ai bien heureusement plus à me soucier maintenant !

Pour résumer, le travail de fond fait au début porte maintenant ses fruits et facilite grandement l’implémentation. Je conseille ainsi à tout développeur amateur de bien différencier le moteur du jeu et l'implémentation du jeu.
Pour la plupart, créer un jeu se réduit à ce deuxième aspect. C'est dommage, car l'édification du moteur reste un moment très intéressant, qui permet de se familiariser avec de nouvelles techniques (j'ai dû par exemple apprendre à déployer une petite architecture réseau TCP, ce que je n'avais jamais fait avant).

J'essaierai de poster une nouvelle version dans les jours qui suivent !



Un aperçu du HUD, à droite.

dimanche 1 juillet 2012

Première version jouable disponible

Voici enfin une première verion "jouable" (disons testable) de Strategos !
Le jeu étant en alpha, les possibilités sont très limitées. Vous pouvez lancer une partie "Escarmouche" et jouer contre... vous même (c'est long d'implémenter une I.A. !)

En fait  il s'agit plus d'un prototype pour tester les bugs et problèmes, donc pas encore prêt pour y jouer.


Téléchargez le fichier, décompressez l'archive n'importe où (le jeu ne requiert aucune installation), et cliquez simplement sur l’exécutable.


F.A.Q (ou du moins prévision des F.A.Q)

Q. Comment mettre en plein écran ?
R. En appuyant sur la touche F11 de votre clavier

Q. Comment finir mon tour en combat ?
R. En appuyant sur la barre espace de votre clavier

Q. Pourquoi certains éléments du menu ne font rien quand je clique dessus ?
R. Je n'ai pas fini de faire tous les modes de jeu !

Q. Pourquoi le jeu est déjà si lourd (40 MB) ?
R. Les ressources audio occupent énormément de place (plus de la moitié du poids total) !

Q. C'est quoi tout ces chiffres ? Quelles sont les règles du jeu ?
R. Je pensais finir la deuxième partie du tutoriel à temps, mais je n'ai pas pu :(
Le 1er tutoriel vous apprend néanmoins les bases. Il s'agit de toute façon d'un prototype, donc je suis loin d'avoir fini !

Q. Les textes de sélection de faction sont en latin !
R. Bien vu !

Q. Comment le jeu évoluera t-il ?
R. Je vais continuer mon travail en postant régulièrement des mises à jour pour petit à petit arriver à une bêta. Si le jeu tel qu'il est maintenant ne vous plaît pas, regardez tout de même les mises à jour : la marge de progression est énorme !



Tout vos rapports de jeu (bugs, remarques et autres) sont le bienvenue !

jeudi 28 juin 2012

Version alpha jouable en fin de semaine

C'est promis :)

C'est très important quand on développe seul de se forcer à sortir des versions publiques de son projet.
D'une part ça boost la motivation en se forçant à respecter une "deadline".
D'autre part, c'est la seul façon de confronter son projet aux regards des autres (car non, votre ami(e)/mère/sœur/grand-mère qui s'extasie devant votre "Hello World" triomphant n'est PAS un gage de qualité de votre travail).

Pour "fêter" la sortie de la première version publique, je fais un mode tutoriel pour le jeu !
C'était une critique majeure à la sortie des premières versions de Strategos.
Pour mascotte et accompagnateur de ce tutoriel, j'ai choisi Frog, la grenouille de Chrono Trigger :


Comme de toute façon je ne sais pas dessiner, autant me faire plaisir quand je pompe les ressources sur Internet :)


Rendez-vous donc samedi ou (plus probablement) dimanche pour télécharger une version alpha ici même.

lundi 25 juin 2012

Vers une version jouable !

Je suis peu bavard en ce moment, et pour cause ; ça bosse dur !

Maintenant j'ai un nouveau tic : je n'arrête pas de dire que j'arriverais à sortir une version jouable "d'ici la fin de semaine". Puis dimanche soir arrive, et je me rends compte que le jeu n'est pas prêt !

Mais promis, ça vient ! Je travaille en ce moment sur l'implémentation des archers et des projectiles, sur la gestion du plateau et sur les combats.

Sinon, j'ai fini le nouvel HUD. J'en suis assez contenu, mais il reste encore à le placer correctement dans le jeu (parce que là il est collé sauvagement sur le plateau...)

jeudi 14 juin 2012

Journal de Bord - 7

Pfew... enfin ! Après plusieurs semaines de boulot, j'ai terminé l'objectif que je m'étais fixé.

Pourquoi un tel temps mort sur le blog ? J'avais décidé de faire la caserne, c'est à dire l'interface par laquelle on recrute les créatures.
Je me disais : "rien de plus simple, deux jours de travail et c'est dans la poche !"
Pfwa. Quel naïf j'étais ! :D

Pour faire la caserne, encore fallait-il que j'implémente les joueurs, ceux qui possèdent lesdites caserne et les créatures dans le jeu.
Très bien. Pas de soucis. Mais pour faire ces mêmes joueur, encore fallait-il faire un écran de sélection pour commencer une partie. Bon, faisons les menus maintenant alors. Puis pour la sélection de la faction, il fallait encore implémenter lesdites factions...
BREF. Typiquement l'arbre qui cache la forêt ! En voulant faire une simple caserne, j'ai été amené à implémenter une bonne partie du jeu.

J'ai fait une petite vidéo pour illustrer toutes les nouveautés :



Souvenez-vous : c'est une "pré-alpha", en quelque sorte, donc les textes qui débordent, les menus vides ou mal placés, les jeux de couleurs qui sont moches et tout les défauts du genre sont vraiment le cadet de mes soucis pour l'instant :)
Il s'agit plus de faire enfin un prototype jouable pour que je le soumette aux joueurs.

Autre nouveauté sympa : l'implémentation dynamique des créatures ! Le joueur pourra facilement faire combattre les créatures qu'il aura lui même créées en deux temps trois mouvements  :)
(je prévois d'ailleurs un petit logiciel pour assister la création, un "creep designer")

jeudi 7 juin 2012

Journal de Bord - 6

10 jours sans message ! Mais que ce passe-t-il ?
D'une part j'ai eu une fin d'année chargée, et de l'autre, je travaille beaucoup sur le moteur du jeu. Conséquences : c'est long, et surtout les résultats ne sont pas vraiment visibles.

Donc au lieu de publier des messages quotidiens qui n'apprennent pas grand chose, je préfère continuer mon travail régulier. En revanche, dès que j'aurais fini ce qui m'occupe en ce moment, je pourrais enfin montrer le résultat en images (ou en vidéos).

J'ai fini l'implémentation de la caserne. Je suis assez content du rendu (encore une fois c'est très différent des anciennes versions, je me dirige vers un style plutôt épuré).
En ce moment je travaille sur les scènes et leur articulation (scène de sélection, scène principale, scène de combat...). C'est assez "abstrait", et je ne peux rien montrer de concret. J'ai parfois l'impression de stagner ! Mais je pense avoir bientôt fini.


Sinon j'ai fait une petite bannière pour le blog. Faut bien se distraire de temps en temps :)

dimanche 27 mai 2012

Programmation réseau - et l'aléatoire ?

          Programmer un jeu en réseau, c'est se placer d'emblée dans une optique très différente.
C'est toute la conception du programme qui change ! C'est tellement nouveau qu'il faut plus qu'un cours théorique pour se préparer à la montagne de questions et de problèmes qui apparaissent lors de la mise en pratique.

          En sommes, rien ne vaut l'expérience pratique dans ce domaine. C'est à la fois passionnant et très frustrant, surtout pour un programmeur comme moi, totalement amateur et sans bases théoriques solides. Une question qui s'est rapidement soulevée pendant la programmation de Strategos est celle de l'aléatoire.

          Voici le problème : pendant une partie en réseau, le joueur 1 attaque le joueur 2. Pendant le combat, la créature du joueur 1 va générer un nombre aléatoire qui représentera son attaque. En mode solo, aucune difficulté. Mais comment partager ce nombre aléatoire en multijoueur sur deux applications différentes ?!


J'ai envisagé 3 possibilités :

          1. Faire que le serveur soit "lourd", c'est à dire qu'il gère toutes les variables et fonctions (et les clients ne feraient qu'afficher et lui envoyer les inputs). Ainsi, l'aléatoire n'aurait à être généré qu'une seule fois, comme en mode solo, et sera sans peine affiché par les deux clients.
Cette solution est sans doute très efficace, mais j'ai opté pour une architecture tout autre pour Strategos (clients riches, et serveur qui ne sert que de relais). J'ai donc cherché d'autres moyens :

          2. Générer le nombre aléatoire chez un client, et l'envoyer à l'autre client pendant l'attaque. Trop compliqué pour moi, et trop risqué à mettre en œuvre. Imaginons que la connexion rencontre des problèmes à ce moment précis, et les deux clients sont désynchronisés à jamais.
Reste la troisième méthode, celle que j'ai choisie :

          3. Jouer sur le pseudo-aléatoire. En utilisant les congruences linéaires (Wikipédia en parle bien) pour générer son nombre aléatoire, on peut très facilement partir d'une même seed et obtenir des séries "aléatoires" identiques. Ainsi, les deux applications produisent de façon autonome... les mêmes nombres aléatoires !
Cela peut paraître déroutant dans la mesure où le propre de l'aléatoire est d'être imprévisible.


          Le résultat me satisfait vraiment : on continue à faire un simple appel à une génération aléatoire locale (sans s'embêter avec le réseau ou en multipliant les échanges donc), tout en sachant que les clients resteront synchronisés.
"Mais, me direz-vous, si les deux clients partagent la même seed, ils produiront toujours la même série !"
Pour pallier ce risque de monotonie, il suffit que le serveur, à son ouverture, génère un nombre aléatoire (à partir de l'heure par exemple), pour ensuite l'envoyer aux deux clients. Ce nombre sera leur seed qui servira à la génération de leur série !

          On a donc un aléatoire commun et facile à utiliser, qui se renouvelle à chaque lancement du jeu. J'ai résumé ça par un petit schéma en deux temps (je commence à bien aimer faire mes petits schéma, même s'ils sont assez peu utiles !) :



mercredi 23 mai 2012

Journal de Bord - 5

Le mode réseau marche !

Je sais que ça peut paraître dérisoire, mais c'est tellement grisant de voir ces petits bits  se balader, et permettre un mode multi-joueur !

Bon, ce n'est qu'une esquisse, mais les bases ont été posées, il ne reste "plus qu'à" implémenter le tout :)
Ne vous attendez à rien de transcendant, en gros on voit juste les deux fenêtres qui sont synchronisées et qui communiquent.

Voici une petite vidéo pour illustrer le mode LAN :




Quelques notes sur la vidéo :
1. Je suis désolé je n'ai pas masqué mon bureau qu'on voit en fond... pas très pro !
2. On sent que la vidéo est un peu saccadée... C'est juste parce que mon pauvre PC a dû supporter l'espace d'un instant les 2 applications clientes, le serveur ET l'application pour filmer le tout en même temps ! Mais en réalité le jeu reste très fluide (aucune perte de frames durant l'opération :)
3. Comme je n'ai qu'un PC, les deux applis clientes sont sur le même ordinateur, mais il est bien évident que le processus marche sur deux postes distants, tant qu'ils sont reliés au même réseau ;) [EDIT : j'ai pu essayer le jeu sur deux ordinateurs distincts reliés au même réseau, le tout fonctionne très bien !]
4. Si des personnes sont intéressés, je pourrais faire un petit article sur l'architecture réseau de Strategos en détail (bien que je sois loin d'être un spécialiste) !


vendredi 18 mai 2012

Journal de Bord - 4

J'ai fait une petite avancée dont je suis assez content :)
Ce n'est pas grand chose, mais ça devrait permettre aux utilisateur de faire du "modding" sur Strategos.

Concrètement, la création des créatures avec leurs attributs et statistiques se faisait avant côté code source. Impossible donc pour l'utilisateur non-averti de créer ses propres créatures.

Maintenant, les créatures sont toutes sauvegardées dans un dossier du jeu sous format .txt.
Libre à vous d'en créer d'autre !  Le processus est très simple, il n'y a aucun code à écrire.

Le revers est que pour l'instant n'importe qui peut modifier les créatures déjà existante (ce qui serait problématique pour le mode campagne par exemple).
Je réfléchis donc à un moyen de sécuriser tout ça tout en permettant la création. La piste que j'envisage en ce moment est de faire 2 répertoires : un pour les créatures de bases et un pour l'utilisateur.

Voici à quoi ressemble pour l'instant le fichier pour les créatures :



C'est vraiment simple !

dimanche 13 mai 2012

Journal de Bord - 3

Aujourd'hui, j'ai décidé de changer radicalement le style de Strategos. Pas le gameplay, celui-ci reste tel-quel !
Mais changer le style graphique, c'était intenable. C'était immobile, et très impersonnel.
Je prenais de belles illustrations trouvées sur Internet pour servir de "carte".

Maintenant je vais faire mes créatures en pixel-art. Elle seront animées sur 3 frames, et
seront sur un champ de bataille lui même en style pixelisé.

Il est possible que le rendu déplaise à certains, mais je trouve que le nouveau style donne
vraiment une âme à Strategos (je ne dis pas pour autant que c'est du jamais vu, loin de là).

Et autre avantage : je vais enfin pouvoir créer mes propres ressources, en tout cas
bien plus facilement qu'avant.


Voici en haut l'ancien aspect du jeu, et en bas ce vers quoi j'aimerais me diriger.
C'est bien un changement radical, mais le gameplay ne bougera pas d'un iota !

Attention, la version ci-contre est une alpha, je n'ai encore implémenté aucun menu !
Je pense qu'un tel changement pourra déplaire. Certains trouveront que le jeu perd de son sérieux et de sa sobriété.
Je vois au contraire ce nouvel aspect comme plus original, et bien plus ouvert. Sachant encore une fois que ce n'est que graphique, les interactions seront les mêmes.



N'hésitez pas à me faire part de vos retour en m'écrivant (mon mail est dans la colonne de droite, dans la petite rubrique "Qui suis-je ?").

samedi 12 mai 2012

Journal de Bord - 2

C'est la première fois que je travaille sur un "vrai" moteur de jeu. Les guillemets sont importants, car c'est un moteur fait maison, amateur et de faible envergure.

Pour l'instant je constate deux choses : d'une part l'établissement d'un moteur est long, passionnant mais aussi pénible. J'ai souvent l'impression de stagner, comme il n'y a pas de contenu implémenté il est difficile de mesurer objectivement son avancement.
D'autre part, je suis vraiment impatient. Le moteur est prometteur. Une fois mis en place, je vais pouvoir le mettre à l'épreuve en implémentant du contenu, et en sortant des premières versions jouables.

Pour résumer, se lancer dans un moteur de jeu, c'est je pense adopter une vision à long terme. Les débuts sont longs et pénibles, mais je suis sûr qu'à long terme le moteur sera largement "rentable", grâce à la facilité qu'il autorise.


Enfin bon, hier j'ai craqué ! Fatigué de rester rivé sur la gestion des events, je me suis autorisé un peu de game design.
J'ai commencé l'écran de sélection des factions (ce qui est une aberration dans la mesure où lesdites factions ne sont même pas encore créées !)

Voici à quoi ressemble le menu radial de sélection :



Souvenez vous que les images montrent une version alpha, rien n'est définitif !

jeudi 10 mai 2012

L'importance d'un bon tutoriel

C'est bien beau de faire un jeu, mais j'ai vite compris qu'un tutoriel est essentiel pour Strategos.

J'essaye de rendre les commandes les plus intuitives possibles, mais je ne peux pas faire l'économie d'un vrai tutoriel. J'ai reçu de nombreuses critiques sur l'absence d'aide !

La difficulté de la phase de tutoriel est qu'elle comporte une liste d'actions interdites qui correspond à l'avancement dans le tutoriel (par exemple interdire au joueur de recruter des créatures au début).

De là l'idée de rendre autonome la gestion des événements.
Voici la façon que je compte utiliser pour que les actions du joueur subissent un "contrôle" par le tutoriel avant d'être effective :

1. La scène récupère les inputs (appui d'une touche, clic de souris)
2. Un interpréteur fait maison change l'input en action (en interprétant par exemple un clic de souris en action de déplacer une créature)
3. L'action, avant de devenir une commande dans le code (creature.deplacer()), doit être validée par le tutoriel. (if(actionActuelle != tutoriel.m_actionsInterdites[tutoriel.m_etape_actuelle]))

Ainsi, on peut imaginer un tutoriel qui guidera le joueur pas à pas en le forçant à faire telle action à tel moment (et les actions invalides seront refusées).
De même, ce système pourra être réutilisé pour un mode campagne

L'avantage de cette tri-partition est qu'on peut à tout moment désactiver le tutoriel, et les actions n'auront plus à être validée avant de devenir une commande.

mercredi 9 mai 2012

Donner de la profondeur...

... c'est ce que je m'efforce de faire.
Du coup je retravaille les créatures. Elles sont à la base du gameplay, je me concentre donc sur elles.

Mon but est de permettre une double approche de Strategos :
d'une part que le jeu soit agréables dès les premières parties (très difficile),
et de l'autre que le jeu gagne en intérêt et en profondeur à mesure que le joueur y passe du temps (encore plus difficile).

Avant, seules quelques créatures bénéficiaient d'un "passif". C'est une sorte de signature, un attribut unique qui les définit.
Maintenant, j'ai décidé que toutes les créatures auraient un passif. Ça va être long à faire, mais je suis persuadé que le jeu en vaut la chandelle.

En effet, les passifs des créatures peuvent très bien être ignorés sans gâcher le plaisir de jeu (pour une partie sans prise de tête). Mais ils devront tous être pris en compte pour affiner des stratégies de jeu.


Pour bien marquer le résultat, j'ai fait un petit panneau qui pendouille avec de magnifiques chaînes :





Je pense que le joueur "casual" et le joueur exigeant y trouveront ainsi tous deux leur compte.

Le game engine

"Game engine", un peu pompeux pour un jeu de l'envergure de Strategos ! Mais en réfléchissant sur un mode multijoueur en LAN, il a bien fallu organiser tout ça.

En gros, ça ressemble à ça :




Pas très lisible j'en conviens, mais je n'écris pas une ligne de code sans m'y référer.

Journal de Bord - 1

Début du "devlog" autour de Strategos.

Je vais essayer de tenir un journal de bord relatant l'avancée du projet qui m'occupe
actuellement, Strategos (présentation ici).
Y'a surement un côté pervers, du genre : "qu'est ce que j'avance bien, aujourd'hui
j'ai publié 3 articles", alors que le code n'a pas bougé.
C'est vrai qu'un devlog peut créer l'illusion d'avancer alors qu'il détourne du travail
nécessaire pour le jeu.
Ceci dit, c'est drôlement motivant. Et la motivation, j'ai fini par comprendre ça, c'est
essentiel quand on programme en amateur.
Puis il y a ce petit aspect d'"achèvement", quand je patauge je regarde le blog et je me
dis que ça vaut le coup de continuer.

Présentation

En deux mots
Le jeu s'appelle Strategos. Il peut être vu comme un mélange entre un jeu de cartes et un jeu de stratégie, au tour par tour.
Le jeu consiste en effet de placer ses créatures sur le champ de bataille et de prendre les bonnes décisions au bon moment pour remporter la partie.

Fiche technique
Strategos est programmé en C++, et utilise comme bibliothèque la SFML (http://www.sfml-dev.org/index-fr). Le jeu tourne sous Windows, et je prévois une version Linux quand la version Windows sera plus aboutie.

Univers de jeu
Il s'agit d'un univers de type Fantasy / médiéval.
On retrouve différentes factions qui s'affrontent, chacune ayant un gameplay et des créatures uniques.
Voici un bref aperçu des 5 factions présentes dans le jeu :

La Sylve : représente la nature. Troupes équilibrées, début de jeu plutôt aisé.
La Néropole : une armée de mort-vivants. Troupes peu chères mais capables d'écraser l'ennemi par le nombre.
La Horde : groupe hétéroclite de barbares, gameplay très offensif.
L'Atlantide : composée de troupes d'élites onéreuses. Débuts difficiles car manque d'argent, mais possède les créatures les plus puissantes du jeu en fin de partie.
Le Pandémonium : aussi offensif que la Horde, mais avec de puissants sorts.

Chaque faction dispose de ses créatures uniques, allant du niveau 1 au niveau 4. Chaque créature a des statistiques uniques, et certaines d'entre elle peuvent lancer des sorts (offensif, soutien ou invocation).

Gameplay
Le principe est simple : le joueur doit tout au long d'une partie ériger une armée et combattre celle de l'adversaire. Le recrutement des créatures se fait via une caserne, où le joueur pourra acheter avec son or durement gagné des créatures aux profils variés. Il n'y a donc pas de pioche et pas d'aléatoire : vous décidez des troupes qui vous accompagneront sur le champ de bataille.
Le combat est en réalité une série de duels entre les créatures. Chaque créature peut attaquer un ennemi, engageant ainsi un duel.
STRATEGOS peut offrir un certain nombre de stratégies pour les joueurs qui prennent la peine d'assimiler les règles, mais peut aussi être joué sans avoir une parfaite connaissance des mécanismes !