# Jeux vidéo > Jeux vidéo (Discussions générales) > Le coin des développeurs >  J'ai un nom et un concept. Je n'ai aucune affinité avec la programmation.

## Tchey

Salut ici,

En 1992 si je me souviens, je recopiais des lignes en Basic pour afficher des carrés de tons différents sur un écran monochrome verdâtre. Quelques temps plus tard, je recopiais des bouquins de la taille d'un dictionnaire pour faire un Astéroïde. Après ça, plus rien, "on" m'a passé à la console NES puis Megadrive jusqu'à ce que je puisse décider par moi-même d'avoir de nouveau un ordinateur. Pentium 120, le top du nec plus ultra. Mais j'en ai rien fait.

En 2010-2011 j'ai vaguement recommencé à apprendre mollement le Python en recopiant et en changeant quelques scripts pour faire un jeu d'aventure textuelle. Après 4 salles, j'ai arrêté, faute de temps à consacrer et de trop gros efforts intellectuels pour concevoir un code bancal par moi-même sans aucun apprentissage préalable.

Depuis, je pense que dans une seconde vie, j'aimerais m'investir dans "ça", car l'idée me plait. Jouer à dieu, c'est fun, c'est pour ça que je suis presque toujours MJ aux jeux de rôle. Imaginez, improvisez, interpréter, aucun soucis. Poser l'ensemble sur un papier dans un cadre, là je coince.

Mon idée évidemment et absolument brillante, c'est de commencer avec un jeu textuel de combats de mutants. On entrerait les actions en choisissant les "armes", les "actions" et les "cibles".

Par exemple :

- "avec machoire #1, mordre, le bras adversaire #4"
- "avec machoire #1, cracher, tête adversaire #1"
- "avec griffe #2, déchirer, tête adversaire #1"
- "avec bras #1, défendre, ma tête #2"

Chaque morceau peut encaisser certains dégâts, etc. Dans l'absolu, en développant le thème, j'ai une idée de jeu tactique au tour par tour avec peu d'unités (1 à 3 par joueur) mais pleines d'options chacune...

Vous pensez que je suis foutu et que mes idées géniales ne verront jamais le jour ?

----------


## leDucDeRien

Salut, si tu ne veux pas t'embêter avec le moteur (si j'ai bien capté) pourquoi ne pas utiliser un truc déjà fait prévu à cet effet ? Je pense par exemple à Inform http://inform-fiction.org/

----------


## Tchey

Je ne connais pas. De ce que je vois, ça date de 2008, et c'est fait pour faire des trucs comme les livres dont vous êtes le héros : un texte, un choix, un autre texte, etc.

----------


## leDucDeRien

Ah ok, je pensais que tu imaginais quelque chose sous cette forme. 
Je ne sais pas trop s'il existe d'autres moteurs dans cette idée, ça vaudrait le coup d'oeil de se renseigner. 

Tu pourrais aussi essayer de schématiser tes idées. Je ne parle pas de "diagrammes" "officiels", juste pour organiser les idées. De cette manière c'est plus simple pour le lecteur de voir où tu veux en venir et pour toi ça devrait te permettre d’éclaircir/agencer tes idées.

----------


## aggelon

Ca me paraît jouable  :;): 




> (1 à 3 par joueur)


Combat, adversaire... J'en déduis au moins 2 participants, et comme tu dis 'par joueur', je suppose que ça serait au moins 2, en hotseat ?
Remarque, c'est plus facile, et un meilleur début, que de pondre une IA  ::P: 

Franchement, ça me paraît accessible.

En plus, c'est assez simple et donc une très bonne chose pour se mettre le pied à l'étrier : beaucoup d'abandons viennent du fait le dev en herbe est trop ambitieux  :;): 

Je pense qu'il faut que tu :
1) réfléchisses le plus en détail possible à ce que tu veux ET LE NOTER PAR ECRIT. La conception découlera de ton objectif à atteindre. Ensuite le code n'est que la concrétisation de la conception :bisounours_spotted:
2) réfléchisses à l'interface (tu parles de jeu textuel, mais que se passe-t-il si j'écris "defendre" sans accent par exemple ? il te faudra sans doute créer un petit analyseur lexical/lexer et un syntaxique/parser  ::trollface::  pas de panique, c'est des grands mots pour simplement désigner un peu de rigueur et de simplicité))

Un autre point positif, c'est que je sais que tu connais un très large éventail de mécanismes de jeu, j'imagine donc que tu as déjà en tête une liste de 'ce-que-tu-ne-veux-pas' et une autre de 'ce-que-j'aimerais-obtenir'...

Le truc positif aussi, c'est que si tu arrives au bout de ce projet, cela te donnera confiance pour en poursuivre d'autres !
D'autant plus que celui-là me semble accessible.

Je te souhaite tout le bien possible !

----------


## Tchey

1/ J'ai un carnet couplé avec un document info, avec des trucs dedans. J'alimente, change, complète... selon l'humeur.

2/ L'interface dans un premier temps, c'est "simple" :

Utiliser :
(a) Machoire #1
(b) Machoire #2
(c) Griffes #1
(d) Pied #1
...
=> b

Action :
(a) Mordre
(b) Cracher
(c) Grogner
...
=> a

Cible :
(a) Bras #1
(b) Bras #2
(c) Bras #3
(d) Tête #1
...
=> c


Comme ça pas besoin justement de vérifier l'orthographe ou autre, juste à choisir entre les possibles.

Le rendu, c'est une phrase du genre : 

"Vous utilisez Machoire #2 pour Mordre le Bras #3 de votre adversaire. Cette attaque inflige 4 points de dégâts à Bras #4."

Quand une partie du mutant est foutue, elle n'est plus utilisable. Quand les parties vitales sont foutues, c'est fini.

La suite, c'est de construire par dessus ce "module", pour avoir une forme d'inventaire (armes, boucliers, armures, médailles...), puis pour avoir une gestion en campagne avec soin, récupération des matières premières sur les cadavres, etc.
La suite, c'est d'avoir une écurie avec une progression, un système d'expérience, de récompenses...
La suite, c'est de sortir de l'arène pour explorer un monde ouvert avec des quêtes ouvertes.
La suite, c'est de conquérir des lieux, des villages, et de bâtir un "nid".
La suite, c'est de progresser jusqu'à devenir un mutant-dieu et de régner sur sa descendance, en exploitant des régions (un peu comme un Dominion en ce qui concerne la carte, pas comme un Civilization).
La suite, c'est...

(édition)

Le début de la gloire :

----------


## aggelon

Ah ! Ca a l'air chouette présenté comme cela !

Et oui, effectivement, les choix avec a b c, c'est plus pratique et plus simple à coder  :;): 

Bonne chance à toi, et tiens-nous au courant !

----------


## LaVaBo

Tu peux faire facilement une maquette dans excel, vu le format du jeu (pas besoin de graphisme pour tester le système de jeu)

----------


## Louck

Il y a clairement moyen de généraliser ce système d'action, ce n'est pas le plus gros problème.

Le plus gros défi, c'est surtout le scénario  ::): .

----------


## UndeadThings

Y'a pas moyen d'avoir l'interface dessiner sous paint? Pour avoir un visuel.  ::): 
Sinon en Java ou javascript ça a pas l'air trop compliqué comme projet.

----------


## leDucDeRien

Si toute la partie programmation te rebute je pourrai peut-être t'aider sur ce point (par contre pas en python); Je suis loinnnnn d'être un expert, je me ferais même très certainement incendier par ces derniers s'ils voyaient ma manière de fonctionner  ::XD::  
Mais ça te permettrait de te concentrer sur le reste et d'avoir (normalement  ::):  ) quelque chose de jouable plutôt qu'un jeu voué à rester sur papier pour le restant de l'éternité.

----------


## Tchey

> Tu peux faire facilement une maquette dans excel


J'ignore comment utiliser un tableur de cette façon (Excel, ou LibreOffice dans mon cas).




> Java ou javascript


Je suis sous Linux, et je n'y connais (presque) rien en programmation. De ce que j'ai lu, Python semble le plus adapté pour apprendre proprement, et aussi pour ce type de jeu, et c'est multisupport et c'est intégré dans mon Linux déjà. Ce que j'ai en tête, de mes lectures passées, c'est Python, Lua, HTML5, Ruby. En Python, y'a un mec qui fait un travail remarquable : http://www.ultimaratioregum.co.uk/ et que je suis depuis ses tous débuts. Il a commencé en même temps que j'ai commencé à m'intéresser à la chose Programmation, sauf que lui ce n'est pas arrêté depuis.




> l'interface dessiner sous paint


Je n'envisage pas de graphismes dans un premier temps, juste du texte brut et moche. Je vais voir si je peux faire un truc visuel, mais je n'ai encore absolument rien, juste un script pour afficher deux boutons qui ne font rien ! Le début de la gloire, c'est que j'ai pu installer Python, un IDE, Notepadqq et que j'ai pu suivre un tuto expresse pour afficher deux boutons avec la lib Tkinder. Je ne souhaite pas passer par PyGame, pas avant un bon moment, si je reste sur Python.




> la partie programmation te rebute


Ca ne me rebute pas du tout, au contraire l'idée d'écrire un tel poème, que dis-je, une geste, me fascine. C'est seulement qu'en terme de savoir, je suis quelque peu en déficit de ce côté là ! D'ailleurs je ne comprends pas bien ta proposition. Je te "dicte" mes idées et toi tu codes ?

----------


## leDucDeRien

Ah oui okok!
L'idée était la suivante: je connais un peu la lib SFML (elle permet entre autres la création de jeux) donc si tu ne veux pas passer trop de temps à étudier un langage, je peux réaliser un prototype avec cette lib. 
Mais si tu souhaites profiter de ce projet pour te mettre à jour en python alors abandonne cette idée (si tu partages les sources j'en profiterai pour découvrir ce langage  ::XD::  )


Pour en revenir au jeu, est-ce que tu as des idées sur le pitch du jeu, sur notre perso', l'objectif etc ?

----------


## Louck

> Je te "dicte" mes idées et toi tu codes ?


L'idéal est que tu puisses nous dire ce que tu veux faire au final, sans aller dans la technique.

Pour l'instant, tu nous présentes juste un concept de gameplay. Pourquoi pas. Mais ca ne fait pas tout un jeu (et sans trop critiquer, ce n'est pas un concept des plus innovant  ::P: ).

On peut partir de ton idée initial:



> Jouer à dieu, c'est fun, c'est pour ça que je suis presque toujours MJ aux jeux de rôle. Imaginez, improvisez, interpréter, aucun soucis.


Il existe déjà des "god game" dont From Dust, Black and White... ou des simulations / stratégies / tactiques qui s'y approchent, dont Spore et Dwarf Fortress.
Est-ce qu'il y a un jeu existant dont tu veux te baser pour ton projet ? Ou tu as en tête un concept un peu plus original ou différent ?


Ou tu veux un combat en arène oû le joueur fait tout ce qu'il veut ?  ::P: 

Ou, au final, tu veux juste expérimenter techniquement un jeu vidéo ?

----------


## Tchey

Mon idée géniale est bien un concept de gameplay pas vraiment innovant, avec d'autres concepts géniaux qui viennent se greffer ensuite par dessus à mesure que mon génie progresse. Un peu comme pour un jeu de plateforme, on commence par faire bouger le personnage, on ajoute des obstacles, des collisions, puis éventuellement des adversaires, etc.




> Ou tu veux un combat en arène oû le joueur fait tout ce qu'il veut ? 
> 
> Ou, au final, tu veux juste expérimenter techniquement un jeu vidéo ?


Oué voilà. Les deux. Je pense que c'est une bonne base pour apprendre des trucs, et ajouter des trucs petit à petit.

Je progresse, j'ai appris à faire un QCM :

----------


## aggelon

::o:  Han ! Ce teasing de malade !!!

----------


## Louck

Ok donc ce que j'ai compris, ce que tu veux (ou peux) faire:

- Un écran de création du protagoniste, oû c'est un simple QCM (ce que tu fais déjà)
- Un petit écran pour présenter l'adversaire (qui est généré aléatoirement, ca peut être fun. Pas de contrainte sur la difficulté dans un premier temps).
- L'écran de combat où, chacun son tour, le joueur / l'adversaire exécute un action (Pour commencer, l'IA peut attaquer directement le joueur avec son arme de base, sur un membre sélectionné aléatoirement).


Et du coup ce qui peut rendre le jeu fun, c'est que le joueur puisse exécuter n'importe quelle action, à son envie (cf les premiers posts). A la limite de l'imagination ?  ::): 


Ca convient ?  ::): 



PS: Je ne donne que les idées. Je n'ai pas le temps de travailler sur un nouveau jeu  ::P: .

----------


## UndeadThings

> Je n'envisage pas de graphismes dans un premier temps, juste du texte brut et moche. Je vais voir si je peux faire un truc visuel, mais je n'ai encore absolument rien, juste un script pour afficher deux boutons qui ne font rien ! Le début de la gloire, c'est que j'ai pu installer Python, un IDE, Notepadqq et que j'ai pu suivre un tuto expresse pour afficher deux boutons avec la lib Tkinder. Je ne souhaite pas passer par PyGame, pas avant un bon moment, si je reste sur Python.


Quand j'ai parlé d'interface, je n'ai pas pensé a graphisme, mais plus a agencement des stats, actions, info a l'écran.  ::): 

D'ailleurs, petite question a tout les canards ici présent connaisseur (c'est un peu dans le sujet), le livre "java pour les nuls" est acceptable?

----------


## Roscopolo

> Je ne connais pas. De ce que je vois, ça date de 2008, et c'est fait pour faire des trucs comme les livres dont vous êtes le héros : un texte, un choix, un autre texte, etc.


Non: en fait c'est fait pour faire exactement ce que tu veux.

Les choix du joueur ne sont pas prédéfinis et l'utilisateur peut saisir de véritables phrases en langage naturel (examiner le pilier, lancer une boule de feu sur le prêtre, etc). Et c'est fait par un type brillant avec une très longue expérience de la création de ce genre de jeux.

Le seul gros point noir c'est que je parie qu'il ne supporte que l'anglais.





> - "avec machoire #1, mordre, le bras adversaire #4"


Si tu restes sur Python, sache qu'avec les bons outils avoir une interface en langage naturel n'est pas tellement plus dur.

 En gros tu appelleras une fonction de cet outil (ou d'un autre) et il te retournera un arbre représentant la phrase. Démonstration en anglais avec les tags correspondants.

Du coup analyser l'arbre retourné pour reconnaître des motifs prédéfinis est assez simple. Par contre tu voudras supporter un assez bon nombre de variations tout de même, même si l'outil gère les cas triviaux (is not <-> isn't). Et il y a des bugs: si tu déclares que "la voleuse retient une otage" et que le joueur te répond "tue-la", c'est une ambiguïté fatale. Aujourd'hui aucun algo ne surmonte ça. Et puis il y a le syntax guessing.

Mot-clé : part-of-speech tagging / pos tagging. Nltk est le plus connu sur Python mais je ne sais pas s'il supporte le français.





> Je progresse, j'ai appris à faire un QCM :


D'abord, bravo.  :;): 

Mais le problème avec les interfaces en mode console c'est que tu dois réinventer la roue et tu te retrouves à créer un framework UI au lieu de créer un jeu.

A contrario il existe de nombreuses et bonnes bibliothèques pour créer une UI graphique. Tout ce que tu aurais à faire ce serait de dire où placer chaque chose et comment réagir aux actions de l'utilisateur. Bref, uniquement ce qui relève du jeu.

----------


## Tchey

J'ai un peu dévié, et après avoir louché sur SuperPower HTML5, j'ai posé mes valises sur LOVE2D et le LUA pour le moment, histoire d'avoir quelques notions de trucs et de bidules. J'ai suivi un tutoriel pour faire un Space Invaders et j'ai changé des trucs pour que ce soit horizontal et pas vertical... 

Du coup, j'ai fait ça, je vais le mettre en vente sur Steam en Early Acces avec un teasing de fou, puis ne rien faire. J'hésite encore. C'est bruité à la bouche, mais vous ne pourrez pas en profiter sur cette image :



Prochainement, en plus du bruitage du tir (à la bouche), un bruitage (à la bouche) d'explosion, et des particules quand les ennemis meurent. Ca va tout déchirer.

Sinon sérieusement, le système de collision n'a pas été si simple à comprendre, j'ai eu mal au neurone, mais maintenant ça va. Environ 150 lignes, j'ai quand même mis trois jours à les sortir.

J'raconte ça parce que dans 2 ans quand je serais le nouveau Notch, vous serez fier d'avoir été témoin de mes premiers pas.

(édition)

Oué, j'ai réussi à supprimer les tirs du joueur à l'impact (avant ils traversaient la cible et pouvaient toucher les ennemis de la seconde vague), et à supprimer les tirs après une certaine distance (avant on pouvait tirer dans le vide avant le seconde vague, et toucher les ennemis pas encore dans l'écran).

Par contre, les particules à la mort d'un ennemi, ça plante, je ne trouve pas pourquoi.

----------


## Nattefrost

Préssé d'écouter les bruitages à la bouche  ::): . Perso j'avais fait le tuto aussi en changeant un tas de trucs, ça a fini par être complètement WTF.

----------


## Tchey

Voilà, Bastabloc : (édition : version pareille mais mieux .02 ) : http://jeux1d100.net/!/dradro/Bastabloc1601.02.love

Vous êtes le carré bleu, vous commencez avec un score de 0.
Bougez avec ESDF, tirez avec les touches fléchées dans les 4 directions.

Les ennemis rouges rapportent 1 point. S'ils vous touchent, vous perdez 5 points. Relativement lourdeaux, ils arrivent en grand nombre.
Les ennemis verts rapportent 3 points. S'ils vous touchent, vous perdez 5 points. Ils sont plus rapides et plus agiles que les rouges, mais moins nombreux.

Si le score devient négatif, vous perdez.
Si le score atteint 100, vous gagnez.



Je ne suis pas certain de comment distribuer la chose. A priori là, ça fonctionne très simplement pour Linux quand Love 0.10.0 est installé.
Je vais voir si j'arrive à faire un .exe pour Windows, histoire de comprendre comment ça marche.

http://love2d.org/wiki/Game_Distribution

Je n'arrive pour le moment pas à faire un .exe fonctionnel (que je teste avec WINE (d'autres love .exe fonctionnent ainsi sans soucis))

----------


## Nattefrost

C'est assez simple de bundler un zip qui contient le runtime löve : https://love2d.org/wiki/Game_Distribution
Je teste ta première oeuvre  ::P: 

Haha putain après 15 secondes j'en ai déjà marre des sons à la bouche  ::lol:: . C'aurait été une entrée valable de make something horrible.

----------


## Tchey

Je ne supporte pas la "musique" en fait moi non plus, haha ! J'ai mis une version avec une musique libre, ça passe mieux, et j'ai corrigé quelques erreurs en passant.

http://jeux1d100.net/!/dradro/Bastabloc1601.02.love

J'ai pu d'yeux maintenant... Je voulais essayer de faire pop les ennemis sans qu'ils ne puissent se toucher les uns les autres, mais je n'ai pas trouvé, ça attendra...

----------


## Hideo

En tout cas bravo pour la persévérance, y'en a beaucoup qui ne vont pas si loin  :;):

----------


## Tchey

"Pas si loin" bah c'est le tout début pourtant, je ne fais que modifier un tutoriel basique...

J'en suis là. J'ai remplacé les blocs par des images et mis un fond, tous issus des Assets libres et offerts par SuperPowerHTML5, des sons et de la musique pas faite à la bouche... J'ai aussi ajouté une arme secondaire via la touche espace, qui tire un puissant rayon traversant tout l'écran, mais sur un cooldown lent.

Dans les trucs que je veux essayer ensuite : 

- mettre un "vrai" menu
- jouer à la souris (pour le moment au clavier)
- un semblant d'interface
- des bonus/malus par exemple des munitions pour le tir spécial.
- une jauge de vie/score
- faire que les ennemis tournent le nez vers le joueur quand ils bougent (et changer l'image pour faire un vaisseau ou n'importe quoi avec un "devant" et un "derrière").
- ...

Les trucs que je n'arrive pas :

- éviter la superposition des ennemis
- je n'ai encore absolument aucune idée de comment faire un truc au tour par tour. Je n'ai trouvé aucun tuto sur le sujet pour Love.

Une image :

Le joueur est la soucoupe rouge, le rayon est parti, les deux types d'ennemis (poulpes lents et nombreux, bidules petits et agiles)...

----------


## Hyperpenguin

Ça me semble pas trop compliqué le tour par tour, un boolean Isplayerturn qui va gérer si c'est le tour du joueur ou de tel ennemi, et que tu passe a false lorsque tu as fini le tour du joueur. Comme ça tant qu'il est à true, le jeu n'est pas bloqué mais tu ne calcul rien côté ennemi, et quand tu le passe à false, tu inhibe les commandes du joueur et résoud le tour ennemi.

----------


## Tchey

Pas beaucoup de temps à consacrer aux jeux et encore moins à apprendre à programmer, mais quand même un peu, je n'abandonne pas encore. Je bloque complètement sur ce point du tour par tour, je ne trouve pas de tutoriel pour les simplets, à l'inverse des étapes précédentes que j'ai suivi... J'arrive seulement à mettre un genre de chrono sur le joueur, pour le déplacement et les tirs, mais en fait c'est juste un gros cooldown. Mon programme dit :

"Les unités de temps du joueur sont égales à 1000. Si le joueur appuie sur "droite", il se déplace de x pixels vers la droite, et perd 100 unités de temps. En arrière plan, le jeu remonte doucement le compteur des unités jusqu'à atteindre 1000 unités."

Y'a surement moyen d'en tirer quelque chose mais ce n'est pas du tout ce que je cherche pour apprendre. Je cherche plutôt à faire que quand c'est au tour du joueur, il peut faire ce qu'il veut, ensuite c'est l'autre joueur ou l'IA, etc Et là dedans j'intègre une notion de coût en points d'action ou d'unités de temps ou autre système de comptage.

Je comprends le principe du boolean isPlayerTurn, mais pas du tout comment l'écrire en vrai.

----------


## aggelon

Tu as plusieurs possibilités.

Le isPlayerTurn est ce qu'on appelle un sémaphore, une sorte de feu rouge/vert, utilisé quand plusieurs entités travaillent en parallèle et doivent/veulent accéder à une même ressource qui nécessite un accès exclusif, un peu comme les piétons/voitures dans un croisement.
Dans cet exemple, le rouge indiquerait à l'entité 'joueur' que ce n'est pas à lui de jouer, le programme bouclerait à scruter le feu et à attendre qu'il passe au vert.
A l'inverse pour l'ordi évidemment.

Personnellement, je n'aurais pas choisi cette conception qui ne me semble pas appropriée, en plus les entités vont consommer du CPU et l'essentiel de leur temps à regarder la couleur du feu...
... à moins ensuite de gérer un système d'événement auquel le joueur doit s'abonner, afin qu'il reçoive une alerte lorsque le feu passe vert... mais bon, ça me semble compliquer inutilement...

La première autre solution que m'était venue à l'esprit, c'est plutôt un ordonnanceur (scheduler).
C'est une sorte de maître du jeu qui désigne c'est au tour de qui de jouer.

Charge à l'entité SCHEDULER de donner les ordres :
- entité joueur "humain" joue
- entité "ordi" joue
- entité joueur "humain" joue
- ...
_EDIT: le scheduler gère les entités dans un "tourniquet" (round-robin)_

De plus tu peux lui donner des fonctionnalités externes (controle de cohérence, victoire/défaite, événement aléatoire, etc...)

Les autres entités sont subordonnées au scheduler : elles dorment (ne sont pas appelées) tandis que le scheduler ne les appellent pas pour jouer.

L'avantage c'est que chaque entité commence avec un environnement figé, et ne donne au scheduler qu'une seule réponse : son choix d'action.

On peut alors imaginer qu'aucune des 2 entités n'interfèrent directement dans le jeu : elles expriment leur souhait de jeu au scheduler, charge à lui de vérifier que le coup est légal (c'est optionnel) puis de l'exécuter.

Exemple:
- scheduler dit "humain à toi de jouer"
- humain dit "mon 'perso 3' attaque 'ordi 7' à la tête avec hache"
- scheduler fait le nécessaire (animations, bruitages, enlève des points de vie à ordi 7, augmente la skill de perso 3, regarde si ordi 7 est mort, éventuellement lui abime son casque, etc...)
- scheduler dit "ordi, c'est à toi de jouer"
- etc...

Autre avantage, tu peux inclure autant de joueurs que tu veux, c'est le scheduler qui gère les tours de jeu  :;): 

De plus, avec le scheduler, tu assures l'accès aux ressources et le séquencement, donc la cohérence du tout (par exemple il n'y a pas de risque que 2 joueurs frappent le même ennemi en même temps et que celui qui aurait dû frapper en second ne bénéficie pas de la baisse de l'armure qu'aurait dû engendrer le coup porté par le premier joueur)...



Ah, j'ai oublié le plus important : bravo pour ton implication et ta persévérance  ::):

----------


## Tchey

Intéressant cette idée de "maitre de jeu", je retiens, surtout que ça colle à l'idée générale de mon jeu ultime.

Pour le moment ça ne m'avance pas du tout ceci dit, vu mon niveau actuel de connaissance. Quand à ma persévérance et mon implication, elles ont peu à faire en ce moment, je ne fais que bidouiller quelques tutoriels simples, comme le montre la capture un peu plus haut. Je n'en suis qu'à "là", alors avant de faire une entité qui décide si les actions des participants sont légales, il va se passer un certain temps !

----------


## Hyperpenguin

> Intéressant cette idée de "maitre de jeu", je retiens, surtout que ça colle à l'idée générale de mon jeu ultime.
> 
> Pour le moment ça ne m'avance pas du tout ceci dit, vu mon niveau actuel de connaissance. Quand à ma persévérance et mon implication, elles ont peu à faire en ce moment, je ne fais que bidouiller quelques tutoriels simples, comme le montre la capture un peu plus haut. Je n'en suis qu'à "là", alors avant de faire une entité qui décide si les actions des participants sont légales, il va se passer un certain temps !


Aggelon à super bien expliqué le truc. Ce que tu peux faire c'est que des que t'as un moment tu couche tout ça sur papier dans un premier temps, ce que tu veux que le scheduler fasse, les règles de ton jeux, comment le scheduler dois les appliquer. Une fois devant l'ordinateur avoir toute ces infos au propre devrait vraiment te faciliter la tâche. Courage!

----------


## Tchey

Petit passage rapide pour dire que je n'ai pas abandonné. Très peu progressé du côté de l'apprentissage "technique", j'ai surtout gribouillé des pages de brouillon en papier avec un vrai crayon pour chercher une interface, lister des trucs à faire, poser quelques idées, virer des choses, ajouter des éléments, etc.

Après avoir fait un détour par Löve et Lua, que je n'ai pas retouché depuis mes derniers messages, je reprends du temps et me retourne vers Python. Du coup, en 4 mois, j'en suis là. D'ici 4 ans j'suis sûr j'arrive à intégrer des données "réelles" dans ces cadres.

----------


## Nattefrost

Les rapides descriptions textuelles que tu as mises me font un peu penser au systeme de combat de Dwarf Fortress, ce qui ne m'étonne qu'à moitié (et encore)  :;): .
Du coup c'est tkinter le framework GUI ? Si c'est ça (ça y ressemble fort) et si t'as des questions je l'ai pas mal utilisé.

----------


## Tchey

J'utilise tkinter oui, et Python3+ et je suis sous Linux Mint 17.3.

Il m'a fallu littéralement des heures pour arriver à "ça". Cette fois, tout est "vrai", le texte en haut à droite et à gauche est réellement importé depuis un fichier .txt, et les boutons "radio" en bas sont réellement activables, bien qu'ils ne fassent strictement rien pour le moment. Les couleurs sont là uniquement pour me repérer dans les frames, labels etc.

----------


## Nattefrost

Ca va aller de mieux en mieux, une fois que t'aura pratiqué tkinter tu aura l'intuition même pour des trucs que tu n'a jamais fait  ::): .
Seul truc : le bouton quitter au milieu en haut ça fait bizarre  :;): .

----------


## Hideo

Nattefrost a raison, tu es en train de faire le plus "difficile"  :;):

----------


## Nattefrost

Peut être pas le plus difficile (l'implémentatoin du systeme de combat peut etre complexe) mais commencer par l'UI permet de savoir comment tu veux que l'utilisateur final y joue, avec ça en tête ça peut faciliter l'implémentation.

----------


## Tchey

Ouep, je pressens de très longues heures à lire et à comprendre comment faire un système de combat simpliste.

Maintenant ça ressemble à ça. J'arrive à changer les couleurs des boutons en attente, mais pas de ceux sélectionnés, et je n'ai pas vu dans la documentation par exemple là : http://effbot.org/tkinterbook/button.htm
Je garde un gros bouton Quitter pour l'instant pour cliquer rapidement dessus quand je teste le truc.
La fenêtre a une taille minimale, mais on peut l'agrandir, ce qui étire le cadre central avec les événements et le bas avec les boutons, mais pas les deux zones bleu/rouge.



C'est plutôt proche de mon gribouillage initial je trouve :

----------


## Hyperpenguin

Chapeau, ça avance petit à petit!

----------


## Nattefrost

Ouais ça avance pas mal dis-donc !
Pour la doc j'en ai parcouru quelques-unes (dont effbot) quand je m'y suis mis et à terme je trouve que la plus complète et facile à utiliser c'est celle ci, tu peux download le pdf et la table des matières est clickable. Le seul soucis c'est que c'est pour Tkinter (et non tkinter) en python2, mais c'est le cas de toutes les docs que j'ia pu voir. (d'ailleurs si tu en a une pour tkinter/python3 je suis preneur)
http://infohost.nmt.edu/tcc/help/pub...er/tkinter.pdf

----------


## Tchey

Je tape dans Google le mot que je cherche, par exemple "tkinter button" et je regarde ce que je trouve. Je n'ai pas de doc spécifique.

J'ai récris une partie du code, c'était un peu trop confus avec les frame, label, grid, button... dans des coins bizarres. J'en ai profité pour corriger les éléments qui me posaient soucis dans mon message précédent. Maintenant c'est plus propre, je trouve, et le résultat aussi. 
Reste notamment le soucis des boutons appuyés, qui n'ont semble-t-il pas de modificateur pour cet état "appuyé", seulement pour "passif" et "survolé" (sur l'image le curseur est sur "Pince" dans la seconde colonne).

----------


## Nattefrost

Ce sont des widgets de quel type ?  tkinter.Buttons ? C'est pas plutot des groupements de radiobuttons que tu veux? (une liste de boutons dont un seul peut être activé)
la doc ici : http://infohost.nmt.edu/tcc/help/pub...diobutton.html

----------


## Tchey

Chaque colonne est un groupe de radiobuttons oui, on ne peut choisir qu'un seul Membre, un seul Organe, une seule Action, un seul Effet et une seule Cible.

L'idée de séparer les Membres et les Organes est que je veux, plus tard, que le joueur puisse construire son mutant à volonté, avec trois bras, une jambe, deux têtes... Et placer les organes n'importe où, par exemple une corne sur le bras gauche, une machoire dans la jambe droite... Avec des limitations (chaque Membre ne peut recevoir qu'une certaine masse, et chaque Organe possède une certaine masse).

Bon là j'entame l'étape de l'amorce du départ de la compréhension de récupérer des données de plusieurs boutons pour faire qu'il se passe un truc.

/em s'éponge le front

Quand je pense aux "petits jeux" que certains font en 72 heures, ça me...

/em s'éponge le clavier

----------


## Nattefrost

Sauf qu'ils sont plus expérimentés, ceux qui font des jeux en 72h  ::P: .
Franchement c'est cool et on voit que t'as déjà pensé à des choses (la masse, les organes ou on veut etc)

----------


## Tchey

J'ai changé les Radiobuttons pour des Lists, et j'ai a peu près compris comment récupérer les valeurs, donc la phrase est "dynamique" ici et change en fonction des choix et j'ai corrigé plusieurs couac dans l'aspect général, même si ça reste basique.

Maintenant faut que je trouve comment faire pour que les colonnes affichent les info selon les options disponibles. Par exemple, si dans la tête de mon mutant j'ai une machoire et une pince, la colonne Organes ne doit afficher que ces deux là. Ensuite la colonne Action ne doit afficher que les actions relatives à l'organe choisit, par exemple Machoire peut Frapper, Attraper... Ensuite les Effets, là je ne suis pas sûr de moi, et enfin la cible qui reste en l'état pour le moment car je n'oppose que deux adversaires humanoides.

Pour le moment, je vise simple, avec une réserve de Vie par membre, et une valeur d'attaque pour chaque organe, la suite, c'est la suite...

Ensuite faut que je colle les info pour chaque bidules.

Le système "complet" que j'ai en tête inclus une masse pour chaque élément, et une masse maximum pour chaque membre.

-Les éléments sont : Organes (mais pas tels qu'annoncé jusqu'à maintenant), Sens, Composant, Enveloppe, Outils
-Dans n'importe quel membre, on doit trouver au minimum X éléments de chaque. Certains peuvent ne pas être présent, par exemple Sens (vue, toucher, magnétisme...), alors que d'autres doivent, par exemple Enveloppe (peau, poil, écaille...) et Composant (os, gélatine, cartilage...).
-Dans l'ensemble du corps, on doit trouver au moins un de chacun des 4 organes vitaux : cerveau (nerf), coeur (sang), poumon (gaz), glande (chimie), ou plusieurs.
-Il existe 4 attributs, Nerf (action, agilité), Sang (puissance, résistance), Gaz (endurance, réserve) et Chimie (pouvoir, cohésion), et chaque élément agit avec l'un ou plusieurs.

Ensuite, bah on se tape sur la gueule. On peut utiliser n'importe quel outil dans un membre, ce qui consomme une partie de l'énergie des attributs liés. On peut détruire n'importe quel membre, ce qui influence sur les attributs de la cible. Si les Organes vitaux sont touchés, impact majeur sur le comportement, et si les 4 sont détruits, on crève.

Bon, faut que je raffine tout ça, et j'ai quelques pages papiers de "trucs en vrac", donc si ça se trouve ce sera très différent de l'idée initiale.

----------


## Hyperpenguin

Pour l'affichage des boutons faut des boucles, la 1ere va compter les éléments dans la liste des organes disponible, et la deuxième va afficher autant de boutons que compté précédemment, avec texte du bouton 1 = texte du premier élément de ta liste d'organe dispo, et zisini de suite. Je connais pas le language mais y'a ptete moyen de faire plus simple suivant les API dispos.

----------


## Tchey

J'ai repris ce week-end après une longue pause pleine d'autres choses et d'absences.

Pas de TKinter encore, mais du Terminal "pure", histoire de faire autre chose qu'une coquille vide.

En suivant différents tutoriaux et conseils, j'en suis à faire une boutique et un inventaire simpliste. Le joueur peut acheter des trucs dans une liste, avec des jetons récupérés en gagnant des combats dans une arène basique.
Les potions s'accumulent dans l'inventaire pour être utiliser en combat, tandis que l'achat d'une arme remplace pour le moment la précédente, et n'offre rien qu'un changement brute des dégâts infligés.
Pas encore regardé comment faire un "vrai" inventaire avec possibilité d'équiper/retirer du matériel.

----------


## burgzaza

Bon retour.
J'aime bien ton idée de combats de mutants avec autant de détails, continue ! Sinon on sera nombreux ici à te retrouver, puis sur nos jambes, on utilisera nos genoux pour t'exploser, avec frustration, les gonades.  ::trollface::

----------


## Tchey

Quelques jours à faire mumuse avec le Godot Engine

----------


## Patate

Tu vas adapter ton jeu sur ce moteur ?

----------


## Darkath

> Tu vas adapter ton jeu sur ce moteur ?


En attendant, Godot peut être une solution 



 ::ninja::

----------


## Poussin Joyeux

Bravo!  ::): 
S'il n'y avait pas eu le  ::ninja::  j'aurais pas cherché plus longtemps mais ça m'a intrigué.  ::P:

----------


## Ashley TOUCRU

:HS: Je ne suis pas lecteur, loin de là, mais je recommande chaudement. Je l'ai dévoré en une soirée.  :;):  :/HS:

----------


## Tchey

Je suis retourné à l'étape brouillon pour la fabrication du PJ mutantatoire. Plus j'y pense et plus mon idée me parait foireuse dans son application gameplay.




> sur nos jambes, on utilisera nos genoux pour t'exploser, avec frustration, les gonades


Comme je ne veux pas de vie, mana etc mais des effets (arraché, sonné, perforé, malade, saignant...), maintenant j'envisage un truc comme ceci :



C'est une représentation du PJ dans la feuille de perso (un mutant slimanoïpoulpex). Chaque carré est un composant, et chaque série connectée est un membre. Ici en rouge le noyau "buste", en bleu quatre "bras" et en vert quatre "accessoires". Chaque carré donne une compétence, perk ou autre, et si deux ou plusieurs carrés identiques sont sur le même membre, l'efficacité du perk augmente.

Pas exemple, sur un bras avec 3 carrés "Assommer" et 2 carré "Régénérer", le PJ possède la compétence associée, à ce niveau.

Si d'aventure le PJ perd un bout de bras, au lieu de perdre des points de vie, il dévolue, et doit œuvrer pour retrouver ses capacités, ou en profiter pour en changer.

Avec ce système, je limite la puissance, avec soit "quelques trucs puissants", soit "plusieurs trucs moins puissants", soit "plein de trucs pas puissants". J'envisage aussi de limiter 1 membre = 1 perk, et donc par exemple dans ce bras il n'y aurait que "Assommer" ou que "Régénérer", mais pas les deux.

Des avis ?

----------


## Grhyll

C'est intriguant, mais pas super clair pour moi, j'imagine pas tout à fait ce que ça peut donner mis en application.

----------


## Tchey

Par exemple,

"herboriste" à 1 permet de récolter une plante, 2 = 1 ou 2 plantes, 3 = 2 unités, 4 = 2 ou 3 plantes et 5 = 3 plantes
"déplacement" modifie le nombre de cases par tour (pas encore défini, mais disons 2 sans membre (tu rampes...), +1 par unité)

Si tu n'as pas d'organe d'orientation (œil, écho...) tu vois à 1 case, si tu as 1 œil tu vois à 3 cases, 2 yeux tu vois à 10 cases, 5 yeux à 20 cases...

Enfin sur le papier, car en code j'en suis toujours à pas grand chose.

----------


## Ruvon

> Par exemple,
> 
> "herboriste" à 1 permet de récolter une plante, 2 = 1 ou 2 plantes, 3 = 2 unités, 4 = 2 ou 3 plantes et 5 = 3 plantes
> "déplacement" modifie le nombre de cases par tour (pas encore défini, mais disons 2 sans membre (tu rampes...), +1 par unité)
> 
> Si tu n'as pas d'organe d'orientation (œil, écho...) tu vois à 1 case, si tu as 1 œil tu vois à 3 cases, 2 yeux tu vois à 10 cases, 5 yeux à 20 cases...
> 
> Enfin sur le papier, car en code j'en suis toujours à pas grand chose.


J'aime bien l'idée. Faire un choix entre différents builds, c'est plus couillu que simplement ajouter des +1 / +2 / +3... à des attributs ou des armes génériques.

Bon, le coup du "tu vois plus loin avec plus d'yeux" je suis pas convaincu ; que tu voies mieux, pourquoi pas, mais plus loin ? Ou alors des types d'yeux qui voient mieux Alain de loin que de près ou l'inverse. Mais c'est un détail.

----------


## SeanRon

> Quelques jours à faire mumuse avec le Godot Engine
> 
> http://jeux1d100.net/dradro/dramu_160915_01.jpg


la découverte ! je connaissait pas godot, et ça à l'air très sympa !
tu peux en dire plus sur tes impressions après quelques jours de tripotage ?

----------


## Tchey

Pour Godot, ça me parait bien, en tant qu'ignorant. La communauté est active, de plus en plus, et on trouve plusieurs tuto et ressources pour apprendre. La partie code est proche du Python, mais n'en est pas. La prochaine MàJ doit apporter le C++ mais moi je m'en fiche, je ne connais pas. J'ai pris Godot par défaut, sur Linux y'a peu de choix dans ce domaine, au départ je voulais du sans code genre Game Maker. Finalement le côté open source, gratuit, libre... fait que c'est aussi un choix "politique".




> Je suis retourné à l'étape brouillon pour la fabrication du PJ mutantatoire. Plus j'y pense et plus mon idée me parait foireuse dans son application gameplay.


Maintenant je penche vers ça :

----------


## Tchey

J'en suis là.

- Une "fausse" scène (le PJ et le PNJ ne se sont pas rencontrés en vrai, ils sont placés manuellement dans l'arène)
- Collaboration avec Uubu, le gribouilleur notamment de ça : http://forum.canardpc.com/threads/10...-D%C3%A9v-OTOT
- Deux bidules animés en boucle sur 4 frames
- Un bouton Attaque et un bouton Repos pour chaque (pas d'IA encore) pour un combat simple
- Le "gène" du joueur est là pour la déco, j'ai seulement placé les bouton dessus pour faire genre tu vois
- Utilisation de 4 attributs de manière classique et simplifiée, façon vie, mana, endurance et réserve.
- Un registre des événements
- ...

----------


## Ashley TOUCRU

> J'en suis là.
> 
> - Une "fausse" scène (le PJ et le PNJ ne se sont pas rencontrés en vrai, ils sont placés manuellement dans l'arène)
> - Collaboration avec Uubu, le gribouilleur notamment de ça : http://forum.canardpc.com/threads/10...-D%C3%A9v-OTOT
> - Deux bidules animés en boucle sur 4 frames
> - Un bouton Attaque et un bouton Repos pour chaque (pas d'IA encore) pour un combat simple
> - Le "gène" du joueur est là pour la déco, j'ai seulement placé les bouton dessus pour faire genre tu vois
> - Utilisation de 4 attributs de manière classique et simplifiée, façon vie, mana, endurance et réserve.
> - Un registre des événements
> ...


C'est super beau !  ::wub::  …mais j'ai rien compris.  ::unsure::

----------


## Tchey

J'ai bien avancé ces derniers jours, enfin, relativement à mon avancement global. Je suppose que tout est faisable en une petite journée pour qui sait faire. M'enfin, j'ai le sentiment de progresser, ça motive. J'avais plusieurs bugs et cassages de tête, essentiellement liés à ma (non) compréhension de la structure des fichiers. Par exemple, tout con, mais j'ai mis plusieurs heures réparties sur plusieurs jours parce j'y passe peu de temps, pour parvenir à afficher une fenêtre de messages événements. 

Maintenant quand je marche sur l'escargot (qui suit un chemin autours de la palissade), un message s'affiche. Ouééé.

J'ai aussi fait mes tous premiers trucs en pixels, pour faire une torche animée en 3 frames. Youhou.

Ceci sera l'une des toutes premières scènes du "protojeu" quand j'aurais compris comment faire des dialogues, quêtes, inventaires, interactions plus avancées que "toucher"... L'intrigue à venir est passionnante : le pauvre escargot est venu méditer, mais y'a des gens qui cassent la forêt alors que c'est pas bien.



Sur mon site en signature, je poste plus de trucs, mais y'a rien à voir vraiment.

----------


## Ruvon

> L'intrigue à venir est passionnante : le pauvre escargot est venu méditer, mais y'a des gens qui cassent la forêt alors que c'est pas bien.


Fait gaffe à pas te faire voler le scénario par Luc Besson ou Christopher Nolan, d'un synopsis d'une telle qualité ils t'en font un film de super-héros  ::trollface:: 

En plus je suppose qu'il est mutant l'escargot vu les capacités qu'il peut développer ?

----------


## Hyperpenguin

Et bah tu vois c'est super cool de lire ça et de te voir progresser après un début un peu dur pour toi ou tu te cherchais je crois. Ça fait plaisir, continue comme ça et amuses toi bien!  ::):

----------


## Nattefrost

Ca rend bien en effet ! 
A voir le screenshot y a un petit air d'unreal world dans la vue top-down  ::P: .

----------


## Tchey

Pas encore mort !

Après plus de deux mois de rien, retour à Python et au Terminal, avec le sentiment de m'être "perdu" dans Godot... Selon mon niveau de décrochage, je continue avec Python en Terminal, ou tkinter, ou Godot ou pas. Ma préférence va tout de même dans le brut de la première option...

Bref, j'ai (re)fait ça.

Refonte de la boutique, avec des sous catégories, et surtout un passage aux fichiers .json pour l'ensemble de "l'inventaire". Le bestiaire est dans la ligne de mire.


Réécriture de l'ensemble, pour afficher une lettre à taper au lieu du nom complet, ainsi que le prix et une description de l'objet. C'était fonctionnel avant la refonte (on pouvait choisir un sérum et l'injecter, pour simplement gagner/perdre de la santé), maintenant faut que je comprenne comment réparer la chose.


Changement dans l'arène, essentiellement pour une meilleure lecture, en vue d'une prochaine étape à venir : combat "dynamique" au tour par tour.


J'ai aussi fait qu'en martelant la touche entrée prenne l'option la plus évidente, ou que l'on revienne à "avant" jusqu'à sortir du programme complètement, ce qui accélère bien les choses pour tester.

----------


## Kupris

Un jeu parfait pour le taf  :^_^:

----------


## Patate

Cool ça avance ! Tu as déjà réfléchi au système de sauvegarde? Perso sur mon rogue like je m'y suis intéressé un peu tard et ca demande un gros taff une fois que tu as un projet déjà bien avancé.

Tu as une petite demo ?

----------


## Tchey

Je n'ai absolument aucune notion de comment faire un système de sauvegarde.

Pas de "démo" non, mais de temps en temps je colle le truc sur Github pour sauver en ligne. Ça change très rapidement, dès que j'ai trois lignes qui fonctionnent je les casse en faisant autre chose, haha... 

Si vraiment vous avez 5 minutes à perdre : http://github.com/Jeux1d100/DraMu_Py3

Je présume que mes +/- 700 lignes sont faisables par n'importe qui ayant une connaissance moyenne de Python en une demie journée... moi il m'a fallu quelques heures à l'instant pour trouver comment faire ça : afficher chaque objet du .json, avec un index pour que le joueur tape par exemple "sv" pour choisir le sérum Vivik, puis afficher un retour qui valide l'action du joueur, avec le nom complet de l'objet, son prix, et les couleurs en place.


Maintenant à l'achat d'un sérum, le joueur à un +1 sérum, mais pas vraiment d'inventaire, juste un compteur, et tous les sérums tombent dans le même lot, donc y'a encore une certaine marge de progression ici aussi...

----------


## Joq le pecheur

Ça progresse bien !

Je connais très peu le python, mais je pense que pour la sauvegarde le principe n'est pas trop complexe mais le taf pour l'implanter l'est  ::): 

J'ai vu quelque part que tu utilisais du JSON read quelque part, pour sauvegarder je pense que tu peux faire l'inverse dans un fichier prévu à cet effet.
Si tu veux pas trop te prendre la tête tu stockes séparément chaque attribut du perso (sauvegarde auto à la fin d'une étape par exemple).
Tu permets au joueur de faire LOAD au début au lieu de START, avec un ptit booléen is_loading?
IF is_loading? == TRUE 
THEN JSON read après l'initialisation de l'objet avatar pour écraser ses stats par celles qui sont enregistrées.

Pour qu'une sauvegarde soit pertinente il faut introduire une notion de progression, une variable ou tu stockes le nombre d'étapes elle aussi sauvegardée.
Cette variable peut ensuite t'aider à faire une difficulté progressive, en élargissant le random range quand tu pioches dans le bestiaire (ou en forçant un reroll si l'adversaire a un niveau de difficulté trop élevé par rapport au nombre d'étapes)  etc.

----------


## Patate

Je vais tester ça ! Joq le pecheur à raison et avant d'avoir trop de données à gérer en sauvegarde, te pencher sur le système peut-être intéressant. Le JSON peut faire l'affaire carrément.

----------


## Tchey

Je ne pense pas que ce soit pertinent de me pencher sur les sauvegardes maintenant. Il y a moins de 5 minutes de "gameplay", incluant le temps de télécharger, répondre à un texto, installer le jeu et faire une ou deux boucles. M'enfin, le peux passer du temps dessus pour comprendre les principes de la chose, mais il y a tellement d'autres choses que j'ignore...

Avant, je pense que je dois corriger/intégrer l'inventaire, et intégrer une forme de progression basique, afin d'avoir un "jeu" jouable dans son ensemble, bien que simpliste.

Je minimise tout, car vraiment, pour le moment il n'y a rien de spécial, et en même temps j'ai bien conscience que mon rien vaut des dizaines d'heures d'apprentissage. C'est donc un rien comparé à mon plan de domination du multivers, tout en étant intergénérationnel du point de vue d'une mouche domestique.

Par exemple je me pose la question, quelle différence fondamentale entre ces deux fichiers "shop_serum.txt" ? J'utilise pour le moment le premier. Aussi, je ne sais pas si je peux avoir toute la boutique dans un seul json (et comment), ou s'il faut un par catégorie (sérums, armes...). Et du coup, en pensant à l'inventaire, je me dis qu'il doit être possible d'avoir un seul fichier avec un tag "inshop" et un tag "inbag", non ? 



```
{
"sv": ["Vivik", 25, "La vie, c'est beau. Parfois."],
"sm": ["Mortak", 10, "La douleur engendre la résilience. Ou la folie."],
"sa": ["Aleak", 15, "Une existence sans surprise est une existence sans saveur. Dit-on."]
}
```


Mais là par exemple, pour une potion de soin, comment remplacer "effect : ???," par un truc du genre : "ego.health  += random.randint(8,12)," , sachant que c'est un fichier json en .txt ?



```
{
    "serum_mortak" : {
        "id" : sm,
        "name" : "Mortak",
        "effect" : ???,
        "price" : 10,
        "description" : "La douleur engendre la résilience. Ou la folie."
    }

    "serum_vivik" : {
        "id" : sv
        "name" : "Vivik",
        "effect" : ???,
        "price" : 25,
        "description" : "La vie, c'est beau. Parfois."
    }

    "serum_aleak" : {
        "id" : sa
        "name" : "Aleak",
        "effect" : ???,
        "price" : 15,
        "description" : "Une existence sans surprise est une existence sans saveur. Dit-on."
    }
}
```

Etc...

----------


## Patate

Il faut plus stocker les min et le max de ta potion. Ensuite tu les utilises avec ta ligne : ego.health += random.randint(min, max) ?

----------


## Nattefrost

> Par exemple je me pose la question, quelle différence fondamentale entre ces deux fichiers "shop_serum.txt" ? J'utilise pour le moment le premier. Aussi, je ne sais pas si je peux avoir toute la boutique dans un seul json (et comment), ou s'il faut un par catégorie (sérums, armes...). Et du coup, en pensant à l'inventaire, je me dis qu'il doit être possible d'avoir un seul fichier avec un tag "inshop" et un tag "inbag", non ?


Pour les json, tu peux tout mettre dans un seul en rajoutant un niveau de profondeur par catégorie (dis moi si t'as besoin de  détails, pas le temps là  ::P: ) mais c'est pas forcément recommandé, perso j'utiliserai plusieurs fichiers.

----------


## Patate

Le problème de gérer plusieurs fichier c'est que ça impose une gestion d'écriture / suppression à chaque action (à moins que ses données soit chargées en mémoire au départ). Tu prends dans le sac, il faut supprimer la ligne dans le fichier inshop, l'ajouter dans le inbag, etc.

----------


## Nattefrost

Pour un truc comme ça j'utiliserai sqlite mais ça ferait un truc à apprendre en plus pour Tchey.
Mais ouais de toutes façons que ce soit du json sur le filesystem (dans un ou plusieurs fichiers) ou du sqlite t'es voué à faire pas mal d'ajouts / suppressions.

----------


## Joq le pecheur

> Je n'ai absolument aucune notion de comment faire un système de sauvegarde.


Je pensais que c'était un appel au secours  :;): 
C'est vrai qu'en plus si c'est des parties qui durent 10 minutes ça sert à rien ^^. 

J'ai eu la même expérience que Patate, j'ai galéré a mettre en place un système de sauvegarde dans un projet en le faisant tard, alors maintenant je fais du zèle.

----------


## Tchey

Faudra que je m'y mette dans tous les cas, un jour.

Pour le moment avec DraMu j'essaie des trucs (par exemple les potions), mais ensuite je vire pour m'approcher de mon idée initiale (l'ego assimile son environnement (dont les adversaires) pour régénérer et muter).
Idem pour les armes, en principe l'ego utilise les capacités de son corps, au moins dans une première phase.
Idem pour la santé, je veux un système sans "+6 points de vie", et avec des effets à la place : sonné, ralenti, amputé, empalé...
...

Dès que j'ai un semblant d'inventaire (pas du tout progressé là dedans), je vais voir pour les sauveries, je suis curieux.

Prochaine étape cependant, comprendre pourquoi dans la boutique c'est toujours Vivik qui est acheté quelque soit l'option entrée par le joueur... 

http://github.com/Jeux1d100/DraMu_Py3



```
option = input(Colour.DARKCYAN + "   Votre choix -> " + Colour.END)
    if option == "":
        go_shop()
    elif option in shop_serum:
        if ego.jeto >= shop_serum[option][1]:
            ego.jeto -= shop_serum[option][1]
            print ("      Vous achetez l'objet " + Colour.GREEN + "{} ".format(description[0]) + Colour.END + "pour " + Colour.RED + "{} jetons".format(description[1]) + Colour.END + ".")
            ego.serum += 1
            ego.inventory[option] = 1
            option = input(Colour.DARKCYAN + "   Touche Entrée pour continuer..." + Colour.END)
            go_shop()
```

----------


## Hideo

> ```
> 
>         if ego.jeto >= shop_serum[option][1]:
>             ego.jeto -= shop_serum[option][1]
> ```


La comme ça ton problème pourrait peut être venir de l'index mis en dur (1), c'est souvent le cas avec le genre de problème que tu décris.

----------


## aggelon

Tant que tu n'es pas trop avancé, pense à regarder pour supporter le multi-langue : c'est simple, rapide et mieux vaut te faire la main maintenant, ainsi ce sera plus facile et réutilisable pour tes autres projets.

Par exemple, une manière facile :
- tu crées un fichier appelé langues.xml ou json ou ce que tu veux, et dedans tu mets toutes les langues supportées avec leur description et 'radical'. Exemple Français et FRENCH, English ENGLISH, etc...
- ensuite tu crées un fichier lang_FRENCH.xml (ou json ou autre...) qui contient tout ce qui doit être à l'écran avec son 'ITEM' et sa traduction. Exemple MAIN_MENU et Menu principal, JAMBE Jambe, etc...
- tu te fais vite fait un menu pour choisir la langue : ce menu se contente d'afficher la liste des descriptions du fichier langues.xml, sauvegarde dans une variable le radical correspondant à celle choisie par l'utilisateur et charge en mémoire (dans un tableau par exemple) le fichier lang_[le radical choisi].xml
- enfin, dans tes autres fichiers de jeu, au lieu d'afficher 'Jambe', tu affiches lang['JAMBE'], etc...

Ainsi, pour mettre ton jeu à disposition en anglais, la seule chose à faire et de traduire le fichier lang_FRENCH en créant le fichier lang_ENGLISH : il contiendra le couple JAMBE Leg, etc...
Si tu fais un fichier lang_SPANISH, il contiendra JAMBE Pierna, etc...

Tu as besoin de parler de bras dans ton jeu, hop tu ajoutes BRAS Bras dans lang_FRENCH et le tour est joué...

Demain, tu as un fan qui veut traduire le jeu en allemand, il le fait dans son coin, autonome, et peut te l'envoyer pour que tu l'intègres dans le jeu à distribuer par exemple...
Pour plus de simplicité, je conseille d'utiliser tout des noms d'items en anglais afin que tous puissent les comprendre et les traduire dans leur langue... ainsi ton fichier lang_FRENCH ressemblerait plutot à LEG Jambe, ARM Bras  :;): 


Je ne sais pas si, expliqué comme cela, ça peut paraitre compliqué, mais en réalité c'est vraiment très simple et une fois ce mécanisme acquis et mis en place dès le départ de tes projets, tu auras très rapidement et facilement des projets multilangues...

Transformer un projet monolangue 'fini' en un multilangue, c'est vraiment la galère, car en plus de la traduction tu dois repasser partout dans le code pour remplacer ce qui est en dur (les descriptions, le menu, etc...) par des indirections (lang['MAIN MENU'], lang['SHIELD_DESCRIPTION'])...

----------


## Tchey

Ah oui la traduction... Diantre... Merci du conseil.

Toujours rien glandé côté inventaire.

J'ai avancé cependant un peu en intégrant mon idée de Nerf/Fluide/Chimie/Gaz que j'expose quelque part plus haut je crois, adaptée et simplifiée pour le moment, et ajouté au combat la notion de "offense vs défense" et "dégâts vs résistance".

Par exemple
ego_off =  (ego.nerf *3 + ego.fluide *2 + ego.chimie + ego.gaz) + (random.choice(ego_alea)) # Offense

Tout est sur le modèle a*3 + b*2 + c + d + alea. Les abcd changent selon les situations. Par exemple
ego_res = (ego.gaz *3 + ego.chimie * 2 + ego.nerf + ego.fluide) + (random.choice(ego_alea)) # Résistance

Alea c'est en gros 1d8.
Le matorg, c'est un peu un équivalent des points de vie.

Prochainement ça devrait donner quelque chose comme ça :
Chacune des 4 humeurs est notée de 0 à 4. L'ego commence à 1 partout, il peut perdre de l'humeur et tomber à 0.
Tant qu'il a du matorg en réserve, il survie. S'il est à 0 en humeur et que son matorg tombe aussi à 0, c'est (presque) Game Over.
Presque, car si l'ego est populaire et qu'il a des abonnés, il a une chance de bénéficier d'un sacrifice et de regagner quelques matorg.
Si humeur, et matorg, et abonnés, sont tous à zéro, là c'est la fin de la fin.

Le "truc" est que pour passer par exemple à Fluide 2, il faut consommer beaucoup de matorg. Donc faut être en bonne santé, ensuite on évolue puis on est faible pendant un moment, le temps d'assimiler plus de matorg. Dans la même idée je veux que toute ressource serve au moins deux propos.

Je veux aussi retirer le combat contre un adversaire aléatoire, pour qu'un choix de 3 (?) adversaires soit proposé à la place. Comme ça si on est faible on se tape du Muscae ou Rodentia, et si on est en forme on peut se cogner un BiOurs ou un même un Proboscidea sur un coup de folie.

D'ailleurs je vois un bug ici, je n'ai par pris en compte les changements pour l'affichage du résultat, l'ego a 100/100 au lieu de 42 (50 de base (100 max), -9 du combat, +1 d'assimilation), et le lapin est en négatif...



Et après quelques tours rapides pour tester, bah v'là aut'chose...




> RecursionError: maximum recursion depth exceeded


J'ai lu la doc et quelques pages sur internet, mais je ne comprends toujours pas le c'est quoi donc.

----------


## Hideo

Avec juste le code d'erreur je dirais que dans ton code tu dois avoir au moins une fonction qui s’appellent elle même (ça s'appel la récursion) créant alors à chaque nouvel appel une "couche" (c'est le principe de la stack ou pile). Si la boucle que cela crée est trop profonde (trop de couches) tu as ce genre d'erreur. 

Ch'ais pas si je suis très clair.

----------


## Tchey

Plus ou moins. Je ne comprends pas vraiment comment éviter le phénomène. Je pense que ça vient de ma boucle de combat. Pour le moment j'ai triché en mettant sys.setrecursionlimit(5000) en début de code...

J'ai ça maintenant, trois options de combat, accessible à chaque "tour" (l'ego attaque toujours le premier, puis l'adversaire, puis boucle).
J'ai aussi fusionné des écrans pour avoir plus d'info pertinentes en même temps et éviter les redondances.



Les nombres entre parenthèses sont : offense vs défense, dégâts vs résistance. Si c'est négatif, ça compte comme zéro. On peut réussir une attaque, mais n'infliger ensuite aucun dégât. Plus tard, je veux mettre des effets en plus (ou a la place) des dégâts, Par exemple possibilité d'empoisonner si on réussi l'attaque, on peut alors faire zéro dégât au tour 1, mais appliquer le poison. Puis la cible encaisse aux tours suivants même si on rate l'attaque.

M'enfin, je n'en suis pas là... Pour le moment mon code est un peu en bordel, avec du if/else a gogo, ça va rapidement limiter les choses je pense. Ça fait ça, copié/collé/changé selon les différentes attaques.



```
def ego_attack_quick(): # +off (*3 *3 *3 *2), -dmg (*2 *1 *1 *1)
    ego_alea = (1, 4, 9)
    challenger_alea = (2, 5, 10)
    ego_off =  (ego.nerf *3 + ego.fluide *3 + ego.chimie *3 + ego.gaz *2) + (random.choice(ego_alea)) # Offense
    challenger_off = (challenger.nerf *3 + challenger.fluide *2 + challenger.chimie + challenger.gaz) + (random.choice(challenger_alea))
    ego_def = (ego.chimie *3 + ego.gaz * 2 + ego.nerf + ego.fluide) + (random.choice(ego_alea)) # Défense
    challenger_def = (challenger.chimie *3 + challenger.gaz *2 + challenger.nerf + challenger.fluide) + (random.choice(challenger_alea))
    ego_dmg =  (ego.fluide *2 + ego.chimie *1 + ego.nerf + ego.gaz) + (random.choice(ego_alea)) # Dommages
    challenger_dmg = (challenger.fluide *3 + challenger.chimie *2 + challenger.nerf + challenger.gaz) + (random.choice(challenger_alea))
    ego_res = (ego.gaz *3 + ego.chimie * 2 + ego.nerf + ego.fluide) + (random.choice(ego_alea)) # Résistance
    challenger_res = (challenger.gaz *3 + challenger.chimie * 2 + challenger.nerf + challenger.fluide) + (random.choice(challenger_alea))

    # L'ego attaque toujours en premier. Si ego_offense >= challenger_def, alors l'ego réussi son attaque. Autrement, l'adversaire attaque.
    # Si ego_dmg >= challenger_res, alors l'ego blesse l'adversaire. Ensuite c'est au tour de l'adversaire, et boucle jusqu'à élimination d'un protagoniste.

    print ("")
    if ego_off >= challenger_def:
        if (ego_dmg - challenger_res) < 1:
            challenger.matorg -= 0
            print ("      Vous frappez trop rapidement et n'infligez " + Colour.PURPLE + "aucun dégât " + Colour.END + "({} vs {}, {} vs {}) !".format(ego_off, challenger_def, ego_dmg, challenger_res))
        else:
            challenger.matorg -= (ego_dmg - challenger_res)
            print ("      Vous frappez vivement l'adversaire et lui infligez " + Colour.GREEN + "{} dégâts ".format(ego_dmg - challenger_res) + Colour.END + "({} vs {}, {} vs {}).".format(ego_off, challenger_def, ego_dmg, challenger_res))
        if challenger.matorg < 1:
            challenger.matorg == 0
            option = input(Colour.DARKCYAN + "   Touche Entrée pour le tour suivant -> " + Colour.END).lower()
            win()
        else :
            adv_attack()
    else:
        print ("      Votre empressement vous fait " + Colour.PURPLE + "rater " + Colour.END + "votre cible ({} vs {}) !".format(ego_off, challenger_def))
        adv_attack()
```

----------


## Tchey

Cette nuit je me suis cogné la tête dans un convecteur temporel, et j'ai gribouillé un mot : fatigue.
Puis dans la journée, j'ai ajouté l'idée d'endurance ou énergie ou fatigue, que je nomme fougue.
Ne s'applique encore qu'à l'ego, pas encore à l'alter, qui lui ne dispose que d'une attaque automatique à chaque tour de combat.

Un tour de combat pour le moment, c'est simplement : action de l'ego (à choisir dans la liste), résolution, action le l'alter (unique et invariable), résolution, boucle.

L'ego regagne de la fougue en début de chaque tour (peu), ou en "passant le tour".

----------


## aggelon

Je vois que dans ton attaque tu as plusieurs fois adv_attack (en fonction des différentes 'fins' de l'attaque en cours j'imagine), j'en suppose donc que de la même manière tu as dû écrire un truc du genre ego_attack() à la fin/aux fins de ton adv_attack ?

Ce qui te donnes un truc du genre:
ego_attack
-> adv_attack
--> ego_attack
----> adv_attack
------> ego_attack
etc...

Ce qui voudrait dire que tu 'empiles' les appelles de fonction, il ne s'agit pas ici d'une boucle.

Une boucle serait quelque chose du genre :

:debut_de_tour
ego_attack
si quelqu'un est mort, alors aller à fin_de_combat, sinon continuer avec les actions ci-dessous
adv_attack
si personne n'est mort aller à debut_de_tour, sinon aller à fin_de_combat

:fin_du_combat

Ce qui donne:
ego_attack
adv_attack
ego_attack
adv_attack
etc...

La différence, c'est que les fonctions ne s'appellent pas l'une l'autre, il n'y a pas d'empilage, adv_attack ne commence que lorsque ego_attack est fini, tandis que dans le premier 'code' adv_attack se trouve être la dernière 'action' A L'INTERIEUR de ego_attack (et reciproquement) : tu empiles les actions mais sans jamais finir aucune fonction...

Enfin... c'est si j'ai bien compris comment tu codes... disons que ça pourrait être une piste  :;):

----------


## Tchey

Merci,

J'ai changé depuis, maintenant ça fait



```
go_arena() avec le choix des options, présentation des combattants...

do_combat_selonlechoix_()
        si les deux sont vivants, alter_attack()

alter_attack()
        si les deux sont vivants, go_arena()

go_arena()

do_combat_selonlechoix_()
        si les deux sont vivants, alter_attack()

alter_attack()
        si les deux sont vivants, go_arena()
```

boucle là dessus jusqu'à une défaite go_lose() ou alter go_win()
Alors ça revient au même si j'ai compris, parce que mon alter_attack appelle arena ? Je pensais que non.
Du coup, comment on peut "finir" proprement, je ne comprends pas ça.

Ou alors c'est bon ? Je n'ai pas de RecursionError ou alors je ne teste pas assez longtemps.

----------


## aggelon

En gros il faut une seule boucle principale, genre

arena()
 [
 ici se déroule le combat (actions), tant qu'il n'y a pas un mort
 ]

tes actions pourraient du genre:
alter_attack et ego_attack

pour éviter d'empiler les appels de fonctions, il est important que ces deux actions (alter_attack et ego_attack) se finissent à chaque fois.
sans rien faire d'autre. (sinon elles ne sont pas finies  ::P: )

c'est arena qui se charge de faire la boucle, de 'distribuer les rôles' c'est à dire "c'est au tour de qui de jouer"...

Imagine une partie de belote ou de jeu de plateau : chaque joueur joue sa carte, ou fait ce qu'il a à faire, puis il a fini son tour. Indépendamment de cela, c'est 'la règle du jeu'/le MJ qui dit c'est au tour de qui de jouer...
Si l'on compare avec une séance de questions réponses, c'est comme le conférencier qui tend le micro à quelqu'un, lui laisse poser sa question, puis reprend le micro quand la personne à fini de parler... ensuite le conférencier tend le micro à quelqu'un d'autre, etc... jusqu'à ce qu'il constate que plus personne n'a de question à poser (= qu'il n'y ait plus d'adversaire dans le combat du jeu)
Si les gens se passaient directement le micro de l'un à l'autre, alors à la fin il faudrait que le micro refasse tout le chemin inverse et revienne jusqu'au conférencier pour qu'il puisse répondre d'un seul coup à toutes les questions qui ont été empilées et enfin qu'il cloture la conférence...

Il faut garder à l'esprit que chaque appel de fonction, c'est comme une parenthèse que tu ouvres... à un moment donné, il va falloir la refermer puis poursuivre avec le code qui suit juste après l'endroit où tu avais appelé ta fonction...

----------


## Nattefrost

> *Il faut garder à l'esprit que chaque appel de fonction, c'est comme une parenthèse que tu ouvres*... à un moment donné, il va falloir la refermer puis poursuivre avec le code qui suit juste après l'endroit où tu avais appelé ta fonction...


(amateur-de? (lisp) )

----------


## aggelon

meme pas  ::P:

----------


## Tchey

J'ai récris une grosse partie de ce que j'avais, tranché dans le tas, trié, corrigé, reformulé...
J'ai laissé le json de côté pour le moment, et je n'ai toujours pas touché au système de sauvegarde, mais globalement, c'est "mieux".
Le support papier m'a plus été utile que la programmation, pour mieux poser mes idées et voir ce que je peux faire concrètement avec mes connaissances.


Je suis maintenant sur l'aspect exploration, qui sera dans un premier temps basée sur une simple grille avec des liens cardinaux. Je ne veux pas du procédurale aléatoire infini, mais j'aimerais avoir certains points avec des variantes (du style, rencontrer un chien malade, un chien fort, un chien mort...).

----------


## Patate

Cool ca progresse ! En tout cas c'est propre  ::):

----------


## Tchey

J'ai ça :

+ Une "carte" de 3x3 lieux (pas aléatoire), que l'on visite en choisissant la direction cardinale.
- mais qui ne garde aucune mémoire des actes du perso. Chaque lieu est un pavé copié/collé qui ressemble à (plusieurs éléments sont seulement pour tester, ou des aides visuelles pour débug) :



```
def in_d10():
    while True:
        clean()
        d10.connect(rien, e10, d11, rien)
        print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print ("                                                                           ")
        print ("      Vous êtes dans une forêt à flanc de montagne.")
        print ("                                                                           ")
        print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print ("                                                                           ")
        print (Colour.CYAN + "   Rencontres : " + Colour.END)
        print ("      !!!")
        alea_fauna()
        print ("      !!!")
        print ("                                                                           ")
        print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print ("                                                                           ")
        print (Colour.CYAN + "   Spécificités du lieu : " + Colour.END)
        print ("      ")
        print ("      ")
        print ("                                                                           ")
        print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print ("                                                                           ")
        print (Colour.CYAN + "   Actions possibles : " + Colour.END)
        print ("      i - consulter l'inventaire")
        print ("      f - catalogue de la faune")
        print ("      p - catalogue de la flore")
        print ("                                                                           ")
        print (Colour.CYAN + "   Voyager : " + Colour.END)
        print ("      n - Au nord : {} ".format(d10.nord.name) + Colour.LPURPLE + "{}".format(d10.nord.desc) + Colour.END)
        print ("      s - Au sud : {} ".format(d10.sud.name) + Colour.LPURPLE + "{}".format(d10.sud.desc) + Colour.END)
        print ("      e - À l'est : {} ".format(d10.est.name) + Colour.LPURPLE + "{}".format(d10.est.desc) + Colour.END)
        print ("      o - À l'ouest : {} ".format(d10.ouest.name) + Colour.LPURPLE + "{}".format(d10.ouest.desc) + Colour.END)
        print ("                                                                           ")
        print (Colour.CYAN + "   Autres : " + Colour.END)
        print ("      ? - ouvrir une page d'aide ")
        print ("      q - quitter DraMu")
        print ("                                                                           ")
        print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print ("                                                                           ")
        print (Colour.DARKCYAN + "   Tapez la lettre correpondant à votre action, puis Entrée" + Colour.END)
        option = input(Colour.DARKCYAN + "   Votre choix -> " + Colour.END).lower()
        if option == "c":
            bad_input()
        elif option == "b":
            bad_input()
        elif option == "i":
            in_sac()
            clean()
            continue
        elif option == "f":
            in_fauna()
            clean()
            continue
        elif option == "p":
            in_flora()
            clean()
            continue
        elif option == "n":
            bad_input()
        elif option == "s":
            in_e10()
        elif option == "e":
            in_d11()
        elif option =="o":
            bad_input()
        elif option == "?":
            in_aide()
        elif option == "q": #arrêter le programme et sortir
            do_quit()
        else:
            bad_input()
```

+ Un système de sauvegarde et chargement basique, qui garde le nom et les attributs du perso
-  mais pour le moment pas le reste (rencontres passées, lieu...)

+ À chaque lieu, une rencontre aléatoire non interactive pour le moment (ça pioche dans le bestiaire selon un résultat de dès)
- mais chaque fois que le perso fait un truc, genre ouvrir l'inventaire, ça rafraichi le lieu et la rencontre avec.
Je ne sais pas trop comment faire pour avoir une rencontre "stable", qui reste au moins tant que le perso n'a pas changer de lieu.

+ Un lieu Village avec arène, et une arène avec des options de combat (coup précis, rapide, lourd...) qui modifient les dégâts et la fatigue
- mais chaque fois à la place de faire un tour de combat et de redonner le choix d'attaque au joueur, ça retourne au village, et pas dans l'arène.
Cette arène me bloque pour le moment... L'arène seule fonctionnait, mais une fois mise avec le village et les options en tour de combat, ça foire.



```

def in_arena():
    clean()
    alter = (random.choice(FAUNA))
    print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print (" ")
    print ("            {} (".format(ego.name) + Colour.GREEN + "{}".format(ego.matorg) + Colour.END + "|" + Colour.GREEN + "{}".format(ego.fougue) + Colour.END + ") vs   {} (".format(alter.name) + Colour.GREEN + "{}".format(alter.matorg) + Colour.END + ")")
    print (" ")
    print ("    {}".format(alter.desc))
    print (" ")
    print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print ("                                                                                  ")
    print ("      d - attaque directe    *   -5 fougue                                        ")
    print ("      r - attaque rapide     *   + toucher, -10 fougue                            ")
    print ("      l - attaque lourde     *   - toucher, ++ dégâts, -15 fougue                 ")
    print ("      p - attaque précise    *   +++ toucher, +++ dégâts, -25 fougue              ")
    print ("                                                                                  ")
    print ("      a - attendre           *   +10 fougue                                       ")
    print ("                                                                                  ")
    print ("      f - fuir et abandonner le combat                                            ")
    print ("                                                                                  ")
    print ("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print ("                                                                                  ")
    print (Colour.DARKCYAN + "   Touche Entrée pour une attaque directe" + Colour.END)
    option = input(Colour.DARKCYAN + "   Votre choix -> " + Colour.END).lower()
    # ego.dead = False
    # alter.dead = False
    if option == "":
        do_attack_directe()
    elif option =="d":
        do_attack_directe()
    else:
        bad_input()
    # elif option == "r":
    #     do_attack_rapide()
    # elif option == "l":
    #     do_attack_lourde()
    # elif option == "x":
    #     do_attack_precise()
    # elif option == "a":
    #     do_attack_wait()
    # elif option == "f":
    #     bad_input()

def do_attack_directe():
    if ego.matorg > 1:
        ego_attack_directe()
        alter_attack()
        ego.fougue += ego.regen
    else:
        lose()

def ego_attack_directe():
    cmbt_ftg = 5 # fatigue de combat, réduit la fougue
    ego_alea = (1, 4, 9) # pifomètre pour tester un peu d'aléatoire, en attendant de travailler à l'équilibre des atributs
    alter_alea = (2, 5, 10)

    ego_off =  (ego.nerf *3 + ego.fluide *2 + ego.chimie + ego.gaz) + (random.choice(ego_alea)) # Offense
    alter_off = (alter.nerf *3 + alter.fluide *2 + alter.chimie + alter.gaz) + (random.choice(alter_alea))

    ego_def = (ego.chimie *3 + ego.gaz * 2 + ego.nerf + ego.fluide) + (random.choice(ego_alea)) # Défense
    alter_def = (alter.chimie *3 + alter.gaz *2 + alter.nerf + alter.fluide) + (random.choice(alter_alea))

    ego_dmg =  (ego.fluide *3 + ego.chimie *2 + ego.nerf + ego.gaz) + (random.choice(ego_alea)) # Dommages
    alter_dmg = (alter.fluide *3 + alter.chimie *2 + alter.nerf + alter.gaz) + (random.choice(alter_alea))

    ego_res = (ego.gaz *3 + ego.chimie * 2 + ego.nerf + ego.fluide) + (random.choice(ego_alea)) # Résistance
    alter_res = (alter.gaz *3 + alter.chimie * 2 + alter.nerf + alter.fluide) + (random.choice(alter_alea))

    # L'ego attaque toujours en premier. Si ego_offense >= alter_def, alors l'ego réussi son attaque. Autrement, l'alter attaque.
    # Si ego_dmg >= alter_res, alors l'ego blesse l'alter. Ensuite c'est au tour de l'alter

    print ("")
    ego.fougue -= cmbt_ftg
    print (ego.fougue)
    if ego.fougue > 1:
        if ego_off >= alter_def:
            if (ego_dmg - alter_res) < 1:
                alter.matorg -= 0
                print ("      Vous touchez et n'infligez " + Colour.PURPLE + "aucun dégâts " + Colour.END + "({} vs {}, {} vs {}) !".format(ego_off, alter_def, ego_dmg, alter_res))
            else:
                alter.matorg -= (ego_dmg - alter_res)
                print ("      Vous touchez et infligez " + Colour.GREEN + "{} dégâts ".format(ego_dmg - alter_res) + Colour.END + "à l'alter ({} vs {}, {} vs {}).".format(ego_off, alter_def, ego_dmg, alter_res))
        else:
            print ("      Vous " + Colour.PURPLE + "ratez " + Colour.END + "votre coup ({} vs {}) !".format(ego_off, alter_def))
    else :
        print ("      Trop fatigué")
    pause(1)
```

----------


## aggelon

Alors (tu me dis si je comprends mal ton code), mais voici comment je te lis :

tu commences l'arène, tu fais des initialisations, tu demandes au joueur quelle type d'attaque il veut faire
--> on entre dans do_attack_directe (car c'est le seul choix qui marche pour l'instant), là tu regardes si le joueur peut attaquer ou s'il est trop fatigué (ego.matorg > 1). S'il peut attaquer, tu vas démarrer une attaque du joueur, puis une riposte de l'alter
----> on entre dans ego_attack_directe, le joueur attaque
----> ego_attack_directe se finit
--> la fonction ego_attack_directe étant finie, on revient à l'endroit où on l'avait appelée, on revient donc dans do_attack_directe et on démarre alter_attack
----> (j'imagine qu'il y a un code équivalent pour l'alter ensuite)
----> (puis l'alter se finit)
--> la fonction alter_attack étant finie, on revient à l'endroit où on l'avait appelée, on revient donc dans do_attack_directe et on fait ego.fougue += ego.regen
--> le if ego.matorg > 1 est fini
le combat s'arrete, on est à la fin de in_arena, on quitte in_arena, on revient là où on avait appelé in_arena : c'est sans doute le village...

J'ai bon ?

J'imagine qu'en fait tu voudrais non pas un
if ego.matorg > 1
alors une attaque+rispote
sinon perdu

mais plutôt un
tant que ego.matorg > 1
alors une attaque+rispote

ce qui te ferait une boucle de plusieurs attaque+rispote successives ?  ::): 

à la sortie du tant que, un message de fin de combat.
Le combat étant terminé, alors seulement là on quitte l'arene

En même temps, il faudrait aussi revoir la condition de sortie du tant que : ego.matorg>1 (=lose) n'est peut-être pas la seule façon de finir le combat... il peut y avoir une victoire, non ?
Nulle part dans ton extrait de code je ne vois un appel à une fonction win()...

En espérant t'avoir aidé  ::):

----------


## Tchey

Merci,

Oui/Non ! C'est presque ça mais j'ai trouvé tout seul, na.

Par exemple, j'appelais l'alter (ennemi) "dans" l'arène, du coup chaque fois que l'arène rafraichie, l'alter change, pas bon (pendant le combat si la vie/fatigue changeait, l'alter changeait aussi...). Maintenant, l'alter est défini "pendant le trajet" dans l'arène, ce qui fait que l'alter reste le même jusqu'à la mort, ou que le joueur sorte et retourne dans l'arène.

Ensuite en effet j'avais une fonction pour la victoire, mais pas intégrée... J'ai refait la boucle entièrement. Ce que je veux, c'est des tours de combat. Un tour, un coup de l'ego, suivi d'un coup de l'alter. Ensuite, le joueur peut choisir un autre coup (fort, précis, rapide... qui consomment de la fougue différemment) ou se reposer (il prend un coup mais il regagne beaucoup de fougue). Maintenant j'ai ça qui fonctionne, mais j'ai cassé l'affichage des infos du combat. Et puis je me suis coincé dans l'arène, après une victoire ou un défaite ça enchaine directement sur un combat, impossible de sortir... m'enfin, je vais trouver je pense.

----------


## aggelon

C'est chouette ! C'est toujours gratifiant je trouve de réussir à débusquer ses propres erreurs, à comprendre par soi-même ce qu'on n'a pas bien fait et surtout de s'en sortir  ::):

----------


## Tchey

Yop

Outre un travail sur l'interface, une pseudo carte de 3x3 cases est en place, avec une case pour chaque lieu remarquable (forêt, collines, village, antre...). Dans chaque lieu, des actions spéciales sont (ou seront...) possibles. Par exemple, dans l'antre, la "maison" du joueur, l'Ego peut muter.

J'ai posé les premières briques du système de mutation, pour le moment basé sur les 4 "humeurs". Plus tard ce sera basé sur des membres, organes, etc.

L'Ego peut donc évoluer, en consommant sa matorg (matière organique). Il peut rater le processus, ce qui déclenche une dévolution (perte au lieu de gain).
Plus l'Ego est évolué, plus le risque d'échec est important. Par la suite, il y aura des moyens d'évoluer sans risque... sauf à obtenir ces moyens...

La ligne "Temps..." ne sert à rien pour le moment, sinon à me rappeler que je veux faire un système de temps qui passe...

----------


## Grhyll

Ca pose une ambiance sympa, tout ça  ::):

----------


## Hideo

C'est sympas de voir que tu ne t'es pas démotivé, ça à l'air de partir dans le bonne direction c'est cool  :;):

----------


## Tchey

Je n'ai vraiment pas le temps de me consacrer à cet apprentissage, ou plutôt, j'utilise mon temps autrement que pour ça, du coup j'ai un peu avancé mais de manière quasi insignifiante.

Revoyant toutes les ambitions à la baisse, je suis parti sur tout autre chose, plusieurs fois.

Dernièrement les résultats les plus concrets ont été réalisé sur RPG in a Box (sujet de présentation ici : http://forum.canardpc.com/threads/11...-programmation ).

Ça donne un truc comme ça :

----------

