Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
245 connectés actuellement
30741558 visiteurs depuis l'ouverture
1931 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
Musa -
posté le 19/08/2013 à 02:37:09 (20 messages postés)
| | Domaine concerné: Script
Logiciel utilisé: RMXP
Bonjour à tous !
Pour mon projet sous RMXP, j'utilise actuellement un script de sauvegarde que vous pouvez retrouver ici : http://rpgmaker.net/scripts/49/
En fait, je réalise un Menu Custom en events et ce script me permet de charger et sauvegarder très simplement via une petite ligne de script appellée via mes events.
Je vous explique mon problème : mon menu possède 3 slots de sauvegarde. Lorsque le joueur ouvre l'écran de sauvegarde, il a un accès visuel à ses sauvegardes précédentes, ainsi pour chaque sauvegarde on peut voir le niveau, les HP, MP, l'argent, le temps de jeu et le nombre de fois que la partie à été sauvegardée.
Je voudrais donc pouvoir récupérer tous ces paramètres, enregistrés dans la sauvegarde par le script, via des variables utilisables en events afin de pouvoir les afficher.
Voici un extrait du script, concernant son utilisation en events :
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
| =begin
-----EVENT SAVE CONTROL-------
Scripts calls:
$game_system.map_quicksave : Save the game in the quicksave slot.
$game_system.map_autosave : Save the game in the autosave slot.
$game_system.load_slot(X) : Load the game in slot X.
$game_system.save_slot(X) : Save the game in slot X.
$game_system.erase_slot(X) : Erase the game in slot X.
$game_system.slot_exist(X) : It tells you if slot X exist. Have two uses_:
1-The script returns true/false, you can use it in a conditional branch script option.
2-Script also saves true/fase in the switch defined by Sw_file_exist.
$game_system.slot_info(X) : It save the slot information in the slots you defined.
-Date
-Time
-Steps
-Gold
-Group actors ids
-Group actors levels
$scene = Scene_Load.new(true): Call load menu in a map.
=end
module Wep
Sw_file_exist = 2
Vars_actors_ids = [1,2,3,4] # Group actors ids
Vars_actors_levels = [5,6,7,8] # Group actors levels
# Date: Year, Month, Day, Hour, Minute, Second
Vars_date = [9,10,11,12,13,14]
# Time: Hour, minute, second
Vars_time = [15,16,17]
Vars_money = 18 # Gold
Vars_steps = 19 # Steps
end |
J'ai essayé de MP l'auteur de script, mais celui-ci semble dater un peu et je n'ai pas eu de réponse pour le moment. Je viens donc vous demander de l'aide ! Le script est plutôt bien commenté, j'ai essayé plusieurs trucs mais sans résultats.
|
maxadona -
posté le 19/08/2013 à 11:11:41 (146 messages postés)
| Drawing my dreams on sheets of paper ... | Si je ne me trompe pas, chaque valeur est stockée dans une variable de 1 à 19.
Variables 1 à 4 pour les ID des persos, de 5 à 8 pour leur niveau, 9 à 14 pour afficher une date, 15 à 17 pour le temps de jeu, 18 pour l'argent et 19 pour le nombre de pas.
Il suffirait donc de récupérer les valeurs de chacune de ces variables et de les utiliser comme tu le désires.
|
Notre imagination ne serait-elle pas la folie de notre génie ? - Last Chance Projet (Site à mettre à jour) ... Présentation bientôt - Chaine Youtube |
Musa -
posté le 19/08/2013 à 13:14:38 (20 messages postés)
| | C'est effectivement ce que je me suis dit, j'ai donc essayé de faire un petit event pour voir si je pouvais récupérer ces variables selon le modèle suivant :
1
2
3
4
| @>Script: $game_system.slot_info(1)
@>Text: Level : \V[5]
: : Timer : \V[16] : \V[17]
: : Argent : \V[18] |
Je pense que la première ligne permet de récupérer les infos du slot numéro 1 dans les variables.
Le reste permet juste d'afficher les dites variables.
Lors du test, le jeu plante dès la première ligne (l'appel du script) et me retourne l'erreur :
1
2
| Script 'Sauvegarde Rapide' line 1462: NoMethodError occurred.
undefinded method 'actors' for #<Game_System:0x2529468> |
Le script "Sauvegarde Rapide" est bien entendu le dit script de sauvegarde. De plus, même si tout cela fonctionnait, j'aimerai également récupérer d'autres valeurs comme les HP, MP et le nombre de fois que la partie à été sauvegardée.
|
Cortez -
posté le 19/08/2013 à 17:39:39 (524 messages postés)
| | Le message indique une méthode non définie "actors"
Le problème se trouve à la ligne 1462, mais il est possible que le
problème vienne d'ailleurs.
Il nous faut le script entier pour comprendre l'erreur.
|
Musa -
posté le 20/08/2013 à 11:04:54 (20 messages postés)
| | J'en ai donné le lien dans mon premier post, le code étant particulièrement long, il n'est pas accepté dans une balise code sur le forum, ni dans une balise de spoil.
Voici le lien direct du code entier : http://rpgmaker.net/scripts/49/code/
Voici le bout de code impliqué et la ligne 1462 (ligne 25 ici) :
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
| #--------------------------------------------------------------------------
# * Slot info
#--------------------------------------------------------------------------
def slot_info(slot)
if FileTest.exist?( Wep::Save_folder+ "\\"+ Wep::File_name + slot.to_s + Wep::Saves_extension)
file = File.open( Wep::Save_folder+ "\\"+ Wep::File_name + slot.to_s + Wep::Saves_extension, "r")
timestamp = file.mtime
characters = Marshal.load(file)
guard_rap = Marshal.load(file)
psj = Marshal.load(file)
dinero = Marshal.load(file)
frame_count = Marshal.load(file)
game_system = Marshal.load(file)
game_switches = Marshal.load(file)
game_variables = Marshal.load(file)
game_self_switches = Marshal.load(file)
game_screen = Marshal.load(file)
game_actors = Marshal.load(file)
game_party = Marshal.load(file)
total_sec = frame_count / Graphics.frame_rate
file.close
i=0
# Actors levels and ids
for actor in game_party.actors
$game_variables[Wep::Vars_actors_ids[i]] = actor.id
$game_variables[Wep::Vars_actors_levels[i]] = actor.level
i+=1
end
# Date
$game_variables[Wep::Vars_date[0]] = timestamp.year
$game_variables[Wep::Vars_date[1]] = timestamp.month
$game_variables[Wep::Vars_date[2]] = timestamp.day
$game_variables[Wep::Vars_date[3]] = timestamp.hour
$game_variables[Wep::Vars_date[4]] = timestamp.min
$game_variables[Wep::Vars_date[5]] = timestamp.sec
# Time
hour = total_sec / 60 / 60
min = total_sec / 60 % 60
sec = total_sec % 60
$game_variables[Wep::Vars_time[0]] = hour
$game_variables[Wep::Vars_time[1]] = min
$game_variables[Wep::Vars_time[2]] = sec
# Gold and steps
$game_variables[Wep::Vars_money] = game_party.gold
$game_variables[Wep::Vars_steps] = game_party.steps
return true
end
end
end |
EDIT :
Bon après moultes essais, j'ai tenté de rajouter des $ devant certaines variables :
1
| for actor in $game_party.actors |
et
1
2
| $game_variables[Wep::Vars_money] = $game_party.gold
$game_variables[Wep::Vars_steps] = $game_party.steps |
Je n'ai alors plus d'erreur, mais les variables qui s'affichent ne sont pas celles du slot recherché, mais les variables de la partie actuelle (la partie lancée pour faire le test, et non la sauvegarde).
J'ai fais pas mal de recherche, ne connaissant presque rien au ruby. L'erreur renvoyant au niveau du for, de ce que j'ai cru comprendre :
est une variable locale
est un module chargé ici d'après le slot défini
(est un tableau ?) qui correspond aux id des différents personnages dans l'équipe
1
| $game_variables[Wep::Vars_actors_ids[i]] = |
permet d'enregistrer une donnée dans la variable définie plus haut
est une variable contenant l'id du personnage passé en revue dans le for
Si quelqu'un qui s'y connait pouvait m'aiguiller un peu, je patauge la !
Ne serait-ce que m'indiquer si je fais fausse route ou non !
Si les modifs ne sont pas possibles, ce que je voudrais c'est avoir quelque chose qui me permette :
- de sauvegarder sur 3 slots différents
- de charger sur 3 slots différents
- de pouvoir tester si une sauvegarde existe déjà sur un slot
- de pouvoir récupérer les infos d'une partie sauvegardée sans la charger
|
Dyeel -
posté le 27/08/2013 à 12:44:43 (200 messages postés)
| | Hey.
Cette partie du script est un peu bizarre.
Je t'explique :
Quand tu sauvegardes un fichier, l'ordre de ce que tu sauvegardes est très important car il faudra charger toutes les données absolument dans le même ordre.
Or le script sauvegarde dans un sens et charge dans l'autre.
Ça veut dire que là où c'est écrit game_party, ben c'est tout sauf le game_party.
Donc dans la partie du script slot_infos que tu as mis au-dessus, essaie de :
-supprimer les lignes 8 à 11 (de characters à dinero = Marshal.load(file) )
Le premier Marshal.load(file) est donc le frame_count
-juste avant le frame_count, où tu as supprimé les lignes, écris :
1
2
3
4
5
|
for i in 0..9
infos = Marshal.load(file)
end
|
Je pense que ça devrait marcher.
Sinon, poste le message d'erreur.
Il ne faut pas ajouter de $ car tu vas prendre les infos de ta partie actuelle, mais ça tu l'as déjà vu^^
|
Musa -
posté le 27/08/2013 à 15:10:47 (20 messages postés)
| | Wow, très impressionnant ! En effet ça marche nikel, merci beaucoup !
En fait, je suis dessus depuis plusieurs jours, du coup j'ai réussi à contourner le problème avec ce tuto : http://www.rpg-maker.fr/tutoriels-268-ruby-ecrire-et-lire-un-fichier.html
J'ai pu écrire grâce à lui deux petites fonctions qui me permettent de sauver et charger les infos que je veux afficher pour chaque slot. Je les donne, ça pourra peut-être servir à quelqu'un d'autre un jour :
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
| #----------------------------------------------------------------------------
# ECRIRE INFOS DANS FICHIER SAVE
# http://www.rpg-maker.fr/tutoriels-268-ruby-ecrire-et-lire-un-fichier.html
#----------------------------------------------------------------------------
def save_variables(slot)
file = File.open("Saves\\Save"+slot.to_s+".data", "w+")
fichier = file
if slot.to_i == 1
fichier.write("Level = "+$game_variables[101].to_s+" ;
Timer = "+$game_variables[104].to_s+" ;
Gold = "+$game_variables[105].to_s+" ;
HP = "+$game_variables[102].to_s+" ;
MP = "+$game_variables[103].to_s+" ;
SaveNumber = "+$game_variables[106].to_s+" ;
YTonic = "+$game_variables[124].to_s+" ;
YMagicKey = "+$game_variables[125].to_s+"")
elsif slot.to_i == 2
fichier.write("Level = "+$game_variables[107].to_s+" ;
Timer = "+$game_variables[110].to_s+" ;
Gold = "+$game_variables[111].to_s+" ;
HP = "+$game_variables[108].to_s+" ;
MP = "+$game_variables[109].to_s+" ;
SaveNumber = "+$game_variables[112].to_s+" ;
YTonic = "+$game_variables[124].to_s+" ;
YMagicKey = "+$game_variables[125].to_s+"")
elsif slot.to_i == 3
fichier.write("Level = "+$game_variables[113].to_s+" ;
Timer = "+$game_variables[116].to_s+" ;
Gold = "+$game_variables[117].to_s+" ;
HP = "+$game_variables[114].to_s+" ;
MP = "+$game_variables[115].to_s+" ;
SaveNumber = "+$game_variables[118].to_s+" ;
YTonic = "+$game_variables[124].to_s+" ;
YMagicKey = "+$game_variables[125].to_s+"")
else
fichier.write("Level = 0 ;
Timer = 0 ;
Gold = 0 ;
HP = 0 ;
MP = 0 ;
SaveNumber = 0 ;
YTonic = 0 ;
YMagicKey = 0")
end
file.close
end
#----------------------------------------------------------------------------
# LIRE INFOS DANS FICHIER SAVE
# http://www.rpg-maker.fr/tutoriels-268-ruby-ecrire-et-lire-un-fichier.html
#----------------------------------------------------------------------------
def read_variables(slot)
file = File.open("Saves\\Save"+slot.to_s+".data", "r")
fichier = file
fichier = fichier.read
fichier.gsub!(" ", "")
fichier.gsub!("_", " ")
fichier = fichier.split(";")
level = fichier[0]
timer = fichier[1]
gold = fichier[2]
hp = fichier[3]
mp = fichier[4]
savenumber = fichier[5]
ytonic = fichier[6]
ymagickey = fichier[7]
level = level.split("=")
timer = timer.split("=")
gold = gold.split("=")
hp = hp.split("=")
mp = mp.split("=")
savenumber = savenumber.split("=")
ytonic = ytonic.split("=")
ymagickey = ymagickey.split("=")
if slot.to_i == 1
$game_variables[101] = level[1].to_i
$game_variables[104] = timer[1].to_i
$game_variables[105] = gold[1].to_i
$game_variables[102] = hp[1].to_i
$game_variables[103] = mp[1].to_i
$game_variables[106] = savenumber[1].to_i
#$game_variables[124] = ytonic[1].to_i
#$game_variables[125] = ymagickey[1].to_i
elsif slot.to_i == 2
$game_variables[107] = level[1].to_i
$game_variables[110] = timer[1].to_i
$game_variables[111] = gold[1].to_i
$game_variables[108] = hp[1].to_i
$game_variables[109] = mp[1].to_i
$game_variables[112] = savenumber[1].to_i
#$game_variables[124] = ytonic[1].to_i
#$game_variables[125] = ymagickey[1].to_i
elsif slot.to_i == 3
$game_variables[113] = level[1].to_i
$game_variables[116] = timer[1].to_i
$game_variables[117] = gold[1].to_i
$game_variables[114] = hp[1].to_i
$game_variables[115] = mp[1].to_i
$game_variables[118] = savenumber[1].to_i
#$game_variables[124] = ytonic[1].to_i
#$game_variables[125] = ymagickey[1].to_i
else
$game_variables[1] = level[1].to_i
$game_variables[2] = timer[1].to_i
$game_variables[3] = gold[1].to_i
$game_variables[4] = hp[1].to_i
$game_variables[5] = mp[1].to_i
$game_variables[6] = savenumber[1].to_i
#$game_variables[7] = ytonic[1].to_i
#$game_variables[8] = ymagickey[1].to_i
end
file.close
end |
Bref, tout fonctionne bien, mais pour le coup j'ai maintenant deux fichiers de sauvegarde par slot (le fichier habituel et le fichier créé par mes fonctions). C'est un petit peu cracra tout de même. De plus, mes fichiers ne sont pas cryptés donc y a mieux !
Actuellement, le script "de base" permet de récupérer :
- Le Niveau
- L'or
- Le Timer
Serait-il possible de pouvoir récupérer :
- les HP (actuels)
- les MP (actuels)
Et aussi d'y enregistrer des variables X et Y afin par la suite de pouvoir les récupérer ?
|
Dyeel -
posté le 27/08/2013 à 19:16:54 (200 messages postés)
| | Je te conseille de modifier le script que tu as déjà, plutôt que d'écrire dans un autre fichier. C'est moins sale ^^
Pour modifier une variable de ta partie actuelle. (Exemple, variable 3)
$game_variables[3] = 46
Tu peux la rendre égale aux mp ou hp actuels.
Pour le héros 1 :
$game_variables[3] = $game_actors[1].hp (ou .mp pour les mp.Tu as aussi .name, .level, .hp_max etc mais il faut bien être sûr de la syntaxe)
Si tu veux le faire pour les héros d'une partie déjà sauvegardée, enlève le $ du game_actors.
Pareil si tu veux récupérer la valeur d'une variable d'une partie sauvegardée.
Et tu écris tout ça après le file.close du script dont tu avais placé l'extrait.
J'espère avoir bien expliqué ^^
|
Musa -
posté le 02/09/2013 à 16:23:15 (20 messages postés)
| | Ah super ! Oui tu as très bien expliqué !
J'essaye ça, dès que j'en ai l'occasion, merci !
| Index du forum > Entraide > [RMXP] Events et Script de sauvegarde
|
|
|