Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

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

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / News: Quoi de neuf sur Oniromancie (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

483 connectés actuellement

29385999 visiteurs
depuis l'ouverture

5 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

RPG Maker - La Communauté

Eclipso

Lunae - le bazar d'Emz0

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RESOLU] [RPG maker MV] Changer rencontre aléatoire suivant une variable ?


TitGoony - posté le 03/01/2017 à 06:50:31 (8 messages postés)

❤ 0

Domaine concerné: événement
Logiciel utilisé: RPG maker MV
Bonjour à vous,

Pour donner un peu de contexte avant d'aller me présenter, je débute complétement sur RPG maker. Là j'en suis vraiment à l'étape où je "patouille" encore beaucoup, notamment sur les différentes possibilités des événements.

J'ai réussis à faire une mini-quête en me servant d'une variable qui s'incrémente pour savoir où j'en suis. Par contre je bloque à présent sans trouver les mots clés pour trouver la solution...
Ce que je voudrais faire c'est avoir un test sur une variable qui, à une certaine valeur, ajoute une rencontre aléatoire à la table de rencontre aléatoire (la liste à droite des propriétés de la carte).


En pratique le héro apprend lors d'un dialogue que des bandits semblent s'être installés dans la région => une variable "quetebandit" passe de 0 à 1. Je voudrais me servir de cette information pour ajouter sur certaines régions de la carte principale une probabilité de rencontres avec des bandits (et pouvoir enlever cette rencontre aléatoire quand la variable passera, à 2 càd quand le camp aura été détruit).


- Est-ce que je m'y prend correctement ?
- Comment accéder / modifier la table de rencontre d'une carte par un événement ? Je pensais à un événement automatique sur la carte principal qui fait le test et met à jour la table de rencontre avant de s'effacer... Mais je trouve pas la fonction qui permet de faire cette modification (juste "changer rencontre" qui active ou pas les rencontres aléatoires). :grah1

Merci beaucoup à vous !
Bonne journée.


Aminomad - posté le 03/01/2017 à 09:33:50 (150 messages postés)

❤ 0

Bonjour,

j'ai pas trouvé comment faire en event, mais tu peux utiliser ce bout de code (via la commande script):

Portion de code : Tout sélectionner

1
$dataMap.encounterList.push({regionSet: [2,1],troopId: 2, weight: 50})


avec:
regionSet: la liste des régions où tu veux ajouter la rencontre (mets juste [] pour toute la carte).
troopId: l'id de la troupe que tu veux ajouter
weight: le poids de la rencontre

Par contre ça ne marche que sur la map où est appelé le code.
Il faut donc faire un event automatique sur la map en question, mais faire attention à n'ajouter la rencontre qu'une seule fois sinon ça chamboulera toutes les probabilités de rencontre.
Je te conseillerais de faire un truc dans ce style là:
event auto:

Portion de code : Tout sélectionner

1
2
3
4
5
6
Si quetebandit = 1
     ajouter la rencontre 1
     ajouter la rencontre 2
     ...
     ajouter la rencontre x
     quetebandit = 2


Pour supprimer une rencontre en partant de la fin de la liste:

Portion de code : Tout sélectionner

1
$dataMap.encouterList.pop()


Et là pareil: (en admettant qu'une fois la quête finie, quetebandit = 3)
event auto (le même qu'au dessus):

Portion de code : Tout sélectionner

1
2
3
Si quetebandit = 3
     supprimer la dernière rencontre (x fois)
     quetebandit = 4


N'hésite pas à me dire si c'est pas clair.

The Lone Chameleon


TitGoony - posté le 03/01/2017 à 13:31:12 (8 messages postés)

❤ 0

Super Merci beaucoup !

C'est très claire en tout cas, j'essaierai ça ce soir en rentrant et je te dis si ça marche:)

Il faudra que je regarde de plus près les fonctions de scripts... Enfin quand je serais déjà un peu plus à l'aise avec les événements simples :clindoeil4

Encore merci !
Bonne journée.


Akadream - posté le 03/01/2017 à 16:47:09 (381 messages postés)

❤ 0

Je fus RPG Fusion jadis

Sinon tu as une autre solution. Etant un grand fan et ancien utilisateur de RM2K3 (il n'y avait pas les scripts !), nous devions coutourner les scripts pour arriver à notre résultat et on y arrivait en général.

Bref, une solution que je trouve assez simple, c'est de copier coller la map où tu veux des rencontres aléatoire. Tu auras donc deux maps :
- La première sans recontre
- La deuxième identique avec des recontres
Quand la variable de la quête est à 0, alors l'event qui téléporte l'équipe à la map téléporte sur la map 1 (sans rencontre).
Et après sur l'event tu mets une deuxième page qui se déclanche lorsque la variable de la quête est à 1. Cette deuxième page amènera donc vers la map 2 (avec les rencontres).

Tu peux utiliser cette astuce plusieurs fois. Après, il est vrai que ça fais plus de map (nomme les bien pour t'y retrouver).
Mais au moins cette solution est assez facile à faire et à copier dans d'autre situation.

Suis Shaper sur Twitter ! - Rejoins le serveur discord de Shaper !


TitGoony - posté le 03/01/2017 à 18:28:12 (8 messages postés)

❤ 0

Salut,

Merci !

C'est vrai que j'avais pensé à faire une copie et je crois que c'est ce que j'aurai fait sur une petite carte. Mais la sur la "world map" qui est en plus en chantier j'avais peur de faire une usine à gaz entre les différentes versions de la même carte... Après j'aurai peut être du zoner un peu plus la carte principale en la répartissant sur plusieurs cartes plutôt que de faire un gros carré d'eau et de commencer par une petite île dans un coin.

Parce qu'au final si jamais je fais plusieurs quêtes dans le même genre qui peuvent être prises en parallèle ça risque de devenir aussi une usine à gaz à gérer :goutte

Et je pensais aussi avoir zappé la fonction pour mettre à jour la liste.

Bon après je crois qu'il faut faire ses essais-erreurs pour prendre le coup et voir la méthode qu'on préfère. Tant pis si le résultats et pas foufou !:fou3

Je vais essayer là et je vous dirais si j'ai réussi à avoir quelque chose de fonctionnel (et comment j'ai fais au final).

Merci
Bonne soirée !

[edit] PS: où trouve t-on les commandes utilisables dans les scripts ? J'ai rien vu dans la doc mais je suppose qu'il y a un document de référence qq part non ?... Je pense que le plus simple serait carrément de remettre à 0 la liste des rencontre aléatoire et de la recréer en entier avec des condition à chaque fois qu'on pénètre sur la carte qu'en penses-tu?


Aminomad - posté le 04/01/2017 à 00:18:20 (150 messages postés)

❤ 0

Citation:

où trouve t-on les commandes utilisables dans les scripts ?


Y'a ce fichier qui est très bien mais pas exhaustif.
https://docs.google.com/spreadsheets/d/1-Oa0cRGpjC8L5JO8vdMwOaYMKO75dtfKDOetnvh7OHs/edit#gid=0
Perso, j'utilise la console de debug (F8 quand tu test ton projet pour la faire apparaitre).
Ca demande d'être déjà un peu familier avec le code du jeu (j'ai tapé $dataMap. et l'autocomplétion a fait le reste).

Citation:

Je pense que le plus simple serait carrément de remettre à 0 la liste des rencontre aléatoire et de la recréer en entier avec des condition à chaque fois qu'on pénètre sur la carte qu'en penses-tu?


Oui, ça marche aussi. Et ça te permettra d'éviter d'effacer des éléments par erreur ou d'en ajouter un qui y est déjà donc moins risqué.
Pour vider la liste:

Portion de code : Tout sélectionner

1
$dataMap.encounterList=[]



The Lone Chameleon


TitGoony - posté le 04/01/2017 à 06:18:30 (8 messages postés)

❤ 0

Salut,

Alors je sais pas si c'est un bug ou lié au fonctionnement de RPGmaker mais il y a un pb si on utilise un événement automatique qui s'efface à la fin (en ayant compétement vidé la liste des rencontres auomatiques en éditant la map).

Voilà ce que j'ai mis en script dans un événement auto qui s'efface à la fin:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
$dataMap.encounterStep=10;
$dataMap.encounterList=[];
$dataMap.encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 5});
$dataMap.encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 10});
$dataMap.encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 5});
$dataMap.encounterList.push({regionSet: [2,4],troopId: 4, weight: 10});
$dataMap.encounterList.push({regionSet: [3],troopId: 7, weight: 10});
$dataMap.encounterList.push({regionSet: [3,4],troopId: 8, weight: 20});
$dataMap.encounterList.push({regionSet: [4],troopId: 9, weight: 10});



En effet la première rencontre à lieu comme prévue.
Par contre il n'y en a jamais de nouvelle...


J'ai l'impression que l'événement automatique marche bien comme prévu quand on arrive sur la carte depuis une autre carte et exécute le script.
Par contre en sortie du premier combat j'ai l'impression que la liste des rencontres aléatoires reprend celle réglée par défaut en éditant la carte (càd une liste vide dans ce cas là) mais que la carte elle-même n'est pas vraiment rechargée (les événements effacés le sont toujours et leur code n'est pas ré-exécuté).

Si on change de map et revient on aura bien à nouveau 1 rencontre.


En fait je crois juste que la mise à jour de la liste de rencontre aléatoire par script est temporaire et n'est pas conservé après le premier combat (comme si la liste de rencontres aléatoires était réinitialisée en sortie de combat).


Si on met ce code dans un événement parallèle qui ne s'efface pas ça marche.
Mais je me demande si c'est la façon de faire, parce que ça veut dire qu'en permanence la liste est effacée et recréé pour rien du tout...
=> Y a t-il une meilleure méthode ?



Ca m'a rendu chèvre pendant plus d'une heure arf :goutte
Désolé si c'est un peu noob... :wouah

Merci de tes lumières en tout cas !


Aminomad - posté le 04/01/2017 à 08:50:16 (150 messages postés)

❤ 0

Ah désolé, j'avais pas pensé à ça.

Citation:

=> Y a t-il une meilleure méthode ?


Oui je pense.
Je te dis ça ce soir.


Edit: Ton intuition était bonne, en fait après chaque combat et téléportation dans la map, la variable encounterList est réinitialisée donc c'était pas très malin de ma part.
Il faut forcer le jeu à renvoyer ta définition en redéfinissant cette fonction (qui est dans le code de RPG Maker):

Portion de code : Tout sélectionner

1
2
3
Game_Map.prototype.encounterList = function() {
    return $dataMap.encounterList;
};


Par exemple:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
Game_Map.prototype.encounterList = function() {
    if($gameMap.mapId()==2){
        encounterList = [];
        encounterList.push({regionSet:[], troopId: 3, weight: 2})
        if($gameVariables.value(2)==1){
            encounterList.push({regionSet:[], troopId: 2, weight: 1000});
        }
        return encounterList;
    }
    return $dataMap.encounterList;
};


En ligne 2, je test l'id de ma map pour que ma définition ne s'applique que sur la map qui m'intéresse (dont l'id est 2 ici).
En ligne 5 je test la valeur de la variable 2: si elle vaut 1, j'ajoute mes bandits.

Je sais pas si t'es déjà à l'aise avec les plugins ?
Dans le doute:
1) Copie le code au-dessus dans un fichier texte (change l'extension en .js).
2) Copie le fichier dans le dossier js/plugins de ton projet.
3) Ajoute et active le plugin dans le plugin manager (icone en forme de puzzle).

Malheureusement un peu plus compliqué que la solution initiale mais pas tant que ça au final.
Pour encounterStep, tu peux soit le définir classiquement dans les propriétés de la map (si tu compte pas le changer, c'est mieux) ou appliquer la méthode du dessus avec la fonction:

Portion de code : Tout sélectionner

1
2
3
Game_Map.prototype.encounterStep = function() {
    return $dataMap.encounterStep;
};



The Lone Chameleon


TitGoony - posté le 05/01/2017 à 05:59:17 (8 messages postés)

❤ 0

Merci beaucoup à toi !

Je testerai ça d'ici ce week-end je pense, ça se complique un peu :)
Sinon non pas encore vraiment à l'aise pour le moment avec le logiciel et pas encore essayer les plugins lol !
Je crois qu'il faut vraiment de la pratique et prendre des habitudes maintenant.


Puis là je m'embrouille un peu rien que dans la logique de la 1ere quête qui est pourtant toute simple... Arf !
Elle est pas compliquée mais mine de rien je vais devoir faire un diagramme parce que suivant à qui l'on parle en premier les dialogues n'ont pas forcément de sens.

Il faudrait que j'essaie de la terminer et de la mettre en ligne pour avoir des retours de votre part.
Ma fille n'est pas très objective... :wouah
Je pense pas que ça révolutionnera quoi que ce soit ou que ça aura grand intérêt, mais il y a sûrement pleins de petits détails facilement améliorables (ou de trucs vraiment tout pourris qu'il faut refaire différemment !) que je ne vois pas quand on à le nez dessus ou qu'on ne connaît pas toutes les possibilités.

Encore merci en tout cas !

__________
Edit 09/01

Salut,

ça à l'air de fonctioner pour les rencontres, par contre pour la fréquence je ne suis pas sûre et je n'arrive pas à vérifier simplement...
Est-ce qu'on peut mettre les 2 fonctions à la suite dans le même code :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// rencontres aléatoires sur la worldmap
 
Game_Map.prototype.encounterList = function() {
    if($gameMap.mapId()==4){
        encounterList = [];
 
        encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 10});
        encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 20});
        encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 10});
        encounterList.push({regionSet: [2,4],troopId: 4, weight: 20});
 
//Quete Bandit = 2
        if($gameVariables.value(7)==2){
                encounterList = [];
                encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 5});
                encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 10});
                encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 5});
                encounterList.push({regionSet: [2,4],troopId: 4, weight: 10});
                encounterList.push({regionSet: [1,2,3],troopId: 7, weight: 10});
                encounterList.push({regionSet: [3,4],troopId: 8, weight: 20});
                encounterList.push({regionSet: [4],troopId: 9, weight: 10});
        }
        return encounterList;
 
//Quete Bandit = 3
        if($gameVariables.value(7)==3){
                encounterList = [];
                encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 5});
                encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 10});
                encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 5});
                encounterList.push({regionSet: [2,4],troopId: 4, weight: 10});
                encounterList.push({regionSet: [1,2,3],troopId: 7, weight: 10});
                encounterList.push({regionSet: [3,4],troopId: 8, weight: 20});
                encounterList.push({regionSet: [4],troopId: 9, weight: 10});
        }
        return encounterList;
 
 
    }
    return $dataMap.encounterList;
};
 
 
 
// fréquence de rencontres aléatoire sur la worldmap
// défaut 30
Game_Map.prototype.encounterStep = function() { 
        if($gameMap.mapId()==4){
                encounterStep=30;
                if($gameVariables.value(7)==2){
                        encounterStep=5;
                }
                if($gameVariables.value(7)==3){
                        encounterStep=5;
                }
        
        }
    return $dataMap.encounterStep;
};




Y a t-il un moyen de vérifier en jeu la valeur de encounter step ?

Encore merci !
Bonne journée


Aminomad - posté le 09/01/2017 à 18:26:35 (150 messages postés)

❤ 0

Ca a l'air correct.
Pour la fréquence, il manque ce bout de code à la ligne 56:

Portion de code : Tout sélectionner

1
return encounterStep;


(quand return est rencontré on sort de la fonction, hors la tu renvoies toujours $dataMap.encounterStep qui est la valeur définie dans les propriétés de la map).

Pour vérifier, tu peux mettre des valeurs exagérées (très hautes ou très basses).
Ou sinon F8 et tape

Portion de code : Tout sélectionner

1
$gameMap.encouterStep()



The Lone Chameleon


TitGoony - posté le 13/01/2017 à 06:44:34 (8 messages postés)

❤ 0

Super, un grand merci à toi, ça marche niquel !:sourire3

Voilà le code complet si ça peut aider quelqu'un :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// rencontres aléatoires sur la worldmap
 
Game_Map.prototype.encounterList = function() {
    if($gameMap.mapId()==4){
        encounterList = [];
 
        encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 10});
        encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 20});
        encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 10});
        encounterList.push({regionSet: [2,4],troopId: 4, weight: 40});
 
//Quete Bandit = 1
        if($gameVariables.value(7)==2){
                encounterList = [];
                encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 10});
                encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 20});
                encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 10});
                encounterList.push({regionSet: [2,4],troopId: 4, weight: 40});
                encounterList.push({regionSet: [1,2,3],troopId: 7, weight: 5});
                encounterList.push({regionSet: [3,4],troopId: 8, weight: 10});
                encounterList.push({regionSet: [4],troopId: 9, weight: 5});
        }
        return encounterList;
 
//Quete Bandit = 2
        if($gameVariables.value(7)==2){
                encounterList = [];
                encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 5});
                encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 10});
                encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 5});
                encounterList.push({regionSet: [2,4],troopId: 4, weight: 20});
                encounterList.push({regionSet: [1,2,3],troopId: 7, weight: 20});
                encounterList.push({regionSet: [3,4],troopId: 8, weight: 40});
                encounterList.push({regionSet: [4],troopId: 9, weight: 20});
        }
        return encounterList;
 
//Quete Bandit = 3
        if($gameVariables.value(7)==3){
                encounterList = [];
                encounterList.push({regionSet: [1,2,3,4],troopId: 1, weight: 5});
                encounterList.push({regionSet: [1,2,3,4],troopId: 2, weight: 10});
                encounterList.push({regionSet: [1,2,3,4],troopId: 3, weight: 5});
                encounterList.push({regionSet: [2,4],troopId: 4, weight: 20});
                encounterList.push({regionSet: [1,2,3],troopId: 7, weight: 20});
                encounterList.push({regionSet: [3,4],troopId: 8, weight: 40});
                encounterList.push({regionSet: [4],troopId: 9, weight: 40});
        }
        return encounterList;
 
 
    }
    return $dataMap.encounterList;
};
 
 
 
// fréquence de rencontres aléatoire sur la worldmap
 
Game_Map.prototype.encounterStep = function() { 
        if($gameMap.mapId()==4){
                // défaut 25 steps
                encounterStep=25;
                if($gameVariables.value(7)==1){
                        encounterStep=20;
                }
                if($gameVariables.value(7)==2){
                        encounterStep=5;
                }
                if($gameVariables.value(7)==3){
                        encounterStep=3;
                }
        return encounterStep;
        }
    return $dataMap.encounterStep;
};



Encore merci !
Bonne journée et bon week-end !

Index du forum > Entraide > [RESOLU] [RPG maker MV] Changer rencontre aléatoire suivant une variable ?

repondre up

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

Haut de page

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

Plan du site

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