Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
497 connectés actuellement
30732812 visiteurs depuis l'ouverture
2791 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
Messages postés par cortez Nombre de messages référencés sur Oniromancie (non supprimés): 470 Aller à la page: 1 2 3 4 5 6 7 8 9 10 11 12
Posté dans Forum - [RMMZ] Problème avec characters sur RMMZ |
cortez -
posté le 09/07/2024 à 16:10:30. (524 messages postés) |
| Mmm...
La 2e page que tu as, elle appartient au même évènement que celui appelé "Scene" ?
As-tu une commande "supprimer l'évènement" quelque part dans ton évent "scene" ?
|
Posté dans Forum - [RPG MAKER MV] Empêcher résurrection combat |
cortez -
posté le 31/01/2024 à 17:55:26. (524 messages postés) |
| Bonne année a toi aussi.
A moins que j'ai raté un truc, si tu crée un statut "Mort 2" identique a celui de base (donc tu
as 2 statuts mort celui de base et celui pour les sacrifices.)
Il faut aussi que ton objet tue le lanceur sans vider les HP, ajoute juste le statut "Mort 2" là
normalement tu es tranquille.
Les items de résurrection peuvent soigner la vraie mort mais pas le sacrifice (tu peux alors
créer des items non utilisable en combat qui soigne le sacrifice, ou aller voir un PNG genre
prêtre pour guérir)
Il y a aussi la possibilité de créer des sorts "résurrection" qui ne soignent que le statut mort.
Après c'est sur que les plugin c'est plus simple.
|
Posté dans Forum - DADD - Episode1 Les Aventures de Teltok - Platforme/Aventure |
cortez -
posté le 13/12/2023 à 22:41:19. (524 messages postés) |
| Là comme ça ta courbe de ease-in / out pour la caméra me fait pense a une formule cosinus :
Si tu veux tester des courbes en bidouillant des graphiques je te conseille le site :
https://www.desmos.com/calculator?lang=fr
Tu a pas mal de formules déjà faites et tu peux régler les valeur et voir le résultat en live.
Sinon, pour parler du jeu, j'aime pas la direction artistique (proportions des perso et tout) mais j'adore le taf réalisé sur les animations, y a un petit coté rayman que j'adore. Continue tu fait un super boulot . La qualité est incroyable pour des travaux réalisés tout seuls (sur 10 ans mais quand même)
|
Posté dans Forum - [RPG Maker XP] Aide sur un script de contre-attaque quasi fonctionnel |
cortez -
posté le 07/12/2023 à 16:55:14. (524 messages postés) |
| merci pour ton message,
j'ai gagné +20 en estime personnelle mais j'ai aussi -10 en "pourquoi ça marche quand même"
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)
|
Posté dans Forum - [RPG Maker XP] Aide sur un script de contre-attaque quasi fonctionnel |
cortez -
posté le 06/12/2023 à 19:47:48. (524 messages postés) |
| 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).
|
Posté dans Forum - [RPG Maker XP] Aide sur un script de contre-attaque quasi fonctionnel |
cortez -
posté le 06/12/2023 à 17:53:35. (524 messages postés) |
| 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.
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 |
|
Posté dans Forum - [RPG Maker XP] Cécité : les compétences ont forcément 0 % de taux de réussite |
cortez -
posté le 02/12/2023 à 23:00:34. (524 messages postés) |
| J'ai trouvé, ils sont un peu con chez les dev de RPG maker il ont oublié que les variables de type "entier" retirent les décimales après la virgule
D'après mes test voici ce qu'il se passe dans les formules
Je met un statut aveugle avec un taux à 50% (donc les héros sous l'effet ont 50% de chance de rater leur attaques et skills)
Voici la formule des script de base (j'ai ajouté une ligne print pour avoir les valeur en live pendant le combat)
1
2
3
4
5
6
7
8
9
10
11
| # First hit detection
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
print "hit#{hit} user_hit#{user.hit} result#{hit_result} skill_hit#{skill.hit}"
# Set effective flag if skill is uncertain
effective |= hit < 100
# If hit occurs
if hit_result == true |
Si le héro a une valeur de hit à 50 (car le statut donne 50) alors j'ai :
hit = skill.hit
hit = 100 (dans les skills par défaut c'est 100)
le skill testé utilise la force pour toucher donc on joue aussi la condition if
hit *= user.hit / 100
hit = 100 * (50 / 100) (en ruby "c *= b" équivaut à "c = c * b"
50 / 100 = 0.5
Et la ça coince, 0.5 pour une variable de type entier ça vaut 0
Donc hit vaut 0 donc le skill échoue 100% du temps.
La solution est toute conne, il faut que le script utilise une variable de type "float" (avec virgule)
Si on reprend la formule avec un type float
hit = (100.0 * 50.0) / 100.0
hit vaut 50 donc bien 1 chance sur 2 de toucher.
Dans ma correction j'ai rendu obligatoire la vérification de la précision pour tout les skills afin que même les skills non physiques touchent en fonction de la précision du personnage. J'espère que cela te conviendra.
Voici le code corrigé dans le game_battler 3 (les changement sont ligne 119 120 et 121)
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
| #==============================================================================
# ** Game_Battler (part 3)
#------------------------------------------------------------------------------
# This class deals with battlers. It's used as a superclass for the Game_Actor
# and Game_Enemy classes.
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# * Determine Usable Skills
# skill_id : skill ID
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
# If there's not enough SP, the skill cannot be used.
if $data_skills[skill_id].sp_cost > self.sp
return false
end
# Unusable if incapacitated
if dead?
return false
end
# If silent, only physical skills can be used
if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
return false
end
# Get usable time
occasion = $data_skills[skill_id].occasion
# If in battle
if $game_temp.in_battle
# Usable with [Normal] and [Only Battle]
return (occasion == 0 or occasion == 1)
# If not in battle
else
# Usable with [Normal] and [Only Menu]
return (occasion == 0 or occasion == 2)
end
end
#--------------------------------------------------------------------------
# * Applying Normal Attack Effects
# attacker : battler
#--------------------------------------------------------------------------
def attack_effect(attacker)
# Clear critical flag
self.critical = false
# First hit detection
hit_result = (rand(100) < attacker.hit)
# If hit occurs
if hit_result == true
# Calculate basic damage
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
# Element correction
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
# If damage value is strictly positive
if self.damage > 0
# Critical correction
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
# Guard correction
if self.guarding?
self.damage /= 2
end
end
# Dispersion
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Second hit detection
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# If hit occurs
if hit_result == true
# State Removed by Shock
remove_states_shock
# Substract damage from HP
self.hp -= self.damage
# State change
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
# When missing
else
# Set damage to "Miss"
self.damage = "Miss"
# Clear critical flag
self.critical = false
end
# End Method
return true
end
#--------------------------------------------------------------------------
# * Apply Skill Effects
# user : the one using skills (battler)
# skill : skill
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# Clear critical flag
self.critical = false
# If skill scope is for ally with 1 or more HP, and your own HP = 0,
# or skill scope is for ally with 0, and your own HP = 1 or more
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# End Method
return false
end
# Clear effective flag
effective = false
# Set effective flag if common ID is effective
effective |= skill.common_event_id > 0
# First hit detection
hit = skill.hit
#if skill.atk_f > 0
hit *= user.hit / 100.0
#end
hit_result = (rand(100) < hit)
# Set effective flag if skill is uncertain
effective |= hit < 100
# If hit occurs
if hit_result == true
# Calculate power
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
# Calculate rate
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# Calculate basic damage
self.damage = power * rate / 20
# Element correction
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# If damage value is strictly positive
if self.damage > 0
# Guard correction
if self.guarding?
self.damage /= 2
end
end
# Dispersion
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Second hit detection
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
# Set effective flag if skill is uncertain
effective |= hit < 100
end
# If hit occurs
if hit_result == true
# If physical attack has power other than 0
if skill.power != 0 and skill.atk_f > 0
# State Removed by Shock
remove_states_shock
# Set to effective flag
effective = true
end
# Substract damage from HP
last_hp = self.hp
self.hp -= self.damage
effective |= self.hp != last_hp
# State change
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# If power is 0
if skill.power == 0
# Set damage to an empty string
self.damage = ""
# If state is unchanged
unless @state_changed
# Set damage to "Miss"
self.damage = "Miss"
end
end
# If miss occurs
else
# Set damage to "Miss"
self.damage = "Miss"
end
# If not in battle
unless $game_temp.in_battle
# Set damage to nil
self.damage = nil
end
# End Method
return effective
end
#--------------------------------------------------------------------------
# * Application of Item Effects
# item : item
#--------------------------------------------------------------------------
def item_effect(item)
# Clear critical flag
self.critical = false
# If item scope is for ally with 1 or more HP, and your own HP = 0,
# or item scope is for ally with 0 HP, and your own HP = 1 or more
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
# End Method
return false
end
# Clear effective flag
effective = false
# Set effective flag if common ID is effective
effective |= item.common_event_id > 0
# Determine hit
hit_result = (rand(100) < item.hit)
# Set effective flag is skill is uncertain
effective |= item.hit < 100
# If hit occurs
if hit_result == true
# Calculate amount of recovery
recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
if recover_hp < 0
recover_hp += self.pdef * item.pdef_f / 20
recover_hp += self.mdef * item.mdef_f / 20
recover_hp = [recover_hp, 0].min
end
# Element correction
recover_hp *= elements_correct(item.element_set)
recover_hp /= 100
recover_sp *= elements_correct(item.element_set)
recover_sp /= 100
# Dispersion
if item.variance > 0 and recover_hp.abs > 0
amp = [recover_hp.abs * item.variance / 100, 1].max
recover_hp += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and recover_sp.abs > 0
amp = [recover_sp.abs * item.variance / 100, 1].max
recover_sp += rand(amp+1) + rand(amp+1) - amp
end
# If recovery code is negative
if recover_hp < 0
# Guard correction
if self.guarding?
recover_hp /= 2
end
end
# Set damage value and reverse HP recovery amount
self.damage = -recover_hp
# HP and SP recovery
last_hp = self.hp
last_sp = self.sp
self.hp += recover_hp
self.sp += recover_sp
effective |= self.hp != last_hp
effective |= self.sp != last_sp
# State change
@state_changed = false
effective |= states_plus(item.plus_state_set)
effective |= states_minus(item.minus_state_set)
# If parameter value increase is effective
if item.parameter_type > 0 and item.parameter_points != 0
# Branch by parameter
case item.parameter_type
when 1 # Max HP
@maxhp_plus += item.parameter_points
when 2 # Max SP
@maxsp_plus += item.parameter_points
when 3 # Strength
@str_plus += item.parameter_points
when 4 # Dexterity
@dex_plus += item.parameter_points
when 5 # Agility
@agi_plus += item.parameter_points
when 6 # Intelligence
@int_plus += item.parameter_points
end
# Set to effective flag
effective = true
end
# If HP recovery rate and recovery amount are 0
if item.recover_hp_rate == 0 and item.recover_hp == 0
# Set damage to empty string
self.damage = ""
# If SP recovery rate / recovery amount are 0, and parameter increase
# value is ineffective.
if item.recover_sp_rate == 0 and item.recover_sp == 0 and
(item.parameter_type == 0 or item.parameter_points == 0)
# If state is unchanged
unless @state_changed
# Set damage to "Miss"
self.damage = "Miss"
end
end
end
# If miss occurs
else
# Set damage to "Miss"
self.damage = "Miss"
end
# If not in battle
unless $game_temp.in_battle
# Set damage to nil
self.damage = nil
end
# End Method
return effective
end
#--------------------------------------------------------------------------
# * Application of Slip Damage Effects
#--------------------------------------------------------------------------
def slip_damage_effect
# Set damage
self.damage = self.maxhp / 10
# Dispersion
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Subtract damage from HP
self.hp -= self.damage
# End Method
return true
end
#--------------------------------------------------------------------------
# * Calculating Element Correction
# element_set : element
#--------------------------------------------------------------------------
def elements_correct(element_set)
# If not an element
if element_set == []
# Return 100
return 100
end
# Return the weakest object among the elements given
# * "element_rate" method is defined by Game_Actor and Game_Enemy classes,
# which inherit from this class.
weakest = -100
for i in element_set
weakest = [weakest, self.element_rate(i)].max
end
return weakest
end
end
|
Le même type de correction peux-être appliqué dans tout les scripts de combat custom du moment que tu cherche la valeur skill.hit dans les script custom et que les formules de "précision" soient similaires.
|
Posté dans Forum - [RPG Maker XP] Cécité : les compétences ont forcément 0 % de taux de réussite |
cortez -
posté le 01/12/2023 à 17:44:33. (524 messages postés) |
| Bizarre que l'évasion ne soit pas correctement prise en compte :
Tout dépend des stats de tes personnages et des ennemis mais normalement tu devrais toucher avec le même pourcentage avec des magies ou des attaques.
Tu n'as pas mis cette valeur dans les effets ?
Si oui cela annule toutes les magies non physique.
Sinon c'est sans doute les scripts qui ont des soucis.
Voici le Game_Battler_3 de la version officielle (STEAM) (si jamais ça peu aider)
Spoiler (cliquez pour afficher)
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
| #==============================================================================
# ** Game_Battler (part 3)
#------------------------------------------------------------------------------
# This class deals with battlers. It's used as a superclass for the Game_Actor
# and Game_Enemy classes.
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# * Determine Usable Skills
# skill_id : skill ID
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
# If there's not enough SP, the skill cannot be used.
if $data_skills[skill_id].sp_cost > self.sp
return false
end
# Unusable if incapacitated
if dead?
return false
end
# If silent, only physical skills can be used
if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
return false
end
# Get usable time
occasion = $data_skills[skill_id].occasion
# If in battle
if $game_temp.in_battle
# Usable with [Normal] and [Only Battle]
return (occasion == 0 or occasion == 1)
# If not in battle
else
# Usable with [Normal] and [Only Menu]
return (occasion == 0 or occasion == 2)
end
end
#--------------------------------------------------------------------------
# * Applying Normal Attack Effects
# attacker : battler
#--------------------------------------------------------------------------
def attack_effect(attacker)
# Clear critical flag
self.critical = false
# First hit detection
hit_result = (rand(100) < attacker.hit)
# If hit occurs
if hit_result == true
# Calculate basic damage
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
# Element correction
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
# If damage value is strictly positive
if self.damage > 0
# Critical correction
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
# Guard correction
if self.guarding?
self.damage /= 2
end
end
# Dispersion
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Second hit detection
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# If hit occurs
if hit_result == true
# State Removed by Shock
remove_states_shock
# Substract damage from HP
self.hp -= self.damage
# State change
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
# When missing
else
# Set damage to "Miss"
self.damage = "Miss"
# Clear critical flag
self.critical = false
end
# End Method
return true
end
#--------------------------------------------------------------------------
# * Apply Skill Effects
# user : the one using skills (battler)
# skill : skill
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# Clear critical flag
self.critical = false
# If skill scope is for ally with 1 or more HP, and your own HP = 0,
# or skill scope is for ally with 0, and your own HP = 1 or more
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# End Method
return false
end
# Clear effective flag
effective = false
# Set effective flag if common ID is effective
effective |= skill.common_event_id > 0
# First hit detection
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
# Set effective flag if skill is uncertain
effective |= hit < 100
# If hit occurs
if hit_result == true
# Calculate power
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
# Calculate rate
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# Calculate basic damage
self.damage = power * rate / 20
# Element correction
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# If damage value is strictly positive
if self.damage > 0
# Guard correction
if self.guarding?
self.damage /= 2
end
end
# Dispersion
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Second hit detection
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
# Set effective flag if skill is uncertain
effective |= hit < 100
end
# If hit occurs
if hit_result == true
# If physical attack has power other than 0
if skill.power != 0 and skill.atk_f > 0
# State Removed by Shock
remove_states_shock
# Set to effective flag
effective = true
end
# Substract damage from HP
last_hp = self.hp
self.hp -= self.damage
effective |= self.hp != last_hp
# State change
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# If power is 0
if skill.power == 0
# Set damage to an empty string
self.damage = ""
# If state is unchanged
unless @state_changed
# Set damage to "Miss"
self.damage = "Miss"
end
end
# If miss occurs
else
# Set damage to "Miss"
self.damage = "Miss"
end
# If not in battle
unless $game_temp.in_battle
# Set damage to nil
self.damage = nil
end
# End Method
return effective
end
#--------------------------------------------------------------------------
# * Application of Item Effects
# item : item
#--------------------------------------------------------------------------
def item_effect(item)
# Clear critical flag
self.critical = false
# If item scope is for ally with 1 or more HP, and your own HP = 0,
# or item scope is for ally with 0 HP, and your own HP = 1 or more
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
# End Method
return false
end
# Clear effective flag
effective = false
# Set effective flag if common ID is effective
effective |= item.common_event_id > 0
# Determine hit
hit_result = (rand(100) < item.hit)
# Set effective flag is skill is uncertain
effective |= item.hit < 100
# If hit occurs
if hit_result == true
# Calculate amount of recovery
recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
if recover_hp < 0
recover_hp += self.pdef * item.pdef_f / 20
recover_hp += self.mdef * item.mdef_f / 20
recover_hp = [recover_hp, 0].min
end
# Element correction
recover_hp *= elements_correct(item.element_set)
recover_hp /= 100
recover_sp *= elements_correct(item.element_set)
recover_sp /= 100
# Dispersion
if item.variance > 0 and recover_hp.abs > 0
amp = [recover_hp.abs * item.variance / 100, 1].max
recover_hp += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and recover_sp.abs > 0
amp = [recover_sp.abs * item.variance / 100, 1].max
recover_sp += rand(amp+1) + rand(amp+1) - amp
end
# If recovery code is negative
if recover_hp < 0
# Guard correction
if self.guarding?
recover_hp /= 2
end
end
# Set damage value and reverse HP recovery amount
self.damage = -recover_hp
# HP and SP recovery
last_hp = self.hp
last_sp = self.sp
self.hp += recover_hp
self.sp += recover_sp
effective |= self.hp != last_hp
effective |= self.sp != last_sp
# State change
@state_changed = false
effective |= states_plus(item.plus_state_set)
effective |= states_minus(item.minus_state_set)
# If parameter value increase is effective
if item.parameter_type > 0 and item.parameter_points != 0
# Branch by parameter
case item.parameter_type
when 1 # Max HP
@maxhp_plus += item.parameter_points
when 2 # Max SP
@maxsp_plus += item.parameter_points
when 3 # Strength
@str_plus += item.parameter_points
when 4 # Dexterity
@dex_plus += item.parameter_points
when 5 # Agility
@agi_plus += item.parameter_points
when 6 # Intelligence
@int_plus += item.parameter_points
end
# Set to effective flag
effective = true
end
# If HP recovery rate and recovery amount are 0
if item.recover_hp_rate == 0 and item.recover_hp == 0
# Set damage to empty string
self.damage = ""
# If SP recovery rate / recovery amount are 0, and parameter increase
# value is ineffective.
if item.recover_sp_rate == 0 and item.recover_sp == 0 and
(item.parameter_type == 0 or item.parameter_points == 0)
# If state is unchanged
unless @state_changed
# Set damage to "Miss"
self.damage = "Miss"
end
end
end
# If miss occurs
else
# Set damage to "Miss"
self.damage = "Miss"
end
# If not in battle
unless $game_temp.in_battle
# Set damage to nil
self.damage = nil
end
# End Method
return effective
end
#--------------------------------------------------------------------------
# * Application of Slip Damage Effects
#--------------------------------------------------------------------------
def slip_damage_effect
# Set damage
self.damage = self.maxhp / 10
# Dispersion
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# Subtract damage from HP
self.hp -= self.damage
# End Method
return true
end
#--------------------------------------------------------------------------
# * Calculating Element Correction
# element_set : element
#--------------------------------------------------------------------------
def elements_correct(element_set)
# If not an element
if element_set == []
# Return 100
return 100
end
# Return the weakest object among the elements given
# * "element_rate" method is defined by Game_Actor and Game_Enemy classes,
# which inherit from this class.
weakest = -100
for i in element_set
weakest = [weakest, self.element_rate(i)].max
end
return weakest
end
end
|
|
Posté dans Forum - [RM2k3] Distance entre deux points |
cortez -
posté le 01/12/2023 à 17:12:55. (524 messages postés) |
| Si tu pars sur une stratégie type megaman RPG (avec des choix de cible ligne et colonnes)
Tu peux enregistrer la position de chaque monstre dans un tableau et utiliser des fonctions (évènement communs) pour récupérer les slots que tu cible.
Si tu as 9 cases du donne les id des ennemis en fonction de leur position (comme sur un pad numérique) 1ère case en haut a gauche = 7 ...
7 8 9
4 5 6
1 2 3
donc var-ennemi1= 7
En fonction des ciblages des héros tu vérifies si les id 9 6 et 3 sont remplis et tu effectue les dmg sur les monstres de cette position. (tu peux aussi prioriser les id de forte/petite valeur pour cibler les ennemis les plus proches)
Avec ce système de case avec un id tu peux aussi gérer les ennemis qui ont la bougeote et qui changent de case en cours de combat.
|
Posté dans Forum - [RM2k3] Distance entre deux points |
cortez -
posté le 27/11/2023 à 21:09:20. (524 messages postés) |
| hmm ...
A moins que tu souhaites garder des cases carrées (visible ou pas), si tu utilise des cases rectangulaires (le plus grand coté parallèle avec le bas de l'écran) cela donnera un effet de perspective pour le placement des ennemis en plus de donner plus d'écart entre les mobs.
Cet écart sera suffisant pour que les joueurs voient clairement quel est l'ennemi le plus proche.
édit : si les loups occupent les 3 cases de devant ce sera dur de savoir le quel sera touché.
Il faudrait pour cela étirer la grille sur un format isométrique (ou presque)
Dans cet exemple, le loup du bas est le plus proche (d'environ 5 pixels plus proche que celui du haut) mais en augmentant un peu la distorsion de la grille on peut rendre cela plus net.
|
Posté dans Forum - [RM2k3] Distance entre deux points |
cortez -
posté le 27/11/2023 à 18:36:11. (524 messages postés) |
| Le souci c'est que sur l'écran le loup du haut est le plus proche de la fille, donc elle devrait pas taper celui du bas. (idem pour le garçon)
Je pense que le mieux serait de prendre les coordonnées écrans de chaque ennemi/héro pour effectuer les calculs (pour éviter les soucis de float multiplie chaque valeur par 10 ou 100 histoire d'avoir un chiffre suffisamment préçis)
|
Posté dans Forum - Bazar des créations ! |
cortez -
posté le 04/10/2023 à 21:00:24. (524 messages postés) |
| Super un mini-sondage
1. La loupe 1
2. La main I
3. Contour B
4. A (au dessus de l'objet)
5. Sans cadre
6. Toutes les interaction affichés en même temps (sous forme d'un cercle reprenant toutes les icones avec seulement les actives en couleur et les autres en gris/bleu comme une ombre)
Voilà c'est mon avis.
|
Posté dans Forum - Suite de nombres |
cortez -
posté le 16/08/2023 à 17:13:07. (524 messages postés) |
| Nemau a dit: Domaine concerné: maths
Hellu,
J'aurais besoin d'un site ou d'un logiciel me permettant d'obtenir la suite de nombres correspondant à ça :
(1 / 2) * 3 = a
(a / 2) * 3 = b
(b / 2) * 3 = c
(c / 2) * 3 = d
etc.
Je pourrais le faire à la main mais j'ai besoin des 300 premières valeurs donc ce serait trop long.
Merki d'avance. <3 |
Question indiscrète : Quel usage va tu faire de ces nombres ?
|
Posté dans Forum - [RPG Maker MZ] Forcer le jeu à sauvegarder sans passer par le menu/mettre un point de départ fixe |
cortez -
posté le 17/07/2023 à 20:45:05. (524 messages postés) |
| As-tu un script qui modifie l'apparence des sauvegardes ? Ou ajouté un plugin depuis peu ?
J'ai refait des test et hormis un freeze lors du chargement j'ai pas ce bug.
Edit:
Lorsque tu teste ton jeu et que tu reçoit le message d'erreur tu pourrais appuyer sur F8 puis choisir l'onglet "console" pour afficher la console ? (poste un screen des messages d'erreurs histoire que moi ou d'autres puissent trouver la source de l'erreur.)
|
Posté dans Forum - [RPG Maker MV] Objet carte |
cortez -
posté le 13/07/2023 à 21:44:58. (524 messages postés) |
| A moins d'utiliser un plugin pour afficher du texte sans utiliser la boite de dialogue tu ne pourra pas vraiment le faire simplement.
Tu peux utiliser la commande "afficher une image" pour afficher une image d'une fausse boite de texte avec ton texte dedans, mais tu va devoir créer 1 image pour chaque texte différent et si les noms des lieux et villes changent tu vas devoir refaire les images correspondantes.
Si tu opte pour la version en script il y a cet article : (en anglais)
https://forums.rpgmakerweb.com/index.php?threads/n-a-s-t-y-text-pop-over-events.49393/
|
Posté dans Forum - [RPG Maker MZ] Forcer le jeu à sauvegarder sans passer par le menu/mettre un point de départ fixe |
cortez -
posté le 04/07/2023 à 21:20:22. (524 messages postés) |
| Si tu as toujours besoin d'une sauvegarde sans menu, insère la commande suivante dans un appel script dans un évènement.
Remplace juste la valeur "id" par un chiffre pour le slot de sauvegarde.
1
| DataManager.saveGame(id) |
J'ai pas testé si l'id minimum est 0 ou 1, la valeur max devrait être 99 théoriquement. (qui aurait besoin de plus de 99 saves différentes ?)
D'ailleurs le code pour charger une sauvegarde est :
1
| DataManager.loadGame(id) |
|
Posté dans Forum - [RPG Maker MZ] Besoin d'aide pour faire apparaître un escalier secret |
cortez -
posté le 05/06/2023 à 20:53:40. (524 messages postés) |
| Ladvic a dit: Domaine concerné: graphisme ?
Logiciel utilisé: RPG Maker MZ
Bonjour,
J'aimerais faire apparaître un escalier secret en utilisant un charset d'Avery. Celui-ci :
https://forums.rpgmakerweb.com/index.php?attachments/secretdoorsaverymz-png.262744/
Je voudrais juste l'animation de l\\\'escalier de la 6ème colonne en partant de la gauche mais je n'y arrive pas.
J'ai essayé avec "Mouvement et Orientation" et le "Animation pas ON" mais ça n\\\'affiche que 2 images qui tournent en boucle.
Si quelqu'un peut m'expliquer comment ce type d'image fonctionne et comment je peux m'en servir.
Merci beaucoup pour votre aide. |
Ce que tu veux faire c'est exactement l'animation des coffres mais avec le charset des escaliers.
Tu te places sur la couche des évènements,
tu fait clic-droit "gestion rapide des évènements"
tu choisis "trésor" (tu double clique pour choisir ton charset d'escalier caché)
tu valide (met argent 0 c'est pas important)
Récupère l'animation :
Tu fais clic-droit sur l'évènement que tu viens de créer et dans les commandes celle de déplacement qui est dedans c'est celle que tu dois copier coller pour animer ton escalier caché.
Pour l'escalier qui apparait tu fais un nouvel évènement : (l'interrupteur "bidule" est activé quand le personnage active un levier ou trouve un truc qui fait apparaitre l'escalier)
Page 1 :
déclencheur : parallèle
condition : rien
apparence de sol normal (5e case de la 1ere colonne.)
direction : fixe
Passer a travers ☑
type : fixe (pas de mouvement)
priorité : sous le héros
commandes :
Condition si "interrupteur bidule" est on => active l'interrupteur local A
Page 2 :
déclencheur : automatique (histoire que le héro reste immobile pendant l'apparition)
condition : interrupteur local A
apparence de sol (En fonction du sens de l'escalier tu choisis la 1e case de la colonne 5, 6, 7 ou 8)
direction : fixe
Passer a travers ☑
type : fixe (pas de mouvement)
priorité : sous le héros
commandes :
On joue un son pour indiquer qu'un truc se passe.
Tu colles l'animation que tu avais copié.
Active l'interrupteur local B
Page 3 :
déclencheur : contact joueur
condition : interrupteur local B
apparence escalier ouvert (En fonction du sens de l'escalier tu choisis la dernière case de la colonne 5, 6, 7 ou 8)
direction : fixe
Passer a travers ☑
type : fixe (pas de mouvement)
priorité : sous le héros
commandes :
Tu téléportes le héro sur la map ou la position que tu veux.
Si tu veux comprendre un peu comment ça marche (l'animation) essaye de créer un coffre avec la création rapide d'évènements mais choisi un personnage. Tu verras mieux comment ça marche.
Et voilà
|
Posté dans Forum - [RPG Maker MV] Ennemis volant à la FFX |
cortez -
posté le 13/05/2023 à 11:42:59. (524 messages postés) |
| Tu va devoir passer par l'utilisation d'un élément "distance" pour les arcs et pistolets.
Les ennemis volants aurons une vulnérabilité à l'élément physique de 0% et à l'élément distance de 100%
Reste a trouver un plugin pour afficher une attaque ratée "miss" lorsque les dégats d'une attaque sont à 0.
J'ai trouvé un plugin pour afficher les dégats minimum à 1 (et pas 0) mais rien d'autre pour le moment.
https://github.com/Trivel/RMMV/blob/master/MrTS_MinimumDamage.js
Gratuit pour un usage commercial et non commercial.
|
Posté dans Forum - Les IA : art génératif, modèles de langage... |
cortez -
posté le 06/04/2023 à 22:52:51. (524 messages postés) |
| Sylvanor a dit: ...
Et enfin des audios à écouter au casque où on a interviewé les élèves sur la question "suis-je un artiste en utilisant une IA pour faire des images?".
Bien sûr le propos de l'expo était de laisser la question ouverte, et non de venir en proclamant que c'était de l'art ou que ça n'en était pas.
... |
Rien que cette phrase me donne envie de débattre sur ce concept.
Allez vu que ça me démange je donne mon point de vue :
Une personne qui utilise une IA pour générer une image est un artiste, l'IA n'est que l'outil, c'est l'humain qui fourni le prompt et qui juge de la qualité du résultat et s'appuie sur ses gouts esthétiques pour trier ce que l'IA propose. Cette étape de paufinage permet d'avoir une image aussi proche que possible de ce qu'il veut obtenir. (vision de l'artiste)
Pour simplifier ma pensée, il faut voir l'utilisation de l'IA comme l'utilisation d'un crayon sur du papier. On esquisse un truc on reprend son trait plusieurs fois jusqu'à obtenir ce que l'on veux représenter. La seule différence c'est que les connaissances en anatomie/proportion/perspective/théorie des couleurs/etc ne sont pas nécessaires pour obtenir une image.
|
Posté dans Forum - Screenshots de vos jeux ! |
cortez -
posté le 05/04/2023 à 22:49:16. (524 messages postés) |
| Roi of the Suisse a dit: Je trouve les rochers un peu étranges, mais j'ai du mal à dire pourquoi.
Peut-être qu'ils sont trop clairs ?
Ils ne sont pas ancrés dans le sol par une ombre ?
Enfin, ça reste toujours moins gênant que les jauges collées au plafond |
Juste pour voir j'ai bidouillé un truc avec le rocher au centre de l'image. Je pense que c'est l'ombre des éléments en 3D qui ne colle pas avec le reste des objet (le coté trop propre et flou des objet 3D fait un peu tache a coté des pixel-art du tileset.)
|
Posté dans Forum - Demandes de ressources |
cortez -
posté le 05/04/2023 à 20:59:08. (524 messages postés) |
| keblin a dit: salut, je cherche un sprite pour MV ou une animation de dalle (switch) sur la quel placer un objet
ceux des RTP font trop moderne, je cherche un modèle plutot naturel pour mon biome foret
un peu comme celui ci en gros
toutes idées sont les bienvenue
merci d'avance
|
Voici un truc fait en 30 minutes a partir de la case d'herbe par défaut et de la textures des marches en "herbes"
Character 100% libre de droit et 100% modifiable. (projet gratuit et commercial)
|
Posté dans Forum - JDR - Legends of Hyrule |
cortez -
posté le 13/03/2023 à 17:45:51. (524 messages postés) |
| Je suis très content que l'on puisse débattre sans prise de tête. D'autant plus car ma vision du JDR est portée sur un narratif fort et des règles "faibles" (en gros l'inverse de D&D)
Confronter (sans animosité) nos point de vue devrait nous faire gagner chacun des choses. (et j'adorerai que ce soit le cas)
Le coup des math j'avoue c'est pas mon truc, mais je reconnait que c'est assez bien foutu dans les stats et les objets.
L'usure + la gestion de l'endurance est assez particulier, perso j'en aurait gardé 1 des deux (l'usure comme option avancée pour les joueurs confirmés).
En lisant tes retours il y a quelques points que je n'avais pas compris ou mal interprétés lors de ma 1ere lecture des pdf.
Un truc que je fait (et qui semble marcher) c'est tout au long des explications sur les mécaniques, feuille de personnages et autre c'est d'utiliser un joueur fictif comme exemple pour illustrer les différentes parties. Si possible conserver le même joueur fictif pour que le lecteur puisse suivre la progression des connaissances au même rythme que le joueur en exemple.
Avoir vu ta présentation me donne envie de présenter mes jdr également.
|
Posté dans Forum - JDR - Legends of Hyrule |
cortez -
posté le 12/03/2023 à 21:44:14. (524 messages postés) |
| Super une présentation d'un JDR ça change j'aime bien. Par contre il y a des trucs qui vont pas...
Soucis techniques
D'abord le pdf "livret de donnée" n'a pas de sommaire fonctionnel (on peut pas cliquer pour aller sur la rubrique directement) alors que le sommaire du manuel de règle fonctionne.
Le livre de règle présente les informations dans le désordre, tu devrais présenter dans cet ordre :
1-Histoire et contexte (aucune règle, juste le lore)
2-Feuille de personnage
3-explication de chaque icones et expliquer la forme de lame avec des trous dans les savoirs
4-Explication de toutes les règles de gestion (action, jet de dés, vie, magie, niveau, ...)
5-Explications des objets et équipement/reliques.
6-Les classes/races (lore uniquement)
7-Comment créer un personnage (règles)
8-Statistiques des races/classes.
Le déroulement est guidé par le fonctionnement suivant :
Le joueur voit un jdr sur le thème de TLoZ donc il s'attend a avoir des explications sur l'univers.
Ensuite il arrive sur la feuille de personnage, il est intrigué il faut immédiatement expliquer chaque élément de cette feuille (il est important qu'il ai une idée de comment la feuille fonctionne avant même d'avoir les stats des personnages.)
Ensuite on explique comment on joue (lancé de dés, actions et systèmes de jeux)
Après on présente les personnages possibles (races et classes)
On lui indique juste après comment il peut créer son propre personnage.
Enfin on présente la grosse partie avec les statistiques et points forts de chaque peuples.
Souci d'accumulation
Le JDR est dérivé d'un jeu de société (jeu de plateau) et ça se voit.Pour un jeu ayant été créé en plusieurs années il a accumulés les couches de mécaniques et complexité au fil du temps.
Bref il a le syndrome des règles a tiroir ou règles poupées-russes. Tout est très complexe et chaque point nécessite de retourner a une autre section des règles pour pouvoir être compris.
Exemple le plus parlant :
Tu nous présente les hyliens et on voit directement une forme de lame avec des points dedans on a aucune idée de ce que c'est il faut alors aller page 65 pour trouver une explication avec deux symboles différents pour un même truc. Et pour savoir ce que fait concrètement le savoir en question il faut aller page 101 du 2e livre pour comprendre ce que fait réellement la cuisine niveau 1.
Beaucoup de changement de pages et renvois de règles pour un truc a résumer en 1 ligne : Savoir - Cuisine niv1 (Permet de préparer des plats)
Ensuite tu as raison de rassembler tous les savoir dans le livret de données mais tu dois fournir l'information au lecteur immédiatement sinon il va fatiguer a force de scroller partout dans le document et vite se décourager de lire...
Un peu trop (peut-être)
Il y a peut être aussi des systèmes superflux, l'alignement (bon mauvais loyal chaotique) alors c'est pas mon truc mais c'est pas le problème, c'est la phrase en page 53 :
L’alignement type des races n’est pas forcément l’alignement qu’un représentant de cette race aura, c’est seulement celui que sa culture tend à lui faire avoir.
Donc c'est pas obligatoire de suivre l'alignement de la race que l'on joue, alors quel est l'intérêt de fixer un alignement par races si les joueurs choisissent celui qu'il veulent ?
L'utilisation d'un système d'usure est assez particulier, j'ai pas trouvé si attaquer avec une arme lui fait perdre de la durabilité ? Du coup si le stuff est détruit régulièrement les joueurs doivent looter constamment de l'équipement pour pouvoir rester équipés correctement (pas sûr que ce soit fun)
Des mathématiques
Ensuite le gros point faible c'est le système de formule d'algèbre pour les équipement (armes) et le fonctionnement de la foudre... C'est trop compliqué pour être jouable selon moi.
Conclusion/conseils
Désolé d'être aussi direct, mais je suis sûr que c'est un bon jeu mais il fait tout pour me repousser...
Pour te guider dans tes corrections essaye l'exercice suivant, résume chaque élément du jeu/ mécanique en 5 lignes maxi (il faut que l'on comprennent uniquement avec le résumé) si ça marche pas il faut simplifier (quitte a conserver le détail dans le livret de données.)
|
Posté dans Forum - [XP ou MV] Quel RPG Maker pour une reprise ? |
cortez -
posté le 16/02/2023 à 20:44:22. (524 messages postés) |
| Nemau a dit: J'ai retrouvé le problème que j'avais rencontré sous RMXP :
Contrairement à RM 200X, on ne peut pas choisir la hauteur d'un chara par rapport au héros, on peut juste cocher une case faisant que le héros passe à travers. Et du coup, si cette case est cochée mais que le chara fait plus de 32 pixels de haut, et qu'avec notre héros on traverse ce chara de haut en bas ou de bas en haut, on va le voir passer derrière pendant une fraction de seconde :
Dans l'exemple ci-dessus, le chara sur lequel passe le héros est sur la même planche que l'objet à droite, donc pour le jeu il fait un truc du genre 32*48, même si visuellement il fait 32*32 et est pile sur un carreau de map.
Bien sûr dans cet exemple il suffit de déplacer le chara vers une planche de charas en 32*32, mais on peut imaginer un cas où le héros doit marcher sur un objet en event faisant plus de 32*32. Il reste la possibilité de créer cet objet via plusieurs charas en 32*32 chacuns, mais ça fonctionne seulement si l'objet sur lequel marche le héros est statique. S'il se déplace de manière aléatoire ça devient très compliqué à créer. |
Juste pour aider ceux qui ont des soucis avec ce "défaut" de ne pas pouvoir régler la priorité d'affichage des événements (fixes ou mobiles) j'ai trouvé ce script (il y a au moins 10ans) si ça peux aider... C'est fonctionnel pour XP et VX.
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
| #==============================================================================
# ** Event Layer Script Advanced (ELSA)
#------------------------------------------------------------------------------
# by DerVVulfman and Jay Ray
# version 1.3
# 02-24-2015
# RGSS & RGSS2 / RPGMaker XP & RPGMaker VX
#==============================================================================
#
# INTRODUCTION:
#
# More Event Layers. This script, originally titled 'Events Always Under' allowed
# for the ability to have events actually break through the floor, sitting above
# the panorama layer, but below the Tiles, still using the Tiles passability.
# As the new Event Layer Script Advanced (ELSA), we have increased the z-index to
# nine total flattened positions, allowing for more mapping options for RPG Maker
# XP and VX
#
# Three Events can go UNDEr the tiles. Now, you'll probably never need more
# than that, but this allows you to have large event floor tiles, smaller accents
# on top of them, and then maybe even smaller accents on the accents! Or use the
# layers for water effects, lava effects and more, as the events can be animated!
#
# Next, Use Mid-layer events to add embelishments on the floor, that stay under
# the player but above tiles with priority level 0. You get three so, you can add
# a nice rug or something, add some overlapping stool, and a pair of boots on that
# stool, all without having to render a parallax map
#
# Next for my own personal benefit, I created the Variations of Always Over Events
# because for me personally, if I'm creating rooftops for houses, I want to be able
# to customize them without locking myself into a specific tile layer and priority set.
# Make a Huge Windmill, and then use another event layer to add the moving arms. Put
# a tower that stands over the city, with a sperate layer for the flag or banners
# that drape from it, (animated or not). The possibilities!!! Now you can have the
# pre-rendered or hand-drawn map you want, without the massive parallax images needed
# for maps with any large size.
#
#
#
# With ELSA and this can increase your layers from the seven possible before
# (Panorama, Tile Layers (3), Event Layer, Above Event Layer, Fog)
# to a total of FIFTEEN layers
# (Panorama, Unders (3), Tile Layers (3), Mids (3), Aboves(4), and Fog)
#
#
#
#
# ------------------------------------------------------------------------------
#
# USAGE:
#
# Simply put, add one of the Event Words (Given below) to your event's name
# (EX: EV003 Under 1), or create a comment in your event's list of commands
# and have that comment be one of the words given below (again, without quotes). This
# will flag the event as an 'Always Under' or a 'Stacked Layers' or an 'Above All' event
# and place it in one of now ten layers.
#
# On personal preference, I would recommend using it within a comment as the
# event can have the 'Always Under' flag turned on/off if the event erased,
# gone from one event page to another, or the like.
#
# Event Comments and Effects
# Comment: Under 1 - Puts event below tiles (z-depth: -3)
# Comment: Under 2 - Puts event below tiles (z-depth: -2)
# Comment: Under 3 - Puts event below tiles (z-depth: -1)
# Comment: Mid 1 - Puts event above layer1 tiles (z-depth: 1)
# Comment: Mid 2 - Puts event above layer1 tiles (z-depth: 2)
# Comment: Mid 3 - Puts event above layer1 tiles (z-depth: 3)
# Comment: Over 1 - Puts event above all other events (z-depth: 985)
# Comment: Over 2 - Puts event above all other events (z-depth: 990)
# Comment: Over 3 - Puts event above all other events (z-depth: 995)
#
# Remember that the 'Always On Top' Flag can be clicked without a comment to
# make even another layer!
#==============================================================================
#
# NOTE:
#
# While one can apply a characterset graphic to an event, the 'through' flag
# in an event will not let the player step upon any such tile. So if it is
# the intention of the game/map designer for the player to walk upon such
# tiles, only use graphics from the tileset for these events. Additionally,
# setting the 'through' flag on may actively hamper movement and disable the
# passages flags. Remember that this is mainly meant as a cosmetic change.
#
#==============================================================================
#
# TERMS AND CONDITIONS:
#
# Free for use, even in commercial games. This script was originally created
# as 'Events Always Under' by DerVVulfman. I went through and buffed it up for
# more layers, other Event functions, so credit goes to DerVVulfman and JayRay
#
# (Doesn't HAVE to be in that order, just saying...)
#
# COMPATIBILITY ISSUES: THis script SHOULD work with other event changing scripts
# as long as those scripts do not change
#==============================================================================
#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# This class handles the map. It includes scrolling and passable determining
# functions. Refer to "$game_map" for the instance of this class.
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# * Alias Listings
#--------------------------------------------------------------------------
alias eventadvanced_setup setup
#--------------------------------------------------------------------------
# * Setup
# map_id : map ID
#--------------------------------------------------------------------------
def setup(map_id)
eventadvanced_setup(map_id)
for e in @events.values
next if e.nil?
e.eventadvanced1 = true if e.name =~ "Under 1"
e.eventadvanced2 = true if e.name =~ "Under 2"
e.eventadvanced3 = true if e.name =~ "Under 3"
e.eventadvanced4 = true if e.name =~ "Mid 1"
e.eventadvanced5 = true if e.name =~ "Mid 2"
e.eventadvanced6 = true if e.name =~ "Mid 3"
e.eventadvanced7 = true if e.name =~ "Over 1"
e.eventadvanced8 = true if e.name =~ "Over 2"
e.eventadvanced9 = true if e.name =~ "Over 3"
image_flag = false
if RUBY_VERSION.slice(0,3) == "1.6"
image_flag = true if e.character_name != ""
else
image_flag = true if e.character_name != "" or e.tile_id != 0
end
unless image_flag == false or e.list.nil?
for i in 0...e.list.size
next if e.list[i].code != 108
e.eventadvanced1 = true if e.list[i].parameters[0] =~ "Under 1"
e.eventadvanced2 = true if e.list[i].parameters[0] =~ "Under 2"
e.eventadvanced3 = true if e.list[i].parameters[0] =~ "Under 3"
e.eventadvanced4 = true if e.list[i].parameters[0] =~ "Mid 1"
e.eventadvanced5 = true if e.list[i].parameters[0] =~ "Mid 2"
e.eventadvanced6 = true if e.list[i].parameters[0] =~ "Mid 3"
e.eventadvanced7 = true if e.list[i].parameters[0] =~ "Over 1"
e.eventadvanced8 = true if e.list[i].parameters[0] =~ "Over 2"
e.eventadvanced9 = true if e.list[i].parameters[0] =~ "Over 3"
end
end
end
end
end
#==============================================================================
# ** Game_Character
#------------------------------------------------------------------------------
# This class deals with characters. It's used as a superclass for the
# Game_Player and Game_Event classes.
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :eventadvanced1 # Event Advanced UnderLayer 1
attr_accessor :eventadvanced2 # Event Advanced UnderLayer 2
attr_accessor :eventadvanced3 # Event Advanced UnderLayer 3
attr_accessor :eventadvanced4 # Event Advanced MiddleLayer 1
attr_accessor :eventadvanced5 # Event Advanced MiddleLayer 2
attr_accessor :eventadvanced6 # Event Advanced MiddleLayer 3
attr_accessor :eventadvanced7 # Event Advanced OverLayer 1
attr_accessor :eventadvanced8 # Event Advanced OverLayer 2
attr_accessor :eventadvanced9 # Event Advanced OverLayer 3
#--------------------------------------------------------------------------
# * Alias Listings
#--------------------------------------------------------------------------
alias eventadvanced_initialize initialize
alias eventadvanced_screen_z screen_z
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
eventadvanced_initialize
@eventadvanced1 = false
@eventadvanced2 = false
@eventadvanced3 = false
@eventadvanced4 = false
@eventadvanced5 = false
@eventadvanced6 = false
@eventadvanced7 = false
@eventadvanced8 = false
@eventadvanced9 = false
end
#--------------------------------------------------------------------------
# * Get Screen Z-Coordinates
# height : character height
#--------------------------------------------------------------------------
def screen_z(height = 0)
return -4 if @eventadvanced1
return -3 if @eventadvanced2
return -2 if @eventadvanced3
return 1 if @eventadvanced4
return 2 if @eventadvanced5
return 3 if @eventadvanced6
return 980 if @eventadvanced7
return 985 if @eventadvanced8
return 990 if @eventadvanced9
if RUBY_VERSION.slice(0,3) == "1.6"
return eventadvanced_screen_z(height)
else
return eventadvanced_screen_z
end
end
end
#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
# This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# * Get Event Name
#--------------------------------------------------------------------------
def name
return @event.name
end
end |
|
Posté dans Forum - Topic des bribes de projets |
cortez -
posté le 09/02/2023 à 18:24:15. (524 messages postés) |
| Créacoda a dit: Beaucoup de choses à méditer, Sylvanor. Je pense que c'est une réponse qui sera utile à plusieurs.
En attendant, j'ai commencé à élaborer un concept de map. C'est soit un bunker, soit dans l'espace, alors j'ai encore de jeu pour déterminer l'endroit où se passe le jeu.
En haut à droite, c'est supposé être un logo corporatif. Présentement, ça fait un peu décoration pour enfant alors faudrait repenser le concept.
|
Je voulais réagir a ton logo, le plus simple serait de le dessiner comme un grafitti au pochoir (quitte a positionner des coulures et des débordement du pochoir) mais c'est un peu petit et on risque de ne pas bien voir. Soit pencher du coté minimaliste avec 1 seule couleur et styliser les formes pour que l'on comprenne que ce n'est pas un dessin au mur, mais un logo officiel.
A voir si tu veux mais il est aussi possible d'ajouter une plaque/panneau en dessous du logo (dans la vraie vie les logos sont sur des plaques ou des affiches)
|
Posté dans Forum - [RMXP] Un ARRAY au lieu de 30 variables, c'est possible ? |
cortez -
posté le 06/02/2023 à 21:05:03. (524 messages postés) |
| Votre échange a débloqué un truc dans mon cerveau.
C'est génial de pouvoir saisir un array dans une variable (en plus il ne semble pas y avoir de limite)
Voici ce que j'ai testé avec des commandes évènement "appel script"
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# array de 5 valeurs
$game_variables[45]= [33,1,2,100,57]
# affiche la valeur du premier membre de l'array
print $game_variables[45][0]
# ajoute un membre après la dernière position ayant la valeur 5
$game_variables[45].push(5)
# affiche le nombre de menbre que contient l'array.
print $game_variables[45].length
|
Pour avoir un aperçu de tout ce qu'il est possible de faire essaye ce lien (en anglais)
https://ruby-doc.org/core-2.7.0/Array.html
|
Posté dans Forum - [RPG Maker VX Ace] Infliger des dégats de statuts fixes |
cortez -
posté le 19/01/2023 à 17:19:08. (524 messages postés) |
| Bon j'ai pas réussi en 3h...
Le plus gros problème c'est que le script Tankentai VX Ace est très mal écrit.
C'est dur de trouver les infos. (et a mon niveau s'est déjà pas facile de base.)
Je laisse les autres tenter leur chance...
|
Posté dans Forum - [RPG Maker VX Ace] Infliger des dégats de statuts fixes |
cortez -
posté le 18/01/2023 à 18:35:52. (524 messages postés) |
| Voilà j'ai trouvé un contournement :
Il y a des restrictions cependant.
Le script est prévu pour avoir 4 personnages (tu peux en avoir plus je t'explique après) dans la base de donnée qui ont la capacité d'avoir des sorts de poison (ou des armes empoisonnées)
Cela suppose que tu ais 4 statuts de poison différent (1 attribué aux compétences propres a chaque personnage.
Astuce : Si 2 personnages ne peuvent pas être en même temps dans l'équipe (lié à l'histoire) ces 2 personnages peuvent avoir le même numéro de poison. (il ne faut pas qu'ils soient en même temps dans l'équipe)
Exemple : Basil est un personnage qui peux empoisonner l'ennemi il a donc le statut poison_1 réservé pour lui.
Si je décide que Alice dispose d'un sort de poison, elle sera le 2e personnage du jeu a avoir du poison, elle utilisera le statut poison_2
Attention aux objets et aux sort de bien attribuer le bon statut.
Les statuts aurons le texte suivant dans la boite "note"
Pour "poison_1" qui utilise l'attaque du lanceur pour infliger des dégats de poison (10% de l'attaque du lanceur en dommage sur la cible chaque tour.)
<apply effect: ATK store_1 10%>
<close effect: poison_1 >
Je stocke les valeurs des personnages au moment ou le statut poison est appliqué a la cible dans des variables (201 à 204)
Si tu as besoin de plus de 4 personnages different pouvant infliger du poison, il te suffit d'ajouter 2 status (copie colle les ligne de script des status 15 et 16 en changeant les valeurs
STORE_5 pour le 5e personnage
1
| when /(.*)[ ]STORE_4[ ](\d+)([%%])/i |
variable 205 pour le 5e personnage
1
| $game_variables[204]=(dmg * $2.to_i * 0.01).to_i |
POISON_5 pour le 5e personnage
variable 205 pour le 5e personnage
1
| dmg = $game_variables[204] |
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
| #==============================================================================
#
# ▼ Yanfly Engine Ace - Lunatic States Package - Punishment v1.01
# -- Last Updated: 2011.12.15
# -- Level: Lunatic
# -- Requires: YEA - Lunatic States v1.00+
#
#==============================================================================
$imported = {} if $imported.nil?
$imported["YEA-LSP-Punishment"] = true
#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2011.12.31 - Bug Fixed: Error with battle popups not showing.
# 2011.12.15 - Started Script and Finished.
#
#==============================================================================
# ▼ Introduction
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# This is a script for Lunatic States Package Effects with punishment themed
# effects. Included in it are effects that make battlers undead (take damage
# whenever they are healed), make battlers whenever they execute physical or
# magical attacks, make battlers take damage based on the original caster of
# the state's stats, and an effect that heals the original caster of the state
# whenever the battler takes HP or MP damage.
#
#==============================================================================
# ▼ Instructions
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# To install this script, open up your script editor and copy/paste this script
# to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
#
# Install this script under YEA - Lunatic States. Then, proceed to use the
# proper effects notetags to apply the proper LSP Punishment item desired.
# Look within the script for more instructions on how to use each effect.
#
#==============================================================================
# ▼ Compatibility
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
# it will run with RPG Maker VX without adjusting.
#
# This script requires YEA - Lunatic States v1.00+ to work. It must be placed
# under YEA - Lunatic States v1.00+ in the script listing.
#
#==============================================================================
if $imported["YEA-LunaticStates"]
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● Lunatic States Package Effects - Punishment
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# These effects are centered around the theme of punishment. These effects
# punish users for doing various aspects that may benefit them by harming
# them in different ways.
#--------------------------------------------------------------------------
alias lunatic_state_extension_lsp1 lunatic_state_extension
def lunatic_state_extension(effect, state, user, state_origin, log_window)
case effect.upcase
#----------------------------------------------------------------------
# Punish Effect No.1: Undead HP
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with react effect. This causes any HP healing done to become
# reversed and deal HP damage to the healed target.
#
# Recommended notetag:
# <react effect: undead hp>
#----------------------------------------------------------------------
when /UNDEAD HP/i
return unless @result.hp_damage < 0
@result.hp_damage *= -1
@result.hp_drain *= -1
#----------------------------------------------------------------------
# Punish Effect No.2: Undead MP
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with react effect. This causes any MP healing done to become
# reversed and deal MP damage to the healed target.
#
# Recommended notetag:
# <react effect: undead mp>
#----------------------------------------------------------------------
when /UNDEAD MP/i
return unless @result.mp_damage < 0
@result.mp_damage *= -1
@result.mp_drain *= -1
#----------------------------------------------------------------------
# Punish Effect No.3: Physical Backfire
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with while effect. Whenever the affected battler uses a
# physical attack, that battler will take HP damage equal to its own
# stats after finishing the current action. Battler cannot die from
# this effect.
#
# Recommended notetag:
# <while effect: physical backfire stat x%>
#
# Replace "stat" with MAXHP, MAXMP, ATK, DEF, MAT, MDF, AGI, or LUK.
# Replace x with the stat multiplier to affect damage dealt.
#----------------------------------------------------------------------
when /PHYSICAL BACKFIRE[ ](.*)[ ](\d+)([%%])/i
return if user.current_action.nil?
return unless user.current_action.item.physical?
case $1.upcase
when "MAXHP"; dmg = user.mhp
when "MAXMP"; dmg = user.mmp
when "ATK"; dmg = user.atk
when "DEF"; dmg = user.def
when "MAT"; dmg = user.mat
when "MDF"; dmg = user.mdf
when "AGI"; dmg = user.agi
when "LUK"; dmg = user.luk
else; return
end
dmg = (dmg * $2.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "HP_DMG")
end
user.perform_damage_effect
user.hp = [user.hp - dmg, 1].max
#----------------------------------------------------------------------
# Punish Effect No.4: Magical Backfire
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with while effect. Whenever the affected battler uses a
# magical attack, that battler will take HP damage equal to its own
# stats after finishing the current action. Battler cannot die from
# this effect.
#
# Recommended notetag:
# <while effect: magical backfire stat x%>
#
# Replace "stat" with MAXHP, MAXMP, ATK, DEF, MAT, MDF, AGI, or LUK.
# Replace x with the stat multiplier to affect damage dealt.
#----------------------------------------------------------------------
when /MAGICAL BACKFIRE[ ](.*)[ ](\d+)([%%])/i
return if user.current_action.nil?
return unless user.current_action.item.magical?
case $1.upcase
when "MAXHP"; dmg = user.mhp
when "MAXMP"; dmg = user.mmp
when "ATK"; dmg = user.atk
when "DEF"; dmg = user.def
when "MAT"; dmg = user.mat
when "MDF"; dmg = user.mdf
when "AGI"; dmg = user.agi
when "LUK"; dmg = user.luk
else; return
end
dmg = (dmg * $2.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "HP_DMG")
end
user.perform_damage_effect
user.hp = [user.hp - dmg, 1].max
#----------------------------------------------------------------------
# Punish Effect No.5: Stat Slip Damage
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with close effect. At the end of the turn, the affected
# battler will take HP slip damage based on the stat of the of one who
# casted the status effect onto the battler. Battler cannot die from
# this effect.
#
# Recommended notetag:
# <close effect: stat slip damage x%>
#
# Replace "stat" with MAXHP, MAXMP, ATK, DEF, MAT, MDF, AGI, or LUK.
# Replace x with the stat multiplier to affect damage dealt.
#----------------------------------------------------------------------
when /(.*)[ ]SLIP DAMAGE[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
dmg = (dmg * $2.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "HP_DMG")
end
user.perform_damage_effect
user.hp = [user.hp - dmg, 1].max
#----------------------------------------------------------------------
# Punish Effect No.6: Stat Slip Heal
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with close effect. At the end of the turn, the affected
# battler will heal HP based on the stat of the of one who casted the
# status effect onto the battler.
#
# Recommended notetag:
# <close effect: stat slip heal x%>
#
# Replace "stat" with MAXHP, MAXMP, ATK, DEF, MAT, MDF, AGI, or LUK.
# Replace x with the stat multiplier to affect damage dealt.
#----------------------------------------------------------------------
when /(.*)[ ]SLIP HEAL[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
dmg = (dmg * $2.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_heal], dmg.group)
user.create_popup(text, "HP_HEAL")
end
user.perform_damage_effect
user.hp += dmg
#----------------------------------------------------------------------
# Punish Effect No.7: Drain HP
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with shock effect. Whenever user takes HP damage, the
# original caster of the state will heal HP based on HP damage dealt.
#
# Recommended notetag:
# <shock effect: drain hp x%>
#----------------------------------------------------------------------
when /DRAIN HP[ ](\d+)([%%])/i
return unless @result.hp_damage > 0
dmg = (@result.hp_damage * $1.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
Sound.play_recovery
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_heal], dmg.group)
user.create_popup(text, "HP_HEAL")
end
state_origin.hp += dmg
#----------------------------------------------------------------------
# Punish Effect No.8: Drain MP
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Best used with shock effect. Whenever user takes MP damage, the
# original caster of the state will heal MP based on MP damage dealt.
#
# Recommended notetag:
# <shock effect: drain mp x%>
#----------------------------------------------------------------------
when /DRAIN MP[ ](\d+)([%%])/i
return unless @result.mp_damage > 0
dmg = (@result.mp_damage * $1.to_i * 0.01).to_i
if $imported["YEA-BattleEngine"] && dmg > 0
Sound.play_recovery
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:mp_heal], dmg.group)
user.create_popup(text, "MP_HEAL")
end
state_origin.mp += dmg
#----------------------------------------------------------------------
# Punish Effect No.9: Conservation de la stat du personnage 1 ayant lancé
# le statut
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <apply effect: stat store_1 x%>
# Remplace "stat" par l'une des valeurs : MAXHP,MAXMP,ATK,...,LUK
#----------------------------------------------------------------------
when /(.*)[ ]STORE_1[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
$game_variables[201]=(dmg * $2.to_i * 0.01).to_i
#----------------------------------------------------------------------
# Punish Effect No.10: Applique les dégats en fonction de la variable stockée
# par l'effet 9 (personnage 1)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <close effect: poison_1 >
#----------------------------------------------------------------------
when /POISON_1/i
dmg = $game_variables[201]
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "POISON")
end
user.perform_damage_effect
user.hp -= dmg
#----------------------------------------------------------------------
# Punish Effect No.11: Conservation de la stat du personnage 2 ayant lancé
# le statut
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <apply effect: stat store_2 x%>
# Remplace "stat" par l'une des valeurs : MAXHP,MAXMP,ATK,...,LUK
#----------------------------------------------------------------------
when /(.*)[ ]STORE_2[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
$game_variables[202]=(dmg * $2.to_i * 0.01).to_i
#----------------------------------------------------------------------
# Punish Effect No.12: Applique les dégats en fonction de la variable stockée
# par l'effet 11 (personnage 2)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <close effect: poison_2 >
#----------------------------------------------------------------------
when /POISON_2/i
dmg = $game_variables[202]
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "POISON")
end
user.perform_damage_effect
user.hp -= dmg
#----------------------------------------------------------------------
# Punish Effect No.13: Conservation de la stat du personnage 3 ayant lancé
# le statut
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <apply effect: stat store_3 x%>
# Remplace "stat" par l'une des valeurs : MAXHP,MAXMP,ATK,...,LUK
#----------------------------------------------------------------------
when /(.*)[ ]STORE_3[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
$game_variables[203]=(dmg * $2.to_i * 0.01).to_i
#----------------------------------------------------------------------
# Punish Effect No.14: Applique les dégats en fonction de la variable stockée
# par l'effet 13 (personnage 3)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <close effect: poison_3 >
#----------------------------------------------------------------------
when /POISON_3/i
dmg = $game_variables[203]
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "POISON")
end
user.perform_damage_effect
user.hp -= dmg
#----------------------------------------------------------------------
# Punish Effect No.15: Conservation de la stat du personnage 4 ayant lancé
# le statut
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <apply effect: stat store_4 x%>
# Remplace "stat" par l'une des valeurs : MAXHP,MAXMP,ATK,...,LUK
#----------------------------------------------------------------------
when /(.*)[ ]STORE_4[ ](\d+)([%%])/i
case $1.upcase
when "MAXHP"; dmg = state_origin.mhp
when "MAXMP"; dmg = state_origin.mmp
when "ATK"; dmg = state_origin.atk
when "DEF"; dmg = state_origin.def
when "MAT"; dmg = state_origin.mat
when "MDF"; dmg = state_origin.mdf
when "AGI"; dmg = state_origin.agi
when "LUK"; dmg = state_origin.luk
else; return
end
$game_variables[204]=(dmg * $2.to_i * 0.01).to_i
#----------------------------------------------------------------------
# Punish Effect No.16: Applique les dégats en fonction de la variable stockée
# par l'effet 15 (personnage 4)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Recommended notetag:
# <close effect: poison_4 >
#----------------------------------------------------------------------
when /POISON_4/i
dmg = $game_variables[204]
if $imported["YEA-BattleEngine"] && dmg > 0
text = sprintf(YEA::BATTLE::POPUP_SETTINGS[:hp_dmg], dmg.group)
user.create_popup(text, "POISON")
end
user.perform_damage_effect
user.hp -= dmg
#----------------------------------------------------------------------
# Stop editting past this point.
#----------------------------------------------------------------------
else
so = state_origin
lw = log_window
lunatic_state_extension_lsp1(effect, state, user, so, lw)
end
end
end # Game_BattlerBase
end # $imported["YEA-LunaticStates"]
#==============================================================================
#
# ▼ End of File
#
#============================================================================== |
|
Posté dans Forum - [RECRUTEMENT] - Recherche graphiste/Pixel-Artiste (Rémunéré) |
cortez -
posté le 18/01/2023 à 17:11:09. (524 messages postés) |
| Je m'en sort pas trop mal en animation de magie (il faut que je teste avec des couleurs indéxés) (par contre je ne parle pas des poses du personnage mais des effets a l'écran).
Je veux bien aider bénévolement (car je suis pas régulier et possible que ça te plaise pas/colle pas avec ton style de jeu).
|
Posté dans Forum - [rpg maker mv] Vie monstre avec variable |
cortez -
posté le 12/12/2022 à 01:17:19. (524 messages postés) |
| Soustraire la valeur -5 revient à effectuer +5
Essaye de sélectionner soustraire et met juste le chiffre 5
Pense aussi à changer ta condition de mort en si vie inférieur ou égale à 0 (au cas ou une attaque met le monstre en valeur négative)
|
Posté dans Forum - Animalisme |
cortez -
posté le 09/12/2022 à 22:10:40. (524 messages postés) |
| (je me jette dans le débat sans préparation, mais avec un cerveau fonctionnel, on sais jamais)
Le problème de l'utilitarisme c'est qu'il n'y a pas de "bonne réponse" ou de modèle infaillible pour dénouer toutes les situations et tous les dilemmes.
Chacun dispose de sa vision de la réalité et l’interprète en fonction de son vécu ce qui constitue un prisme déformant la réalité objective. (réalité numérique et quantifiable, sans aucun parti-pris ou préjugé)
La réalité telle que je la vis (perçois) m'est propre et chacun a la sienne. Il y a évidement des points communs entre chacune de nos ressentis propres mais personne n'expérimente la réalité exactement comme moi (ou vous). Ce sont les points communs qui nous rapprochent et les différences de perception qui nous sépare (parfois au point d'exprimer l'aversion/haine/...)
Pour apporter de l'eau au débat :
Un très (trop?) célèbre dilemme appelé "Trolley dilemma" expose la situation suivante :
un train/métro hors de contrôle se situe avant une bifurcation des rails. Si l'on ne fait rien l'aiguillage conduira le train/métro à écraser 5 personnes. L'autre voie conduira le train/métro a écraser 1 personne. Vous vous trouvez juste a coté du levier permettant de changer l'aiguillage et avez connaissances des informations que je viens de donner. Que faites-vous ?
A ce problème, il n'existe pas de solution utilitariste qui ne pose pas de problème si on l'analyse sur un autre angle. (l'utilitarisme vs les autres modèles de pensée/décision)
|
Posté dans Forum - Cherche système de mappemonde pour RPG Maker MZ |
cortez -
posté le 04/12/2022 à 12:29:14. (524 messages postés) |
| C'est exactement ce que j'ai imaginé pour concevoir ce système de mappemonde.
Sauf que j'organise la position du joueur dans une variable comme ceci :
1026
Le premier chiffre c'est pour le monde (si il est sur la world map principale ou alors sur une autre (ex 2 pour la lune, 3 sous les océans ... attention de ne pas utiliser le chiffre 0) c'est aussi le niveau de zoom minimum car on affiche la map complète.
Le 2e chiffre c'est le numéro du continent (de 0 à 9 donc maxi 10 continent par world map, dans le monde réel c'est suffisant ) C'est aussi le premier niveau de zoom pour savoir ou zoomer (on doit définir a l'avance les coordonnées de déplacement en x et y de la grande map pour centrer le continent a l'écran et zoomer dedans)
Le 3e c'est le numéro de la région du continent (encore de 0 à 9) chaque continent peux avoir 10 régions donc 100 régions par mappemonde. C'est aussi le 2e niveau de zoom, là encore on défini a l'avance selon la région du joueur les coordonnées pour centrer l'affichage de la région sur l'écran et zoomer dessus.
Le 4e chiffre c'est le numéro de la zone de la région du continent (encore de 0 à 9) chaque région contient maximum 10 zones pour un total par monde de 1000 zones (RPG maker est limité à 999 maps donc c'est suffisant). C'est le 3e zoom (maximum) possible on utilise encore une fois des coordonnées pour déplacer la map et center la zone sur l'écran et zoomer.
Pour la construction de la mappemonde. Le plus simple c'est de commencer par le niveau de "zoom" maximum (ce sera aussi la map la plus grande). Pour cela tu dézoome les maps dans l'éditeur de map de RPG maker afin de les afficher en entier sur l'écran (garde le même niveau de zoom dans l'éditeur pour éviter des abérations de proportion sur la map complète).
Tu fait une capture d'écran et dans un logiciel de dessin qui gère les calques tu "redessine" sur un calque par dessus la capture, les contours des montagnes, arbres, eau, ...
Tu définis les couleurs pour chaque type d'élément (ou alors différentes teinte sépia pour une carte "à l'ancienne".
Tu assembles chaque map du jeu sur l'image en les plaçant dans les bonnes zones/régions/continents. Pense a ajouter les noms de lieux et les points de tous les endroits sélectionnables (pour se téléporter)
Une fois les map assemblées, ajoute un calque pour numéroter les continents (0 à 9) et chacune des régions (0 à 9) et chaque zone (0 à 9) Conseil :Place le contient 0 le plus a gauche de la map, puis la région 0 la plus a gauche du contient 0, et la zone 0 la plus a gauche de la région 0. Plus tard pour effectuer une sélection par le joueur du contient/région/zone on utilisera les flèches gauche et droite qui ajouterons ou diminuerons une variable entre 0 et 9 (gauche ira vers 0 et droite vers 9 avec une condition si variable >9 alors variable =0 et pareil dans l'autre sens)
Ensuite il faut, dans l'outil de dessin rester en zoom 100% (1 pixel = 1 pixel de l'écran) ajouter un calque avec un rectangle de la taille de l'écran de jeu de ton RPG maker que tu déplace afin de le positionner sur la première zone que tu va ajouter (conseil :commence par le continent/région/zone 0/0/0 histoire de ne rien oublier) une fois que la zone est entièrement recouverte du rectangle note les coordonées du pixel haut/gauche du rectangle. (et en déduire la position du pixel central du rectangle)
exemple : zone 000 (centre du rectangle d'affichage)
x =120
y =520
pour simplifier les calculs sur RPG maker tu peux déjà calculer
(largeur en pixel de la map complète) / 2
et
(longueur en pixel de la map complète) / 2
pour obtenir le centre de l'image de ta map.
Ensuite (centre map X - centre affichage X = offsetX ) pour positionner la map sur le centre de l'écran dans le logiciel RPG maker
Si la zone comporte des points de TP note leur position par rapport au rectangle qui représente l'écran. On pourra afficher une image sur la position si le TP est débloqué ou non
Tu note chaque zone de 000 à 999 (mais je pense que tu en auras moins) et les coordonées "offsetX et Y" pour pouvoir positionner la map sur l'écran.
Ensuite tu sauvegarde la map taille 100% et sur une copie du applique un redimentionnement pour que la taille d'une région rentre dans un rectangle représentant l'écran de jeu. Pense bien a noter le redimentionnement que tu utilise ce sera notre zoom de niveau 2, (celui de niveau 3 c'est 100%)
Selon tes goûts tu peux re-dessiner les contours des zones pour lisser un peu, re-dessiner les rivières pour qu'elles gardent une largeur fixe. Si tu avais placé des noms de lieux et de villes sur la map taille 100% il faut que tu retire les noms de lieux trop petits pour être lus et re-dessiner les points représentants les lieux sélectionnables. (Un peu comme google map, si tu dézoome les petites rues et leurs nom disparaissent)
Si tu ne souhaite pas re-dessiner la map il te reste a effectuer la même manipulation que les zones mais pour les régions de 00 à 99 (toujours avec le rectangle qui représente l'écran du jeu)
région 00 :
offsetX = 657
offestY = 695
Et noter les coordonnées des point de TP de la région. Les grandes villes uniquement, pas question d'avoir une map remplie de marqueur de TP.
Tu sauvegarde ta map redimentionnée uniquement si tu l'a re-dessinée)
Ensuite tu passe aux "dézoom" pour les continent et les coordonées offset le redimentionnement et TP (de 0 à 9) et le dézoom final pour la mappemonde entière.
Comment fonctionne la map en jeu ?
Le joueur affiche la map locale (niveau de zoom 100% = niveau de zoom zones) lorsqu'il presse un touche ou lorsqu'il utilise un objet "carte" dans son inventaire.
Le joueur affiche la map complète (niveau de zoom ??% = niveau de zoom monde) lorsqu'il interagit dans le jeu avec une map sur un mur ou sur une table.
Dans la carte les touches gauche et droite servent a déplacer le curseur de point de TP en point TP (qu'ils soit actif ou pas) la touche haut sert a dézoomer (zone > région > contient > monde) et bas sert a zoomer (donc l'inverse)
Esc sert a quitter la carte et Entrée sert a valider la téléportation (si le point actuellement sélectionné est actif)
Par contre pour pouvoir utiliser la touche bas pour zoomer sur la région/zone sélectionnée il faut impérativement que la région et la zone aient 1 TP chacune. Car c'est le fait de sélectionner un point TP sur la map qui permet de savoir quelle région/zone afficher lorsque l'on zoome.
Donc dans les évènement commun :
D'abord les évènement d'affichage d'image et d'enregistrement de variable.
Il en faut 1 pour la mappemonde en "appel uniquement" (affiche le monde entier dézoomé sur l'écran) et chaque point de TP des capitales ou lieux important
Exemple : Spoiler (cliquez pour afficher)
Tu fait une suite de commandes variable
(on vide toutes les variables TP0x à TP9x et TP0y à TP9y)
TPMAX= nombre réel de TP a afficher.
TP0x=position x sur l'écran du TP du continent 0 (le plus a gauche)
TP0y=position y sur l'écran du TP du continent 0 (le plus a gauche)
...
Ensuite on affiche la mappemonde (image 1) au centre de l'écran par ses coordonnées du centre de l'image. (c'est important puisque toutes les coordonnées offsetX et Y que l'on a écrite dans un document pour chaque zone utilisent comme base le centre du rectangle représentant l'écran).
Si tu as re-dessinée chaque image pour chaque niveau de zoom, tu va pouvoir utiliser l'image n°2 pour effectuer une transition avec un effet de zoom et de transparence pour passer de d'un niveau a l'autre de zoom. (sinon l'image 2 ne servira pas)
Tu affiche chaque icones de TP avec les coordonnées TP1x TP1y ... en utilisant les images 4, 5, 6 ... Une petite condition sur un interrupteur pour savoir si le TP est actif ou pas. (tu réserves un interrupteur par TP, ON=actif OFF=inactif, sache que RPGmaker autorise 9999 interrupteurs donc utilise les interrupteur 1000 a 1999 pour les 1000 zones possibles de ton jeu.) Chaque zone comporte maximum 1 TP ce qui pourrait te donner un grand nombre de TP, par contre sache qu'avec la numérotation que l'on a utilisé pour les zones, si le joueur est sur la map associée à la zone du monde 1357 c'est aussi le numéro d'interrupteur correspondant au TP de la zone 1357.
Mais bon vu que l'on affiche actuellement les TP du monde on devrait avoir a l'écran les 10 TP (un par continent) donc les interrupteurs 1000 1100 1200 1300 1400 ... 1900 a vérifier donc maxi 10 conditions. Et donc 10 images représentant les TP.
1 évènement commun pour les continents "appel uniquement" :
Même chose pour l'affichage d'un continent et les 10 TP maxi (1 par région).
Vu qu'il y a 10 continent on fait 10 conditions pour vérifier quel continent a été sélectionné (Variable choix) par le joueur sur le zoom précédent. (c'est différent de la position réelle du joueur stockée sous la forme 1???)
Si le joueur sur la mappemonde à fait "bas" le TP du continent 0 on utilise le offsetX et Y du continent 0 on déplace la mappemonde (échelle 100%) et on zoome dessus selon le redimentionnement noté dans la partie continent.
Chacune des 10 conditions possède sa propre série de 10 coordonnées pour les points de TP du continent affichés (toujours 1 par région).
(on vide toutes les variables TP0x à TP9x et TP0y à TP9y)
TPMAX= nombre réel de TP a afficher.
TP0x=position x sur l'écran du TP le plus a gauche
TP0y=position y sur l'écran du TP le plus a gauche
Ensuite on affiche les 10 TP du continent. En vérifiant les 10 interrupteurs (si le continent 0 est choisi on vérifie les interrupteurs 1000 1010 1020 1030 ... 1090)
1 évènement commun pour les régions
Attention pour les régions on a les 10 conditions des continents avec chacune 10 conditions pour les régions.
Tout pareil que pour les continents mais on vérifie les interrupteurs ???1 ???2 ???3 ???4 ... ???9.
1 évènement commun pour les zones
Attention pour les Zones on a les 10 conditions des continents avec chacune 10 conditions pour les régions qui ont chacune les 10 conditions de zones en fonction de la Variable choix. (oui c'est un peu lourd)
Au choix, on affiche juste la mappemonde 100% avec l'unique TP dessus pour que le joueur puisse le sélectionner et revenir a un point intérêt.
Soit on affiche aussi la tête du joueur en position relative en pixel par rapport au cases de la map ou il se trouve.
Dans ce cas on devra aussi afficher la tête du joueur sur les autres niveau de dézoom mais c'est ultra simple puisqu'on connait sa position (si 1357 alors on affichera sa tête sur les points de TP Continent 3, Région 5 et zone 7 sur les différent niveaux de zoom)
Il en faut 1 pour la sélection des points et le déplacement dans les différents niveaux de zoom.
Cet évènement est en processus automatique (pour verrouiller le joueurs vu que l'on utilise les flèches) activé uniquement par un interrupteur "sélection" qui est activé à la fin de chaque évènement commun qui affiche les niveau de zoom.
Rappel : TPMAX correspond au nombre de TP affichés à l'écran, il est mis à jour a chaque affichage de niveau de map. Par défaut le choix commence sur 0 et lorsque le joueur quitte la mappemonde et la ré-affiche le choix par défaut est le dernier choix effectué. J'ai un peu optimisé le code en évitant d'afficher une image toutes les 2 frames voir ligne en jaune.
Si variable choix = 0
alors variable choix = 1000 (on construit la variable choix sur 4 chiffres comme la variable position réele du joueur)
afficher image 3 en position -50 -50 (hors de l'écran)
Placer l'étiquette DEBUT
Si Esc est préssée : allez a l'étiquette FIN.
Si gauche est préssée ET
Si Variable choixTP <0
alors Variable choixTP = TPMAX ET allez a l'étiquette UPDATE
sinon
Variable choix -1 ET allez a l'étiquette UPDATE
Si droite est préssée ET
Si Variable choixTP >TPMAX
alors Variable choixTP = 0 ET allez a l'étiquette UPDATE
sinon
Variable choix +1 ET allez a l'étiquette UPDATE
Si haut est préssée ET
Si Variable niveau de zoom = 1
alors Variable niveau de zoom = 1 ET allez a l'étiquette UPDATE
sinon
Variable niveau de zoom -1 ET allez a l'étiquette ZOOM -
Si bas est préssée ET
Si Variable niveau de zoom = 4
alors Variable niveau de zoom = 4 ET allez a l'étiquette UPDATE
sinon
Variable niveau de zoom +1 ET allez a l'étiquette ZOOM +
Placer l'étiquette UPDATE
10 conditions si Variable choix = 0 à 9 alors déplacer image 3 en position TP0x/TP0y à TP9x/TP9y
attendre 2 frames (pour éviter le clignotement de l'image 3 si les joueurs spamment les touches.)
Allez à l'étiquette DEBUT
Placer l'étiquette ZOOM -
3 conditions si Variable niveau de zoom = 1 à 3 on appelle l'évènement commun d'affichage correspondant au niveau de zoom choisi. Il faut penser aussi a reconstruire la valeur des centaines/dizaines en fonction de la valeur choixTP pour définir la bonne adresse lorsque l'on dézoom. théoriquement si on dézoom c'est que la Variable choix contient déjà des valeurs pour les centaines et dizaines.
attendre 10 frames (si vous avez une transition d'effet de zoom ou transparence a jouer avec l'image n°2 il faut attendre plus que 10 frames)
Allez à l'étiquette DEBUT
Placer l'étiquette ZOOM +
3 conditions si Variable niveau de zoom = 2 à 4 on appelle l'évènement commun d'affichage correspondant au niveau de zoom choisi. Il faut penser aussi a reconstruire la valeur des centaines/unités/dizaines en fonction de la valeur choixTP pour définir la bonne adresse lorsque l'on zoom.
attendre 10 frames (si vous avez une transition d'effet de zoom ou transparence a jouer avec l'image n°2 il faut attendre plus que 10 frames)
Allez à l'étiquette DEBUT
Placer l'étiquette FIN
Effacer image 1 à 13. (les images 4 à 13 servent pour les point de TP)
Interrupteur "sélection" OFF
Avec tout ça c'est bon.
Il reste a appeler l'évènement commun "afficher mappemonde" lorsqu'un joueur consulte une map sur un mur ou une table et aussi mettre la Variable niveau de zoom = 1
Et appeler l'évènement commun "afficher zone" lorsqu'un joueur consulte une map dans les items, il faut rendre égale la variable choix égale à la variable position réelle du joueur (pour que l'affichage de la zone correspondent a la position du joueur.) et aussi mettre la Variable niveau de zoom = 4
|
Posté dans Forum - Cherche système de mappemonde pour RPG Maker MZ |
cortez -
posté le 03/12/2022 à 18:47:40. (524 messages postés) |
| Théoriquement tout est possible en gérant avec des images, y compris les points de TP. Par contre en évent c'est assez rigoureux, et je n'ai pas le logiciel MZ.
Je ne peux pas promettre, mais j'adore les défis je pense tester dans mon coin la gestion des images et d'un "menu de téléportation" tout en évènement.
Si quelque chose ressort de mes test je te partagerait les évènements et la manière dont j'ai procédé. (par contre se sera sur XP donc il faudra adapter).
|
Posté dans Forum - Cherche système de mappemonde pour RPG Maker MZ |
cortez -
posté le 03/12/2022 à 14:38:05. (524 messages postés) |
| Je n'arrive pas a comprendre ce dont tu as besoin. Pourrais-tu répondre a mes questions ? Histoire que j'ai une idée précise de ce que tu cherches a faire.
Tu parles d'une mappemonde, es-ce que c'est l'une des propositions ci-dessous ?
Une map sur laquelle le personnage (sous forme de character) peut ce déplacer case pas case (comme une map classique) mais qui, lorsqu'on arrive sur le bord droit de la map nous fait continuer depuis le bord gauche. Idem pour le haut et le bas pour avoir une map qui boucle. Spoiler (cliquez pour afficher)
Une image dessinée avec une représentation des continents et des zones principales depuis laquelle le joueur peux sélectionner une destination et s'y téléporter. Spoiler (cliquez pour afficher)
| Aller à la page: 1 2 3 4 5 6 7 8 9 10 11 12
|
|
|