GL-MPRI-2014 / Ocawai

OCAWAI
8 stars 3 forks source link

Generation de la Map et des armees #39

Closed dbusatto closed 9 years ago

dbusatto commented 10 years ago

@OlivierMarty J'ai fait une première implémentation d'un générateur de map un peu débile, sur le principe du swap itéré augmentant l'homogénéité Le code est dégeu je le rendrait propre plus tard cette semaine. Maintenant FieldGenerator est un objet contenant une map et une liste d'armees (placement de départ), et il est temporairement dans common pour pouvoir l'afficher Vu que l'interface est un peu trop zoomée pour voir facilement le terrain généré, make eng en affiche un plus petit en asciiart, mais on voit pas où sont placées les unités du coup EDIT - maintenant si, et on voit le chemin d'un spawn a l'autre aussi

VLanvin commented 10 years ago

Je me permets d'intervenir juste pour dire que le fait de pouvoir zoomer/dézoomer est en cours de réalisation, ça devrait vous simplifier la tache :)

dbusatto commented 10 years ago

ouais j'ai vu c'est cool, par contre en dézoomé impossible de différencier les plaines des montagnes, faudrait changer de texture (sans vouloir être trop chiant xD ) ça va vraiment être utile donc merge dès que c'est stable :)

dbusatto commented 10 years ago

UPDATE : premiere tentative pour placer les armées pas collées les unes aux autres, pour l'instant : distance minimale entre deux spawns d'armées = (width + height ) / nbplayers c'est un choix heuristique, avec ça il semble toujours trouver légèrement plus de spawns possibles que de joueurs, donc c'est plutot viable (si par malheur il en trouve pas assez on relance la gen)

Ensuite il place les soldats autour du spawn choisi, en choisissant itérativement un voisin viable aléatoire de l'armée déjà placée

ah oui et pour l'instant il ne considère viable en tant que spawn que les carrés de 3*3 de plaines

TheoWinterhalter commented 10 years ago

Ouais, je suis désolé. J'essaie de proposer rapidement une tuile plus jolie pour la montagne, mais là j'ai un problème avec mon ordinateur… Une mise à jour n'est pas passée donc je travaille sur une vieille sauvegarde. Je vais essayer de m'en occuper quand même.

TheoWinterhalter commented 10 years ago

Voilà, c'est fait. C'est toujours pas très joli, mais j'ai fait ça rapidement.

dbusatto commented 10 years ago

Update :

VLanvin commented 10 years ago

Je ne sais pas trop si c'est censé aller là, mais qui est chargé de générer les joueurs exactement ? Ca serait bien d'avoir une petite fonction de base pour qu'on puisse récupérer un joueur avec une armée assignée.

dbusatto commented 10 years ago

gen#armies et une liste d'armées, suffit de les assigner aux joueurs dans l'ordre (vu qu'on avait qu'un joueurs pour l'instant, j'ai merge toutes les armées pour que toutes les unités soient affichées et simuler la gen a plusieurs joueurs, mais ya qu'une ligne a changer pour les re-séparer) Après je sais pas qui est chargé de la classe player (je suis pas sur qu'on y ai assigné quelqu'un)

dbaelde commented 10 years ago

Comme dit dans un autre ticket, pour moi @Paul-Gallot est responsable de player et de l'archi globale (interconnexion flexible des différents composants du jeu).

OlivierMarty commented 10 years ago

@dbusatto Qu'est ce qu'il se passe si on n'arrive pas à une carte respectant toutes les exigences ? Je n'aime pas trop le fait de faire des essais successifs... Par exemple dans le cas où il n'y a pas de chemins entre deux armées on pourrait pas modifier la carte plutôt que d'en régénérer une ?

TheoWinterhalter commented 10 years ago

Je suis d’accord. D’autant plus que chez moi c’est vraiment très long cette génération.

Mais bon pour une première itération ça le fait.

Le 29 oct. 2014 à 18:40, Olivier Marty notifications@github.com a écrit :

@dbusatto https://github.com/dbusatto Qu'est ce qu'il se passe si on n'arrive pas à une carte respectant toutes les exigences ? Je n'aime pas trop le fait de faire des essais successifs... Par exemple dans le cas où il n'y a pas de chemins entre deux armées on pourrait pas modifier la carte plutôt que d'en régénérer une ?

— Reply to this email directly or view it on GitHub https://github.com/GL-MPRI-2014/GL_MPRI_2014/issues/39#issuecomment-60969590.

dbusatto commented 10 years ago

@OlivierMarty @iSheeft disons que c'était la solution de la facilité, la génération de map par swap est quelque chose que j'ai fait en vitesse ce week end histoire que les autres modules ne soient plus limités a une ile 3*3, ce n'est pas la génération qu'on avais prévu (qui est toujours prévue au passage) et ce n'est pas fait pour être particulièrement efficace. Mon but étais juste d'avoir un truc qui tourne rapidement, et le try & fail étais adapté

Ceci dit, modifier la map pour moi ce sera le job des structures (genre routes/ponts, rivieres, peut être sable au bord de l'eau (pas sur que ce soit une structure)) qui viendront après dans la génération, donc c'est envisageable de régler les problèmes de connexité a ce moment là

Le but des tests/retry si fail c’était d'avoir un moyen simple de pouvoir laisser passer une chance faible d'erreur plutot que de réduire cette chance a 0 via une opération couteuse, qui overall serait pas rentable. Pour moi il faut garder cette politique, mais rien n'empêche de gérer la génération de façon a ce que certains tests deviennent inutiles EDIT : c'est déjà le cas avec le test vérifiant que les unités sont placées sur des tuiles où elles peuvent se déplacer (et je ne gère pas le placement initial d'unités uniquement aquatique pour l'instant. J'imagine que le plus simple serait d'essayer de générer un spawn aquatique le plus près possible du spawn terestre. Mais honetement sans les rivieres les unités aquatiques non amphibies servent a rien avec la génération courante)

Mazzocchi commented 10 years ago

J'aurait une question probablement très bête ... Est-ce qu'il y a une graine à la génération des mappes ? Désolé, ça doit vraiment être minable ^^

TheoWinterhalter commented 10 years ago

Non, c'est vrai que ça pourrait être une manière de partager la map. Ceci dit, on partagerait aussi la distribution des unités et c'est dépendant de la version et puis de on ne sait quoi…

Pour l'instant je crois que c'est sans graine mais je peux me tromper.

OlivierMarty commented 10 years ago

Il y a un Random.self_init() qui peut être remplacé par un Random.init seed.

Mazzocchi commented 10 years ago

Je pose cette question car d'un point de vu réseau, si le client peut ce générer ça mappe initiale il même c'est pas plus mal. Il n'y aurait plus qu'un seul gros transfert de données : l'IA. Et ça ne pose pas trop de problème parce que le code source pourrai être compressé de manière assez satisfaisante ! Mais tout ça et bien lointain pour l'instant.

TheoWinterhalter commented 10 years ago

C'est pas vraiment un gros fichier l'IA a mon avis. On n'envoie pas d'images ou quoi. Quelques ko tout au plus (et une seule fois par partie !).

dbusatto commented 10 years ago

Update : les plages sont générées (un peu à l'arrache pour l'instant, et le code est moche, je commenterai après les partiels) Dans la config : @OlivierMarty : j'ai pas réussi a parser les Border of water , j'ai été obligé de séparer le nom de la tuile bordée dans un string séparé border_of border_rate est la proportion de la cote, sur 1000, considérée comme "graines" pour les plages border_expansion est le nombre de fois qu'on agrandis les plages autours des graines

dbusatto commented 9 years ago

Update : Rapide test de génération par "graines de biomes" (on génère quelques points plaines, forets,etc... et on les fait grossir) Le temps de génération est quasiment divisé par 2 chez moi. La propreté de la carte dépend très fortement de certain paramètres, j'ai réglé pour que ça rende pas mal en 100*100 mais faudra qu'on essaye de faire dépendre les-dits parametres (nb de seeds, vitesse d'expansion, voisins directs ou diagonaux, degré de lissage final...) de la taille de la map pour que ça rende bien quelque soit la taille. (ça dépend déjà de la taille pour le nombre de seeds par exemple, mais faudra ajuster cette dépendance) Edit : Après implémentation de la file de priorité de dijkstra par tas binaire au lieu d'un tableau, la génération prend quelqe chose comme 0.3 secondes chez moi (plus précisément générer 100 maps prends 30-40 secondes)

dbusatto commented 9 years ago

Update :