Du PvP au tour par tour
Posté le 08/12/2015 22:36
Salut à tous !
Devant l'incompréhension dans laquelle me plonge mes cours de mathématiques de prépa, je me suis remis avec délectation à la programmation en basic casio.
Alors je reviens tout frais avec une idée de jeu (un peu inspiré de Dofus pour le principe...) qui serait donc simplement du 1 contre 1 au tour par tour (mono-calc évidemment, on est pas en C...) sur un plateau de 20*9 cases avec des obstacles aléatoires...
Chaque joueur doit donc choisir une classe, et doit allouer un certain nombre de points de caractéristiques dans différents domaines (attaque/vie...).
Comme je l'ai dit c'est un peu inspiré de Dofus notamment pour le système de Point d'Action (PA) et Point de Mouvement (PM) qui seront donc votre capacité à vous déplacer et à lancer des sorts.
Au stade actuel des choses j'ai déjà implémenté la création de la carte, la gestion du choix de classe et l'allocation des caractéristiques ainsi que les déplacements sur la carte, avec prise en compte des collisions (obstacles ou autre joueur) et des PM que vous utilisez en avançant.
Mais voilà, j'en arrive à la partie "délicate" du jeu : les sorts.
J'ai plusieurs problème à ce niveau là. D'abord il faut savoir que la quasi totalité du jeu est gérer en matrices (caractéristiques, map...) ce qui a l'avantage d'être facilement manipulable. Mais pour les sorts je dois faire face à un petit soucis en particulier : LES LIGNES DE VU.
Le fait est qu'un sort peut avoir plusieurs caractéristiques. Il peut être lançable en ligne droite, ou alors en diagonale ou carrément tout autour de vous ! Mais attention... ça serait trop facile ! il faut prendre en compte le fait que cette ligne de vu ne peut pas dépasser la limite de map (logique...) mais aussi les obstacles ! Je ne sais pas trop comment m'y prendre pour faire un algo qui permette de gérer ça. J'avais pensé à un genre de boucle qui suivrait la ligne jusqu'a rencontrer sa limite de porté ou un obstacle mais... ça me semble pas très opti comme idée... surtout s'il faut faire ça pour chaque ligne de vu possible sur le cas d'un sort qui va tout autour du personnage !
L'autre problème que j'ai sur les sorts c'est en quelque sorte... leur "stockage". Chaque sort a des caractéristiques (dégat, portée, type de ligne de vu, cooldown, coût en PA...). Alors j'avais pensé à faire une matrice qui aurait genre une ligne pour chaque sort où chaque colonne serait l'une de ses caractéristiques, avec ensuite un interpréteur derrière pour l'utilisation lors du choix du sort. Le truc c'est que dans le jeu actuel y'a 5 classes et 7 sorts pour chaque classe. Ca fait 35 lignes dans ma matrice et je me demandais si y'avais pas moyen de faire plus intelligent
Voilà, si vous êtes un peu intéressé par le projet, n'hésitez pas à poster vos idées et bien sur, toute aide est la bienvenue !
Citer : Posté le 08/12/2015 23:42 | #
Déjà pour le stockage des sort tu pourrais tout compacter dans une case de liste en collant les caractéristiques .
Un exemple est plus clair :
Sort Flamme
ID du sort = 01
Dégats = 15
Type de ligne de vue = 01 //Ce qui correspondrait à une frappe sur une seule case, pour 2 se serait un frappe en ligne, etc pour chaque type de frappe
Portée = 05
PA = 03
Puis tout ça tu le compacte en une variable en faisant
List 1 [ID] = PA + (10^2)*Portée + (10^4)*Type de ligne de vu + (10^6)*Dégats
⇒ List 1 [1] = 15010503
Et pour décompresser, tu récupères à chaque fois les nombres qui correspondes .
Dégats = Int (List 1 [1] / 10^6)
Type de ligne de vue = Mod (Int (List 1 [1] / 10^4), 10)
Portée = Mod (Int (List 1 [1] / 10^2), 10^3)
PA = Mod (Int (List 1 [1] / 10), 10^5)
Et tout ça est Laaargement automatisable en une ligne, en gros, en une boucle for, tu peux couper ton gros nombre dans la liste, en pleins de petits nombres que tu va stocker dans une liste temporaire contenant ainsi les caractéristiques du sorts utilisable en combat, voir tu le laisse carrément tel quel, et tu ne le décompresse qu'au moment de son utilisation in game .
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 09/12/2015 18:55 | #
Alors pour l'instant je gère simplement le stockage de tous les sorts dans une matrice (j'ai divisé les sorts en 9 caractéristique, 35 sorts... la matrice est grosse ). La compression que tu propose me parait plutôt intéressante, mais je sais pas ce que ça donnerait sur une matrice de cette taille
De toute façon cette compression n'est pas encore de l'ordre de la priorité je pense, vu que le programme n'est pas super lourd en soit (j'ai 5000o de codes et quelques chose commme 5000o de matrices + 2000o de picture...). Si besoin est, je ferais cet ajout dans une version ultérieure.
Le problème principale reste l'exploitation des données de la matrice des sorts pour prendre en compte notamment les effets qui durent plusieurs tour (type poison, regen, armure...) et évidemment ce problème de ligne de vu ! Pour l'instant dans la matrice j'ai rentré les Ligne de vu sur 4 types : sur soit meme, en ligne, en diagonale, et n'importe où (qui sera géré sans prise en compte de collision, par exemple les téléportations).
Pour la gestion des temps de recharge et des effets sur plusieurs tour, je pense ajouter encore une autre matrice qui fera les comptes.
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 09/12/2015 18:56 | #
Les PM, c'est les points de mouvements donc le nombre de cases que tu peux parcourir en un tour sur dofus, pas les points de magie x) Les PA sont les points d'actions donc le nombre de points que te coûtent un sort à lancer dans un tour
Super idée sinon, j'ai hâte de voir le résultat
Citer : Posté le 09/12/2015 19:01 | #
Je crois pas avoir dit que les PM étaient des points de magie
Je sais pas où tu l'as vu, mais si je l'ai dit quelque part, je m'en excuse évidemment, les PM sont les points qui permettent de se déplacer dans Dofus, idem dans mon jeu.
Je posterais sous peu 1 ou 2 screens pour montrer l'aspect qu'aura le jeu
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 09/12/2015 19:37 | #
Pour le stockage, il n'y a pas beaucoup de solutions possibles, soit une matrice, soit une liste compressée.
Mais pourquoi ne pas mettre ces données en statique ? Elles ne sont pas censées changer. Tu fais un prog en plus appelé "SORTS" avec dedans 36 conditions qui te renvoient dans une liste toutes les caractéristiques de te sorts.
Un truc du genre
If N=1
{dégat, portée, type de ligne de vu, cooldown, coût en PA...}->List 1
IfEnd
If N=2
{dégat, portée, type de ligne de vu, cooldown, coût en PA...}->List 1
IfEnd
...
Pour la "ligne de vue", il existe cette solution : l'algorithme de tracage de trait de Bresenham. Cette algo te donne les coordonnées de toutes les cases pour relier deux points connus. Il suffit de vérifier que toutes les cases soient passables et ton sort réussi
lien wiki
Citer : Posté le 09/12/2015 20:56 | #
Alors pour le stockage, les données de la matrice sont bien statiques et n'ont vocations qu'à influencer les valeurs de la matrice des caractéristiques joueurs. Je pourrais effectivement faire cette solution avec plein de if et une valeur dans la liste, je pense que je ferais ça (d'autant que j'ai déjà toutes les carac pour tous les sorts ), ça évitera de bouffer toute la place systématiquement avec une énorme matrice dont 9/10 des données ne seront finalement pas utilisée...
Je vais regarder l'algo de traçage, merci de la proposition
Ajouté le 22/12/2015 à 19:32 :
Bon les exams sont passés alors je me suis remis à programmer un peu le jeu, Pour l'instant je ne me servirais pas de l'algo de Bresenham pour la simple raison que je me trouve dans le cas particulier d'une ligne et d'une diagonales. Il me suffit donc soit d'incrémenter une seule coordonnée (ligne) soit les 2 en meme temps d'une meme valeur (diagonale).
Pour ce qui est de la gestion du coup des sorts, je vais faire un fonctionnement un peu différent que prévu. Dans Dofus on pointe avec sa souris l'endroit où l'on veut lancer le sort et c'est à la base ce que je voulais faire, cependant je me suis rendu compte que, le jeu n'était prévu que pour du 1v1 et sans sort de zones, il était inutile que je m'embête à faire ça. Le fonctionnement que j'ai décidé est plus automatique donc : le joueur choisi le sort qu'il veut lancer, et le programme vérifie si les coordonnées de l'ennemi sont compatibles avec les données (Ligne de vu, portée, position initiale). Si il y a compatibilité, on réalise l'effet du sort, sinon on renvoie à la sélection de sort sans utilisation de PA.
Il y a cependant 2 exceptions (très proche l'une de l'autre) qui sont les sorts de téléportation et à effet de déplacement. Par exemple un sort peut permettre de frapper son adversaire tout en sautant par dessus lui ce qui exige un teste supplémentaire (rien de plus qu'une extension de boucle donc faisable...). Pour la téléportation je reprendrais cependant le système de Dofus, le joueur choisira une case dans la limite de sa portée, et les obstacles ne seront pas pris en compte (ce qui évite encore une fois de se compliquer la vie )
Je fais donc quelques simplifications (pour le début en tout cas) mais qui ne devrait pas changer le jeu. Grâce à ces modifs (et si je suis un peu motivé...), je devrais sortir une version "alpha" du jeu d'ici la fin des vacances.
Quand je dis "Alpha" ça veut dire probablement buggé et certainement pas équilibré
Mais ne vous en faites pas, l'équilibrage se fera au fur et à mesure de mes testes et si possible des vôtres
Si vous avez des idées de contenu je suis preneur
Voilà je retourne programmé ça !
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 22/12/2015 19:51 | #
Et bien, que de bonnes nouvelles, ce qui veut dire que dans moins de deux semaines, on pourra se faire plaisir à bourriner des potes sur un jeu bien buggué et déséquilibré ? Génial
J'attends ça avec impatience parce que des jeux comme ça, on en a pas énormément (des mario, des dofus, ce genre de jeux durs à programmer)
Citer : Posté le 23/12/2015 09:03 | #
Ouaip ça veut dire ça
Pour l'instant le seul problème qu'il me reste encore à vraiment élucider c'est comment je vais faire pour gérer des effets de sorts cumulables sur des matrices à dimensions statiques Par exemple, premier tour on enleve 2 PA à son adversaire et cet effet dure 3 tours. Tour d'après, on relance le même sort ce qui cumule l'effet à -4PA. Cependant, 2/4 des retraits PA s'effaceront le tour d'après alors que les 2 autres se retireront 2 tours plus tard.
Si quelqu'un a une idée de génie pour ça je suis preneur
Disons que si je veux sortir un truc rapidement je peux faire un truc moche genre mettre suffisamment de cases dans ma matrice pour gérer le jeu, mais c'est pas extensible comme méthode et c'est vraiment pas de la bonne programmation
Mais sinon y'a plus trop de soucis, je pense pouvoir respecter les délais, et ça c'est le genre de truc qui me motive et fait donc que je finis en avance
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt
Citer : Posté le 23/12/2015 13:12 | #
J'ai bien une idée pour les dégâts en différé.
Il suffit d'avoir une liste où chaque case correspond aux dégâts subits pour les tours prochains.
Un exemple :
Tu une liste {0,0,0,0,0}
Tu attaques : 4 de dégât immédiat puis poison 1 de dégât pendant 3 tours
La liste devient {-4,-1,-1,-1,0}
a la fin de ton tour tu prends la valeur de la première case et tu as la vie que doit perdre la cible.
Au tour suivant la liste devient {-1,-1,-1,0,0}
Tu attaques : 4 de dégât immédiat puis poison 1 de dégât pendant 3 tours
La liste devient {-5,-2,-2,-1,0}
Et ainsi de suite
Citer : Posté le 23/12/2015 13:17 | #
C'est super chaud comme système en basic :o En tout cas, respect, on va t'appeler Ne0tux v2 (c'est un compliment Ne0' )
Citer : Posté le 23/12/2015 21:17 | # | Fichier joint
Merci pour la proposition Ninestars c'est justement ce que j'avais commencé à faire Ca reste quelque chose qui n'est pas extensible dynamiquement, mais je pense que ça serait difficile de toute façon en Basic... On peut pas concaténer les listes donc forcément ça limite un peu
Projet de combat au tour par tour type DOFUS mais totalement orienté sur le PvP. Le projet va demander un peu de temps mais soyons patient...
Le titre (laby3D) en dit long sur son contenu : il s'agit d'un simple moteur de labyrinthe en "3D" (enfin on va dire juste un effet de profondeur ). il aura la particularité d'être aggrémenté de superbes petites animations sur les rotations d'angles de vue ! j'y bosse pas mal et j'espère bien le réussir !
Le jeu devrait sortir bientôt