[I7] Système de combat

Pour discuter des langages que nous utilisons pour réaliser nos jeux : problèmes, solutions, suggestions...

Modérateurs: Stormi, Otto Grimwald

[I7] Système de combat

Messagepar BadChevreuil le Jeu Oct 03, 2013 6:18 pm

Bonjour !

Je viens vous demander de l'aide concernant un système de combat que j'essaie de mettre en place. Il n'est pas vraiment inséré dans une fiction mais c'est plutôt une saynette que je trouvais intéressante à travailler.

Alors voilà, je suis parti du Lanista 2 trouvé dans la documentation d'Inform 7 que j'ai un peu modifié, retravaillé. J'ai ajouté des répliques qui aparaissent lorsque vos points de vie sont bas, tout traduit en français, et ajouté une valeur "minimum damage" aux armes qui permet donc de faire des armes plus précises (dont les dégats ne sont pas compris entre 1 et y, mais bien entre x et y).

J'ai donc voulu créer 3 classes: une classe qui tape de manière très imprécise, mais à tous les tours. Une autre qui tape fort, mais seulement un tour sur deux. Enfin, une classe qui tape peu, mais deux fois par tour.
Seulement voilà, je n'arrive pas à créer de règles qui régissent le fait que je ne pourrai taper qu'une fois sur deux, ou deux fois par tour. J'imagine qu'il faudrait créer un adjectif comme arme "lourde" ou "légère" puis ensuite leur ajouter une règle... mais je sèche.

Si quelqu'un voulait m'aider, ce serait fort gentil de sa part.
Merci d'avance !
BadChevreuil
Sorcier du culte
 
Messages: 4
Inscription: Dim Sep 08, 2013 9:34 pm

Re: [I7] Système de combat

Messagepar Otto Grimwald le Dim Oct 06, 2013 4:15 pm

Salut BadChevreuil,

Au niveau des systèmes de combat, j'imagine que chaque auteur va vouloir le faire à sa manière. Il existe néanmoins un très bon système, nommé "ATTACK" :
http://inform7.com/news/2010/09/28/atta ... extension/

Il a selon moi le grand avantage de rendre les combats intéressant, en introduisant une sorte de concentration qui permet au joueur de frapper mieux, mais au prix d'une concentration qui peut se briser par un coup ennemi, ce qui fait tout perdre en ce cas.

Cet excellent jeu l'utilise, traduit en français :
http://www.o0o0.fr/jeux/pirates-des-cha ... index.html

Pour ma part le sujet de création de règles de jdr m'intéresse également, ce que j'ai débuté ici : https://bitbucket.org/farvardin/escapades-jdr

Une extension pour I7 est en cours de réalisation, mais ça n'avance pas vite :
https://bitbucket.org/farvardin/la_vall ... rieuse/src (voir dossier extensions, "Escapades.i7x")

J'utilise un système assez simple, par exemple si on considère qu'une arme rapide fait plusieurs faibles dégâts dans 1 tour, alors qu'une arme plus lourde fera 1 gros dégât dans plusieurs tours, on peut aussi imaginer qu'en moyenne, les deux armes feront des dégâts équivalents, même si en réalité on a un peu plus de chances de toucher et de faire des dégâts avec l'armes rapide. Du coup je ne donne qu'une valeur moyenne de combat (facilité d'utilisation) et de dégâts.

Quoi qu'il en soit, pour ton problème, tu peux peut-être le résoudre ainsi :

Si on appelle ces 3 classes d'armes : arme légère, arme normale et arme lourde, tu peux donner une valeur de dégât par tour (ici on va dire que c'est tout le temps 2, pour simplifier mais il est possible de définir une valeur aléatoire ici aussi), pour l'arme normale, ça tapera tout le temps, par exemple :

Code: Tout sélectionner
Combat is a recurring scene.

Every turn when the combat is happening and the player is carrying arme normale:
  let the attack_of_player be the roll of the attack of the player;
  if attack_of_player is less than capacite_defence_adversaire
    begin;
      now the point_de_vie of the adversaire is  point_de_vie of the adversaire - 2;
      etc.


pour l'arme légère tu peux faire ça à la place :


Code: Tout sélectionner
Combat is a recurring scene.

Every turn when the combat is happening and the player is carrying arme legere:
  let the attack_of_player be the roll of the attack of the player;
  if attack_of_player is less than capacite_defence_adversaire
    begin;
      now the point_de_vie of the adversaire is  point_de_vie of the adversaire - 1;
      etc.
[et on refait le code ici encore]
  let the attack_of_player be the roll of the attack of the player;
  if attack_of_player is less than capacite_defence_adversaire
    begin;
      now the point_de_vie of the adversaire is  point_de_vie of the adversaire - 1;
      etc.


Et pour l'arme lourde, tu peux mettre un flag (drapeau) avec une valeur à 1, qui passe à 0 un tour sur 2, et quand le flag est à 1, tu lances les dés pour essayer de toucher :

Code: Tout sélectionner
Every turn when the combat is happening and the player is carrying arme lourde:
  let the attack_of_player be the roll of the attack of the player; [là c'est pas optimisé car ça relance les dés à chaque tour, même si ce n'est pas pour attaquer]
  if attack_of_player is less than capacite_defence_adversaire and tour attaque is 1
    begin;
      now the point_de_vie of the adversaire is  point_de_vie of the adversaire - 5;
      end if;
  if tour attaque is 1, now tour attaque is 0
etc


Attention, c'est pas testé, et ça fait de gros raccourcis, mais ça peut donner une piste de recherche, en tout cas il faudra bien adapter ce qui précède pour que ça soit utilisable. Il serait sans doute plus rigoureux de regarder par exemple comment utiliser 2, 3, 4 ou 5 attaques par tour, si le besoin s'en fait sentir, et dans ce cas recopier bêtement le code d'attaque comme j'ai proposé n'est pas une bonne solution (mais c'est sans doute la plus rapide s'il n'y a que 2 attaques max par tour)

Tu peux regarder le code de l'extension escapade dont le lien est plus haut, c'est très loin d'être parfais mais ça peut donner des idées.

En particulier, faire un "every turn when combat is happening" n'est peut-être pas l'idéal (quoique ?), tu peux regarder comment j'ai fait avec les règles d'attaque et contre attaque, en particulier ce qui est nommé "Rule for counterattacking player of a thing (called opponent):"

et j'ai une règle "every turn" qui a ceci :

repeat with R running through persons:
if R is hostile and R is in location and R is not dead, carry out the counterattacking player activity with R;

etc

comme ça ça permet de gérer s'il y a plusieurs attaquants, ils vont tous attaquer les uns après les autres.

Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm


Retourner vers Questions techniques et aide pour votre code

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité