Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: Dread Mac Farlane - Complet / Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

546 connectés actuellement

29523150 visiteurs
depuis l'ouverture

106877 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Leo-Games

Hellsoft

Tashiroworld

RPG Maker - La Communauté

Alex d'Or

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RESOLU] [RPG Maker XP] Aide sur un script de contre-attaque quasi fonctionnel


Wingan - posté le 04/12/2023 à 17:37:33 (10 messages postés)

❤ 0

Domaine concerné: Script
Logiciel utilisé: RPG Maker XP
(Re)bonjour !

De retour avec une nouvelle question à propos d'un script de contre-attaque, qui permet de lancer des contre-attaques contre tous types de dégâts, qu'ils aient été infligés par des attaques physiques ou des compétences.

Il marche parfaitement bien, à un détail près.
Il provoque une erreur lorsqu'on utilise une compétence qui cible un personnage depuis le menu. L'erreur survient avec des compétences qui soignent, blessent ou infligent 0 dégât au personnage ciblé. En combat, tout va bien.
Le problème est présent même sur un projet vierge.

Voici le message d'erreur :

Script 'Contre' line 87: NoMethodError occurred.
undefined method 'active_battler' for #<Scene_Skill:0xf40fef0>


Ligne 87 qui est donc :
if $scene.active_battler == attacker and skill.power > 0

Et bien sûr, voici le script en question (que j'ai déjà un peu personnalisé).

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
 
#==========================================================================
# ** UL Counter Attack
#==========================================================================
# Uncle Lanzer 
# Version 1
# 21.09.10
#==========================================================================
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#   
#  This work is protected by the following license:
# #----------------------------------------------------------------------------
# #  
# #  Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# #  ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #  
# #  You are free:
# #  
# #  to Share - to copy, distribute and transmit the work
# #  to Remix - to adapt the work
# #  
# #  Under the following conditions:
# #  
# #  Attribution. You must attribute the work in the manner specified by the
# #  author or licensor (but not in any way that suggests that they endorse you
# #  or your use of the work).
# #  
# #  Noncommercial. You may not use this work for commercial purposes.
# #  
# #  Share alike. If you alter, transform, or build upon this work, you may
# #  distribute the resulting work only under the same or similar license to
# #  this one.
# #  
# #  - For any reuse or distribution, you must make clear to others the license
# #    terms of this work. The best way to do this is with a link to this web
# #    page.
# #  
# #  - Any of the above conditions can be waived if you get permission from the
# #    copyright holder.
# #  
# #  - Nothing in this license impairs or restricts the author's moral rights.
# #  
# #----------------------------------------------------------------------------
 
#################
#               #  
# CONFIGURATION #
#               # 
#################
# IT`S PRETTY SIMPLE........ JUST KILL THE BATMAN! <-- FORGET THAT -.-U
# MAKE A "(YOUR COUNTER NAME)" STATE
# UL_COUNTER_STATES = { A => [ B,C]}
# A = THE COUNTER STATE
# B = RATE OF SUCCESS
# C = STRENGHT OF COUNTER ( % OF A NORMAL ATTACK)
Scene_Battle::UL_Counter_States = { 66 => [100,100], 
#Rancune2:
100 => [100,75], 
#Rancune1:
122 => [100,50], 
123 => [100,30], 142 => [30,30], 143 => [40,40], 144 => [50,50], 145 => [60,60], 184 => [100,100], 242 => [100,600], 249 => [150,100], 242 => [100,500], 
280 => [80,100], 281 => [45,40], 344 => [100,180], 250 => [100,300], 430 => [30,30], 431 => [40,40], 432 => [50,50], 433 => [60,60], 
#Rancune3:
436 => [100,100]} #ADD MORE BY THE SAME SYNTAX
 
 
# MESSAGGE WHEN COUNTER
Scene_Battle::UL_Counter_Messages = ['\m contre-attaque!']
 
# CHECKING SCRIPT
if !@ul_counterattack_disabled
 
# START
class Game_Battler
    
  alias lanzer_counter_battler_atkeff attack_effect
  def attack_effect(attacker)
    lanzer_counter_battler_atkeff(attacker)
    if $scene.active_battler == attacker
      $scene.ul_atkcounter_test(self)
    end
  end
  
  alias counter_skill_attacks skill_effect
  def skill_effect(attacker, skill)
    counter_skill_attacks(attacker, skill)
    if $scene.active_battler == attacker and skill.power > 0
      $scene.ul_atkcounter_test(self)
    end
  end
  
end
 
class Scene_Battle
  attr_accessor :active_battler
  
  def ul_atkcounter_test(battler)
    # The actor is applied with a state that prevents movement. Stop counter.
    return unless battler.movable?
    
    ul_temp = UL_Counter_States.keys
    for i in 0...ul_temp.size
      if battler.state?(ul_temp[i])
        if UL_Counter_States[ul_temp[i]][0] > rand(99)
          @ul_counter = UL_Counter_States[ul_temp[i]][1]
          @ul_countertarget = battler
          return
        end
      end
    end
  end
  
  alias lanzer_counter_battle_up4s5 update_phase4_step5
  def update_phase4_step5
    lanzer_counter_battle_up4s5
    if @ul_countertarget != nil
      @phase4_step = 1337  # LEET
      @ul_atkcounter = 28
    end
  end
  
  def ul_counter_update
    if @ul_countertarget.dead? or @ul_atkcounter == 0 or !@ul_countertarget.movable?
      @ul_atkcounter = nil
      @ul_counter = nil
      @ul_countertarget = nil
      @phase4_step = 6
      return
    end
    @ul_atkcounter -= 1
    if @ul_atkcounter == 10
      @ul_countertarget.animation_id = @ul_countertarget.animation1_id
      @active_battler.animation_id = @ul_countertarget.animation2_id
      ul_temp = rand(UL_Counter_Messages.size)
      ul_temp = UL_Counter_Messages[ul_temp].clone
      ul_temp.gsub!(/\\[Mm]/) { @ul_countertarget.name }
      @help_window.set_text(ul_temp, 1)
      @active_battler.attack_effect(@ul_countertarget)
      if !@active_battler.damage.is_a?(String)
        @active_battler.hp += @active_battler.damage
        @active_battler.damage = @active_battler.damage * @ul_counter / 100
        @active_battler.hp -= @active_battler.damage
        @status_window.refresh
      end
      @active_battler.damage_pop = true
    end
  end
  
  alias lanzer_counter_battle_update update
  def update
    if @ul_atkcounter != nil
      ul_counter_update
    end
    lanzer_counter_battle_update
  end
end
 
#--------------------------------------------------------------------------#
end
 



Merci d'avance à toute âme charitable qui aurait le courage de se pencher dessus :sourit Ça devrait être ma dernière question avant un bon moment.


Roi of the Suisse - posté le 04/12/2023 à 18:05:05 (29858 messages postés) - honor -

❤ 0

Alerte neige !

La méthode active_battler est définie dans la classe Scene_Battle :

Portion de code : Tout sélectionner

1
2
class Scene_Battle
attr_accessor :active_battler



Es-tu sûr que ta classe Scene_Skill hérite de la classe Scene_Battle ?

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Wingan - posté le 04/12/2023 à 18:26:57 (10 messages postés)

❤ 0

Ahem, merci pour ta réponse, mais il se trouve que je suis un néophyte absolu en matière de Ruby. Je serai donc incapable de te répondre...
En tout cas, j'utilise le système de combat par défaut (sait-on jamais).


Mack - posté le 04/12/2023 à 18:29:01 (2290 messages postés) - staff

❤ 0

Roi of the Suisse a dit:

La méthode active_battler est définie dans la classe Scene_Battle :

Portion de code : Tout sélectionner

1
2
class Scene_Battle
attr_accessor :active_battler



Es-tu sûr que ta classe Scene_Skill hérite de la classe Scene_Battle ?


Ah peut près sur que c'est pas le cas, mais ça n'a aucun intérêt, non ?

J'me souviens plus du tout de la syntaxe, mais ça serait pas mieux de mettre une condition pour vérifier qu'il soit bien dans un Scene_Battle plutôt ?

( De mémoire c'est un truc du genre $scene.is_a(Scene_Battle), donc rajouter ça devant la condition qui pose problème et mettre le et qui effectue pas la seconde condition si la première n'est pas remplie serait mieux non ? )

( Je prend note de tout les commentaires, même si je n'y répond pas )


Roi of the Suisse - posté le 04/12/2023 à 18:40:22 (29858 messages postés) - honor -

❤ 0

Alerte neige !

Oui, il faut vérifier que ta $scene est une instance de la classe Scene_Battle.
La classe Scene_Battle a la méthode active_battler(), mais pas forcément la classe Scene_Skill.
Si jamais la classe Scene_Skill hérite de Scene_Battle, elle héritera de la méthode aussi.
Sinon, comme dit Mack, avant d'appeler la méthode active_battler() sur la variable $scene, vérifie que c'est bien une instance de la classe Scene_Battle, elle aura alors forcément la méthode.

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Wingan - posté le 05/12/2023 à 07:19:30 (10 messages postés)

❤ 0

Merci pour vos réponses, mais comme dit plus haut, je n'y connais rien en Ruby, donc je suis incapable d'apporter de telles modifications.
J'ai demandé à ChatGPT, qui m'a recommandé d'inclure la ligne class Scene_Skill < Scene_Battle pour que Scene_Skill hérite de Scene_Battle, mais je ne sais pas où la mettre.

Si jamais l'un de vous a le courage de me donner directement la modification à mettre dans le script, ce serait super.


Mack - posté le 05/12/2023 à 10:41:01 (2290 messages postés) - staff

❤ 1

Ouais, c'est une solution, mais pour moi c'est pas une bonne.
En gros en faisant ce que ChatGPT te dit, la Scene_Skill va hériter de tout les attribut du Scene_Battle, donc de plein de truc dont t'as rien à faire.


Tu peux te contenter d'englober les lignes :

Portion de code : Tout sélectionner

1
if $scene.active_battler == attacker


et

Portion de code : Tout sélectionner

1
if $scene.active_battler == attacker and skill.power > 0


Par :

Portion de code : Tout sélectionner

1
if $scene.is_a?(Scene_Battle)


( Avec le end juste après )

Comme ça si on est pas dans la Scene_Battle, le active_player ne sera jamais appelé.

( J'ai pas réussis à faire fonctionner le contre, je suppose que j'ai chier quelque part dans la config, mais j'ai plus le crash dans le menu des compétences, donc je te laisserais tester en combat )




Ah, et aussi, essaye d'utiliser la balise de code plutôt que celle de spoiler, c'est plus facile à lire :P

( Je prend note de tout les commentaires, même si je n'y répond pas )


Wingan - posté le 05/12/2023 à 12:39:08 (10 messages postés)

❤ 0

Oups, pardon pour les balises, c'est corrigé !

J'ai appliqué ta proposition, et voilà ce que ça donne.

- Les contres marchent bien.
- Il n'y a plus de plantage dans le menu.
MAIS
- Toujours dans le menu, l'utilisation d'une compétence sur un allié ne fonctionne plus. Lorsque je valide l'allié cible, j'ai l'effet sonore d'action impossible et rien ne se passe (par exemple, le perso ciblé ne reçoit pas les PV de la compétence de soin).

Je commence à me dire que ce script est juste mal fichu ^^"


Mack - posté le 06/12/2023 à 11:54:23 (2290 messages postés) - staff

❤ 0

Question con, mais le nouveau if il englobe que la condition, il englobe pas la ligne lanzer_counter_battler_atkeff(attacker) ?
( Ni le counter_skill_attacks(attacker )

Pareil, le skill que tu veux lancer dans le menu est bien lancable ?
( Genre si c'est du soin, que la cible est pas toute sa vie )

Là sur le code que tu montres je vois rien qui pourrait bloquer ça a part le truc que j'ai dit avant

J'essaierais de voir ce soir pour faire des test

( Je prend note de tout les commentaires, même si je n'y répond pas )


cortez - posté le 06/12/2023 à 17:53:35 (523 messages postés)

❤ 0

C'est pas très beau et cela va sans doute poser des soucis si tu utilise d'autres scripts de bataille que ceux par defaut mais voici le code qui fonctionne. (notamment car je recopie une méthode en entier)

J'ai tout testé (des soin dans le menu et en combat) et ça fonctionne. Si quelqu'un sait comment améliorer mes truc n'hésitez pas.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#==========================================================================
# ** UL Counter Attack
#==========================================================================
# Uncle Lanzer 
# Version 1
# 21.09.10
#==========================================================================
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#   
#  This work is protected by the following license:
# #----------------------------------------------------------------------------
# #  
# #  Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# #  ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #  
# #  You are free:
# #  
# #  to Share - to copy, distribute and transmit the work
# #  to Remix - to adapt the work
# #  
# #  Under the following conditions:
# #  
# #  Attribution. You must attribute the work in the manner specified by the
# #  author or licensor (but not in any way that suggests that they endorse you
# #  or your use of the work).
# #  
# #  Noncommercial. You may not use this work for commercial purposes.
# #  
# #  Share alike. If you alter, transform, or build upon this work, you may
# #  distribute the resulting work only under the same or similar license to
# #  this one.
# #  
# #  - For any reuse or distribution, you must make clear to others the license
# #    terms of this work. The best way to do this is with a link to this web
# #    page.
# #  
# #  - Any of the above conditions can be waived if you get permission from the
# #    copyright holder.
# #  
# #  - Nothing in this license impairs or restricts the author's moral rights.
# #  
# #----------------------------------------------------------------------------
 
#################
#               #  
# CONFIGURATION #
#               # 
#################
# IT`S PRETTY SIMPLE........ JUST KILL THE BATMAN! <-- FORGET THAT -.-U
# MAKE A "(YOUR COUNTER NAME)" STATE
# UL_COUNTER_STATES = { A => [ B,C]}
# A = THE COUNTER STATE
# B = RATE OF SUCCESS
# C = STRENGHT OF COUNTER ( % OF A NORMAL ATTACK)
Scene_Battle::UL_Counter_States = { 66 => [100,100], 
#Rancune2:
100 => [100,75], 
#Rancune1:
122 => [100,50], 
123 => [100,30], 142 => [30,30], 143 => [40,40], 144 => [50,50], 145 => [60,60], 184 => [100,100], 242 => [100,600], 249 => [150,100], 242 => [100,500], 
280 => [80,100], 281 => [45,40], 344 => [100,180], 250 => [100,300], 430 => [30,30], 431 => [40,40], 432 => [50,50], 433 => [60,60], 
#Rancune3:
436 => [100,100]} #ADD MORE BY THE SAME SYNTAX
 
 
# MESSAGGE WHEN COUNTER
Scene_Battle::UL_Counter_Messages = ['\m contre-attaque!']
 
# CHECKING SCRIPT
if !@ul_counterattack_disabled
 
# START
class Game_Battler
    
  alias lanzer_counter_battler_atkeff attack_effect
  def attack_effect(attacker)
    lanzer_counter_battler_atkeff(attacker)
    if $scene.active_battler == attacker
      $scene.ul_atkcounter_test(self)
    end
  end
 
  alias_method :counter_skill_effect, :skill_effect
  
  alias_method :counter_skill_attacks, :counter_skill_effect
  def counter_skill_effect(attacker, skill)
    counter_skill_attacks(attacker, skill)
    if $scene.active_battler == attacker and skill.power > 0
      $scene.ul_atkcounter_test(self)
    end
  end 
end
 
class Scene_Battle
  attr_accessor :active_battler
  
  alias counter_skill_action_result make_skill_action_result
  def make_skill_action_result
    # Get skill
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # If not a forcing action
    unless @active_battler.current_action.forcing
      # If unable to use due to SP running out
      unless @active_battler.skill_can_use?(@skill.id)
        # Clear battler being forced into action
        $game_temp.forcing_battler = nil
        # Shift to step 1
        @phase4_step = 1
        return
      end
    end
    # Use up SP
    @active_battler.sp -= @skill.sp_cost
    # Refresh status window
    @status_window.refresh
    # Show skill name on help window
    @help_window.set_text(@skill.name, 1)
    # Set animation ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # Set command event ID
    @common_event_id = @skill.common_event_id
    # Set target battlers
    set_target_battlers(@skill.scope)
    # Apply skill effect
    for target in @target_battlers
      target.counter_skill_effect(@active_battler, @skill)
    end
  end
  
  
  def ul_atkcounter_test(battler)
    # The actor is applied with a state that prevents movement. Stop counter.
    return unless battler.movable?
    
    ul_temp = UL_Counter_States.keys
    for i in 0...ul_temp.size
      if battler.state?(ul_temp[i])
        if UL_Counter_States[ul_temp[i]][0] > rand(99)
          @ul_counter = UL_Counter_States[ul_temp[i]][1]
          @ul_countertarget = battler
          return
        end
      end
    end
  end
  
  alias lanzer_counter_battle_up4s5 update_phase4_step5
  def update_phase4_step5
    lanzer_counter_battle_up4s5
    if @ul_countertarget != nil
      @phase4_step = 1337  # LEET
      @ul_atkcounter = 28
    end
  end
  
  def ul_counter_update
    if @ul_countertarget.dead? or @ul_atkcounter == 0 or !@ul_countertarget.movable?
      @ul_atkcounter = nil
      @ul_counter = nil
      @ul_countertarget = nil
      @phase4_step = 6
      return
    end
    @ul_atkcounter -= 1
    if @ul_atkcounter == 10
      @ul_countertarget.animation_id = @ul_countertarget.animation1_id
      @active_battler.animation_id = @ul_countertarget.animation2_id
      ul_temp = rand(UL_Counter_Messages.size)
      ul_temp = UL_Counter_Messages[ul_temp].clone
      ul_temp.gsub!(/\\[Mm]/) { @ul_countertarget.name }
      @help_window.set_text(ul_temp, 1)
      @active_battler.attack_effect(@ul_countertarget)
      if !@active_battler.damage.is_a?(String)
        @active_battler.hp += @active_battler.damage
        @active_battler.damage = @active_battler.damage * @ul_counter / 100
        @active_battler.hp -= @active_battler.damage
        @status_window.refresh
      end
      @active_battler.damage_pop = true
    end
  end
  
  alias lanzer_counter_battle_update update
  def update
    if @ul_atkcounter != nil
      ul_counter_update
    end
    lanzer_counter_battle_update
  end
end
 
#--------------------------------------------------------------------------#
end




Mack - posté le 06/12/2023 à 19:32:32 (2290 messages postés) - staff

❤ 0

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
 
#==========================================================================
# ** UL Counter Attack
#==========================================================================
# Uncle Lanzer 
# Version 1
# 21.09.10
#==========================================================================
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#   
#  This work is protected by the following license:
# #----------------------------------------------------------------------------
# #  
# #  Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# #  ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #  
# #  You are free:
# #  
# #  to Share - to copy, distribute and transmit the work
# #  to Remix - to adapt the work
# #  
# #  Under the following conditions:
# #  
# #  Attribution. You must attribute the work in the manner specified by the
# #  author or licensor (but not in any way that suggests that they endorse you
# #  or your use of the work).
# #  
# #  Noncommercial. You may not use this work for commercial purposes.
# #  
# #  Share alike. If you alter, transform, or build upon this work, you may
# #  distribute the resulting work only under the same or similar license to
# #  this one.
# #  
# #  - For any reuse or distribution, you must make clear to others the license
# #    terms of this work. The best way to do this is with a link to this web
# #    page.
# #  
# #  - Any of the above conditions can be waived if you get permission from the
# #    copyright holder.
# #  
# #  - Nothing in this license impairs or restricts the author's moral rights.
# #  
# #----------------------------------------------------------------------------
 
#################
#               #  
# CONFIGURATION #
#               # 
#################
# IT`S PRETTY SIMPLE........ JUST KILL THE BATMAN! <-- FORGET THAT -.-U
# MAKE A "(YOUR COUNTER NAME)" STATE
# UL_COUNTER_STATES = { A => [ B,C]}
# A = THE COUNTER STATE
# B = RATE OF SUCCESS
# C = STRENGHT OF COUNTER ( % OF A NORMAL ATTACK)
Scene_Battle::UL_Counter_States = { 66 => [100,100], 
#Rancune2:
100 => [100,75], 
#Rancune1:
122 => [100,50], 
123 => [100,30], 142 => [30,30], 143 => [40,40], 144 => [50,50], 145 => [60,60], 184 => [100,100], 242 => [100,600], 249 => [150,100], 242 => [100,500], 
280 => [80,100], 281 => [45,40], 344 => [100,180], 250 => [100,300], 430 => [30,30], 431 => [40,40], 432 => [50,50], 433 => [60,60], 
#Rancune3:
436 => [100,100]} #ADD MORE BY THE SAME SYNTAX
 
 
# MESSAGGE WHEN COUNTER
Scene_Battle::UL_Counter_Messages = ['\m contre-attaque!']
 
# CHECKING SCRIPT
if !@ul_counterattack_disabled
 
# START
class Game_Battler
    
  alias lanzer_counter_battler_atkeff attack_effect
  def attack_effect(attacker)
    b = lanzer_counter_battler_atkeff(attacker)
    if @scene.is_a?(Scene_Battle)
      if $scene.active_battler == attacker
        $scene.ul_atkcounter_test(self)
      end
    end
    return b
  end
  
  alias counter_skill_attacks skill_effect
  def skill_effect(attacker, skill)
    b = counter_skill_attacks(attacker, skill)
    if @scene.is_a?(Scene_Battle)
      if $scene.active_battler == attacker and skill.power > 0
        $scene.ul_atkcounter_test(self)
      end
    end
    return b
  end
  
end
 
class Scene_Battle
  attr_accessor :active_battler
  
  def ul_atkcounter_test(battler)
    # The actor is applied with a state that prevents movement. Stop counter.
    return unless battler.movable?
    
    ul_temp = UL_Counter_States.keys
    for i in 0...ul_temp.size
      if battler.state?(ul_temp[i])
        if UL_Counter_States[ul_temp[i]][0] > rand(99)
          @ul_counter = UL_Counter_States[ul_temp[i]][1]
          @ul_countertarget = battler
          return
        end
      end
    end
  end
  
  alias lanzer_counter_battle_up4s5 update_phase4_step5
  def update_phase4_step5
    lanzer_counter_battle_up4s5
    if @ul_countertarget != nil
      @phase4_step = 1337  # LEET
      @ul_atkcounter = 28
    end
  end
  
  def ul_counter_update
    if @ul_countertarget.dead? or @ul_atkcounter == 0 or !@ul_countertarget.movable?
      @ul_atkcounter = nil
      @ul_counter = nil
      @ul_countertarget = nil
      @phase4_step = 6
      return
    end
    @ul_atkcounter -= 1
    if @ul_atkcounter == 10
      @ul_countertarget.animation_id = @ul_countertarget.animation1_id
      @active_battler.animation_id = @ul_countertarget.animation2_id
      ul_temp = rand(UL_Counter_Messages.size)
      ul_temp = UL_Counter_Messages[ul_temp].clone
      ul_temp.gsub!(/\\[Mm]/) { @ul_countertarget.name }
      @help_window.set_text(ul_temp, 1)
      @active_battler.attack_effect(@ul_countertarget)
      if !@active_battler.damage.is_a?(String)
        @active_battler.hp += @active_battler.damage
        @active_battler.damage = @active_battler.damage * @ul_counter / 100
        @active_battler.hp -= @active_battler.damage
        @status_window.refresh
      end
      @active_battler.damage_pop = true
    end
  end
  
  alias lanzer_counter_battle_update update
  def update
    if @ul_atkcounter != nil
      ul_counter_update
    end
    lanzer_counter_battle_update
  end
end
 
#--------------------------------------------------------------------------#
end
 



En faite, le script de base est mal branlé.


Pour faire simple, la méthode skill_effect est censé renvoyer un boolean ( vrai ou faux ).
Or, dans le script, ben cette partie est complétement passer à la trappe, on renvoi jamais le résultat de la méthode d'origine.
Donc en rajoutant juste le return, ça marche, mais comme la première fois, j'ai pas réussis à tester en combat.


En relisant un peu le script de base, j'me dit que en combat, même si l'ennemi rate son coup, le contre doit avoir lieu, je sais pas si c'est un truc que tu veux ou pas.


Par contre Cortez, je comprend pas ce que t'as essayé de faire ? ( Enfin, je comprend pas comment ça peut marcher ? )
Le problème initiale, c'était que ça essayé d'appeler une métode qui n'existait pas dans la classe Scene_Script, comment ça marche ce que t'as fait ?
Le alias_method va créer une méthode vide dans le cas où elle existe pas ?

( Je prend note de tout les commentaires, même si je n'y répond pas )


cortez - posté le 06/12/2023 à 19:47:48 (523 messages postés)

❤ 0

Mack a dit:


Par contre Cortez, je comprend pas ce que t'as essayé de faire ? ( Enfin, je comprend pas comment ça peut marcher ? )
Le problème initiale, c'était que ça essayé d'appeler une métode qui n'existait pas dans la classe Scene_Script, comment ça marche ce que t'as fait ?
Le alias_method va créer une méthode vide dans le cas où elle existe pas ?



Très sérieusement je ne sais pas trop comment j'ai réussi.
Je me suis rendu compte que le script original alias la fonction skill_effet et avec plusieurs test (en retirant les if / end originaux) j'ai cru que le script re-definissait la methode skill_effect et donc j'en ai fait une copie, l'originale est appelé par les menus du jeu. La copie est appelée par Scene_battle uniquement (d'ou la redéfinition de la methode make_skill_action_result.

C'est superflux je pense mais cela fonctionne quand même. (je n'avais pas compris que la methode de base attendait un retour de valeur (true or false).


Wingan - posté le 07/12/2023 à 08:09:56 (10 messages postés)

❤ 1

Merci encore pour vous retours !

J'ai testé vos 2 scripts, et l'un d'eux fonctionne (pour l'instant) à merveille. Il s'agit de celui de... (roulement de tambour) cortez !
Mack, avec le tien, les contre-attaques ne sont pas déclenchées, malheureusement :(

Avec celui de cortez, j'ai eu quelques conflits avec d'autres scripts, mais je les ai réorganisés dans l'éditeur et ça a l'air d'avoir tout corrigé. Je vais continuer de tester à fond mon jeu pour m'assurer que tout est bon, mais ça a l'air bien parti.

Je marquerai ce topic comme résolu après quelques tests supplémentaires, au cas où quelqu'un aurait le courage de proposer une autre version. En attendant, merci infiniment à vous tous pour votre aide et vos efforts. C'était vraiment sympa de votre part :D


cortez - posté le 07/12/2023 à 16:55:14 (523 messages postés)

❤ 0

merci pour ton message,
j'ai gagné +20 en estime personnelle mais j'ai aussi -10 en "pourquoi ça marche quand même" :D

Bref le script de base était pas vraiment top mais après recherche y a pas vraiment d'autres choix sur le net. (pour XP pas grand chose mais pour VX ou version récente c'est l’embarras du choix)

Vive rpg maker XP (objectivement le meilleur des logiciels de making)

Index du forum > Entraide > [RESOLU] [RPG Maker XP] Aide sur un script de contre-attaque quasi fonctionnel

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers