-40%
Le deal à ne pas rater :
Tefal Ingenio Emotion – Batterie de cuisine 10 pièces (induction, ...
59.99 € 99.99 €
Voir le deal

Aller en bas
Nérylis
Nérylis
Membre

Nombre de messages : 615
Age : 35
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Bug Contre-Attaque

Dim 27 Mar 2016 - 21:06
Coucou,

J'ai trouvé un bug avec le système de contre-attaque par défaut de RPG Maker. Lorsque l'attaque est multiple, c'est-à-dire que l'attaquant a X coups supplémentaires, celui qui renvoie l'attaque en face va donner autant de X coups. C'est un peu bête, d'autant que si l'attaquant meurt avant d'avoir subi tous les contres, ces derniers sont quand même joués dans le vide. L'idéal je pense serait que si l'adversaire voit un de ses X coups contré, sa série s'arrête, et la contre-attaque soit de un seul coup (et non pas copier la série de l'ennemi). Comment peut-on modifier cela ?

La portion de code impactée se trouve dans Scene_Battle à partir de la ligne 619 :

Code:
 #--------------------------------------------------------------------------
  # * Invoke Counterattack
  #--------------------------------------------------------------------------
  def invoke_counter_attack(target, item)
    @log_window.display_counter(target, item)
    attack_skill = $data_skills[target.attack_skill_id]
    @subject.item_apply(target, attack_skill)
    refresh_status
    @log_window.display_action_results(@subject, attack_skill)
  end

Si vous voulez tester le bug, c'est simple. Donnez à vos persos la caractéristique 100% de chances de contre-attaque et mettez à votre adversaire la caractéristique Attaques supplémentaires 4 par exemple. Lancez un combat et voyez par vous-même.


Dernière édition par Nérylis le Lun 28 Mar 2016 - 21:13, édité 1 fois
Gelarto
Gelarto
Gelato Della Mamma

Nombre de messages : 2919
Age : 29
Distinction : Grand bêta-testeur de la communauté Curse
Personne avec du goût
Je ne suis pas une glace italienne, bordel de merde! [Gel']
Mon plus grand fan [Yama']
Mon ptit bichon [encore Yama']
Jeau-Paul II[Mist']
Saint-Gelato Le Frais [Mist']
Écrivain du dimanche [Amal']
FF IV Fanatic [LaCommu']
Collectionneur de distinctions de merde [Yama]
ModoGel [Un staffieux mais lequel?]
RNGel 2.0 [Zeal']
Date d'inscription : 31/07/2012

Résolu Re: Bug Contre-Attaque

Dim 27 Mar 2016 - 21:59
Je peux pas t'aider (car je suis une bille en script) mais je pense pas que ça soit possible de voir 4 actions indépendantes comme une seule.

La caractéristique "Attaques supplémentaires" permet de "jouer X fois dans le même tour." Chaque action étant totalement indépendant les unes des autres, si la première est contré, ça serait moche pour les 3 autres qui le seront pas forcément (sauf si 100% mais on a rarement 100% de contre).

Plus que mette un seul coup, faudrait que les contre-attaques soient joués après chaque coup (ce qui serait bien plus logique) :
Attaque ennemi -> contre attaque -> Attaque ennemi -> contre attaque -> ect...
Ainsi si l'ennemi est censé mourir avant la fin de son combo, le joueur se fait pas arnaquer un ou plusieurs coups & y a aucune riposte dans le vent.
Nérylis
Nérylis
Membre

Nombre de messages : 615
Age : 35
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Re: Bug Contre-Attaque

Dim 27 Mar 2016 - 22:42
Attention, tu confonds Attaques supplémentaires et Actions supplémentaires. Ce que tu décris correspond aux Actions supplémentaires qui se configurent selon un pourcentage de chances d'être effectuées. Les Attaques supplémentaires dont je parle sont le nombre de fois en plus que la commande normale Attaque est jouée. Si par exemple on met +1, quand l'ennemi effectuera l'attaque standard, celle-ci sera jouée 2 fois. J'utilise cette caractéristique pour les ennemis pouvant attaquer de plusieurs endroits (un humanoïde à plusieurs bras ou encore un cerbère pour te donner quelques exemples).

Par défaut, les contres sont bien joués après chaque coup et lorsque l'ennemi meurt avant la fin de la série, celle-ci se poursuit avec les contres dans le vide.
tonyryu
tonyryu
Membre

Nombre de messages : 902
Age : 43
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: Bug Contre-Attaque

Lun 28 Mar 2016 - 10:50
J'essai de regarder ça dans la semaine.
Azuma-01
Azuma-01
Membre

Nombre de messages : 94
Age : 31
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Résolu Re: Bug Contre-Attaque

Lun 28 Mar 2016 - 16:00
Bonjour!
Si j'ai bien compris, ceci devrait être une solution :
Code:
##------------------------------------------------------------------------------
## [VXAce] Multiple hits after death (MhAD bug)
##   by Azuma-01
##
## Version : 1.0.0
## 28/03/16 - DD/MM/JJ
##
##By default, when the subject as an extra hit(s) capacity and the target
##perform a counter and kill the subect, the subject continue to attack
##beyond death... this fix stop the subject action on death...
##
##And add a little extra:
##-The ability to break the subject action when a target do a counter.
## With my default setting, the probality than the target can do such thing on
## counter is equal to the target critical rate * 10 (about 40% on default actor)
##  to costumize, see the method "counter_break_rate" (line 24-29).
##------------------------------------------------------------------------------

class Scene_Battle
  #--------------------------------------------------------------------------
  # * When a target counter, chance to cancel the subject action
  #   note: if set to 1, always cancel the subject action ; 0, never
  #--------------------------------------------------------------------------
  def counter_break_rate(target)
    # target critical rate * 10
    return target.cri*10
    # (target critical rate - subject critical rate) * 10
    #return (target.cri - @subject.cri) *10
  end
  #--------------------------------------------------------------------------
  # * Use Skill/Item
  #--------------------------------------------------------------------------
  def use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    show_animation(targets, item.animation_id)
    targets.each {|target| item.repeats.times { return if invoke_item(target, item) || @subject.hp<=0 } }
  end
  #--------------------------------------------------------------------------
  # * Invoke Skill/Item
  #--------------------------------------------------------------------------
  def invoke_item(target, item)
    # if target do a counter, calc chance to break the subject action
    break_cycle = rand < counter_break_rate(target)
    if rand < target.item_cnt(@subject, item)
      invoke_counter_attack(target, item)
    elsif rand < target.item_mrf(@subject, item)
      invoke_magic_reflection(target, item)
    else
      apply_item_effects(apply_substitute(target, item), item)
      break_cycle = false # no counter, target cant break action
    end
    @subject.last_target_index = target.index
    return break_cycle
  end
end

Résultats : Quand la cible contre-attaque il y a une chance que le tour du sujet ce termine (voir counter_break_rate). Si le sujet continue, il frappe de nouveau jusqu'à la fin de son tour ou que la cible le bloque avec succès d'une contre-attaque "bien placé" ou que le sujet meurt à la suite d'un coup vicieux (hp ==  0 ou moins:p)!
(oups... j'ai encore fais mes commentaires en anglais...)
Nérylis
Nérylis
Membre

Nombre de messages : 615
Age : 35
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Re: Bug Contre-Attaque

Lun 28 Mar 2016 - 18:54
Coucou, je viens de tester et oui c'est bien ce que je voulais. Merci de ton aide. Je n'ai pas trop compris comment marchait le critical target rate * X mais en mettant * 100, celui qui contre-attaque interrompt la série de l'attaquant, ce qui me semble logique. J'ai testé avec la fonction Attaques supplémentaires et aussi en modifiant le nombre de coups dans la compétence d'attaque. Ça marche bien, la série est arrêtée. J'ai juste un petit souci de conflit avec un autre script. Il s'agit du script d'Efeberk qui permet d'animer en vidéo un skill. Je n'y connais pas grand chose en script mais ça doit être à cause de la def use_item qui semble être commune. En alternant la position des deux scripts, soit la contre-attaque marche mais je n'ai plus les skills en vidéo, soit l'inverse. Peux-tu regarder ça s'il te plaît ?

Le script d'Efeberk est ci-dessous :

Code:
# -------------------------------------------------
# Script Name : Play Movie before skill
# Scripter : efeberk
# Date : 29.07.2013 07:28
# Version : RPG Maker VX Ace(RGSS3)
# Modified by Trihan on 08/05/2015
#-----------------------------------
# Modifié par Mist', le 23/06/15 :
# Compatibilité avec le script LNX11a
#------------------------------------------------
#
# How to:
#
# Just add a little text to skill notetag
#
#
#
# x = movie name
#

module Play_Movie_Before_Skill

  DURATION = 3 # x is used to control how long the cast message will last

end

class RPG::Skill < RPG::UsableItem

def movie
if @note =~ /movie: (.*)/
return $1.to_s
end
end

end

class Scene_Battle < Scene_Base

  def use_item
    #Intégration LNX11
    item = @subject.current_action.item
    if LNX11::BATTLELOG_TYPE == 2 && !item.no_display
      helpdisplay_set(item, item.display_wait)
    end
    #Code de base Scene_Battle
    @log_window.display_use_item(@subject, item)
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    #Intégration Play_Movie_Before_Skill
    if item.is_a?(RPG::Skill) && item.movie
      Play_Movie_Before_Skill::DURATION.times { @log_window.wait }
      Graphics.play_movie('Movies/' + item.movie)
    end
    #Code de base Scene_Battle
    show_animation(targets, item.animation_id)
    targets.each {|target| item.repeats.times { invoke_item(target, item) } }
    #Intégration LNX11
    if LNX11::BATTLELOG_TYPE == 2
      wait(item.end_wait)
      helpdisplay_clear
    end
    wait_for_effect
  end
end
Azuma-01
Azuma-01
Membre

Nombre de messages : 94
Age : 31
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Résolu Re: Bug Contre-Attaque

Lun 28 Mar 2016 - 20:28
Pour bloquer l'action a tous coup remplace
Code:
target.cri * 10
par 1 car 1 == 100%

pour récupérer t'es vidéo, remplace le script par celui-ci et place le APRÈS mon patch
Code:
# -------------------------------------------------
# Script Name : Play Movie before skill
# Scripter : efeberk
# Date : 29.07.2013 07:28
# Version : RPG Maker VX Ace(RGSS3)
# Modified by Trihan on 08/05/2015
#-----------------------------------
# Modifié par Mist', le 23/06/15 :
# Compatibilité avec le script LNX11a
#
# Modifié par Azuma-01, le 28/03/16 :
# Compatibilité avec le MhAD bugfix
#------------------------------------------------
#
# How to:
#
# Just add a little text to skill notetag
#
#
#
# x = movie name
#

module Play_Movie_Before_Skill
  DURATION = 3 # x is used to control how long the cast message will last
end

class RPG::Skill < RPG::UsableItem
  def movie
    if @note =~ /movie: (.*)/
      return $1.to_s
    end
  end
end

class Scene_Battle < Scene_Base
  def use_item
    #Intégration LNX11
    item = @subject.current_action.item
    if LNX11::BATTLELOG_TYPE == 2 && !item.no_display
      helpdisplay_set(item, item.display_wait)
    end
    #Code de base Scene_Battle
    @log_window.display_use_item(@subject, item)
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    #Intégration Play_Movie_Before_Skill
    if item.is_a?(RPG::Skill) && item.movie
      Play_Movie_Before_Skill::DURATION.times { @log_window.wait }
      Graphics.play_movie('Movies/' + item.movie)
    end
    #Code de base Scene_Battle
    show_animation(targets, item.animation_id)
    #Intégration MhAD bugfix
    targets.each {|target| item.repeats.times { return if invoke_item(target, item) || @subject.hp<=0 } }
    #Intégration LNX11
    if LNX11::BATTLELOG_TYPE == 2
      wait(item.end_wait)
      helpdisplay_clear
    end
    wait_for_effect
  end
end
Nérylis
Nérylis
Membre

Nombre de messages : 615
Age : 35
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Re: Bug Contre-Attaque

Lun 28 Mar 2016 - 21:12
Impeccable, ça marche à la perfection. Merci beaucoup pour ton aide.
Contenu sponsorisé

Résolu Re: Bug Contre-Attaque

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum