Partagez
Aller en bas
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 21:44
Je voulais créer une arme à feu avec munitions. J'ai trouvé des plugin qui le faisaient mais après avoir mis en place mon propre système. Et au final je préfère le mien et en plus... ben c'est le mien. Sauf qu'il manque juste une petite chose pour qu'il fonctionne:

Une de mes compétence (le tir) a comme Effet l'appel d'un évènement commun qui du coup se déroule en combat. Si j'ai bien compris, les évènements communs ne peuvent pas être appelés en combat... Existe-t-il un plugin ou une autre solution ? J'ai cherché, mais comme je parle mal anglais c'est pas facile...


Dernière édition par Alej le Sam 23 Avr 2016 - 0:09, édité 2 fois
avatar
Spytje
Administrateur

Nombre de messages : 5899
Localisation : La terre
Distinction : Spiraliste [Korn']
Forestia : Projet du mois juillet 2014
Papy Pulkigrat [Yama']
Date d'inscription : 16/03/2008

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 22:25
Ton événement commun doit être appelé via l'utilisation d'une compétence ?
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:05
oui pendant le combat

Spoiler:

avatar
Spytje
Administrateur

Nombre de messages : 5899
Localisation : La terre
Distinction : Spiraliste [Korn']
Forestia : Projet du mois juillet 2014
Papy Pulkigrat [Yama']
Date d'inscription : 16/03/2008

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:14
Normalement il devrait se lancer, tente un coup de mettre un message dans ton événement commun voir si il s'affiche pendant le combat une fois que tu as utilisé le skill en question.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:23
J'ai fait un essai et ça n'a pas marché et j'ai compris pourquoi. C'est parce que je pensais que ma compétence (vu qu'elle était acquise au lvl1) allait remplacer l'attaque de base, ce qui n'est pas le cas. J'ai encore beaucoup de choses à apprendre sur RPGMMV. Désolée pour le dérangement... Bon ben maintenant il va falloir que je trouve comment arranger ça. Parce que sinon, tous les perso de mon équipe vont se retrouver avec des armes à feu et c'est pas le but.... Merci pour l'aiguillage, ça m'a permis de résoudre mon problème (enfin en partie) XD

Désolée pour le dérangement Embarassed
avatar
Spytje
Administrateur

Nombre de messages : 5899
Localisation : La terre
Distinction : Spiraliste [Korn']
Forestia : Projet du mois juillet 2014
Papy Pulkigrat [Yama']
Date d'inscription : 16/03/2008

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:30
Il faut que tu attribues une classe à tes personnages et dans ces classes attribuer les armes, compétences etc utilisables.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:35
Oui c'est fait mais apparemment la compétence 0001 est utilisée systématiquement lorsque le joueur clique sur "attaque" et ce pour n'importe quel personnage. Or si je mets mon évent là (et c'est bien sur l'attaque de base que je veux qu'il soit) les autres personnages vont le déclencher aussi et donc intervenir sur ma variable qui compte les balles. En fait ce que je veux c'est une attaque de base différente pour chaque personnage. Mais il doit y avoir moyen, je vais chercher...
avatar
Spytje
Administrateur

Nombre de messages : 5899
Localisation : La terre
Distinction : Spiraliste [Korn']
Forestia : Projet du mois juillet 2014
Papy Pulkigrat [Yama']
Date d'inscription : 16/03/2008

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:51
Ah oui je comprends mais j'ai bien peur que sans un plugin ca va être compliqué.

Peut être que si dans ton événement commun tu fais des conditions en demandant quel personnage utilise la compétence attaque... qui après lance une autre compétence...
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Ven 22 Avr 2016 - 23:54
Oui je suis entrain de chercher de ce côté là mais je n'ai pas encore trouvé comment demander qui attaque...

Edit, au final, j'avais mis en résolu, mais ce n'est pas résolu, ce n'est plus exactement la même demande mais elle existe encore, du coup j'enlève le petit symbole vert...
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 0:19
Tu veux que je te fasse un plugin qui permettrai a une compétence, une fois acquise, remplace l'attaque de base?
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 0:41
Si ça ne doit pas te prendre trop de temps oui je veux bien, mais il faut vraiment que ça ne soit pas trop compliqué pour toi. Parce que je suppose que tu as d'autres choses à faire aussi et que je peux bien me contenter des plugins de munitions qu'on trouve sur le net même si c'est pas vraiment ce que je voulais.
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 9:15
non t'en fais pas, ça ne va pas me prendre plus d'une heure. je fais ce midi.
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 10:53
Je vais gérer cette demande comme je le fait dans mon boulot, vous allez comprendre pourquoi il est important que le besoin soit parfaitement exprimé :

-> Analyse du besoin
Avoir la possibilité de remplacer la compétence attaque par défaut par une autre compétence acquise par un personnage.

-> Spécification fonctionnelle
- Lors d'un combat, la compétence attaque des personnages doit être remplacé par une compétence acquise par ceux-ci, en prenant en compte l'arme requise.
- La compétence en question devra disposer d'un tag dans le champ "Remarque, permettant de réaliser le traitement de modification de la compétence d'attaque de base. Le tag aura cette forme
- La compétence ne devra pas apparaître en doublon dans la liste des coups spéciaux ou autre


En attente de validation ou modification de la spécification fonctionnelle, par le demandeur.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 10:57
Oh génial ! Merci. A peine une heure pour faire ça ! Décidément, il faut que je me mette à Java !

En plus tu fais ça de manière pro. Je suis gâtée ^^

Juste une question. Pourquoi la prise en compte de l'arme requise ?
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 11:09
En regardant ta compétence, tu as précisé une arme requise "Pistolet", il ne faut pas que ta compétence de tir spécifique au pistolet remplace l'attaque par défaut, si tu t'équipes d'une batte de baseball, ou alors, ta batte peut tirer des munitions, mais ça serait bizarre.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 11:26
Oui en effet je l'avait mis au moment où j'ai pris le screen, pour essayer de voir comment réagissaient les personnages non armés de pistolet si Attaque étaient remplacé par Tir. Je l'avais même mis sur les deux. Mais au final j'ai pas fait le test, parce que c'était bancale. En fait elle n'est pas forcément indispensable dans mon cas puisque le héro ne changera pas de type d'arme. En revanche c'est plus prudent de le faire en effet.
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 12:03
Comme je veux détailler toute l'analyse et le développement dans ce topic, car ça me semble important de voir toutes les étapes d'une modification, ça va me prendre beaucoup plus de temps.

Mais comme la modification a apporter semble simple en apparence, je trouve intéressant de détailler la démarche. Tu auras ça pour ce soir.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 12:21
Trop fort ! Very Happy
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 16:21
L'analyse technique avance, mais comme cela arrive souvent, des questions fonctionnelles peuvent apparaître pendant cette phase.

- Dans le cas où un personnage a acquis plusieurs techniques pouvant remplacer l'attaque par défaut, comment doit-on définir celle a utiliser? une priorité sur l'ID de la compétence?
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 16:52
Pour mon utilisation, ce cas de figure ne se présentera pas. Néanmoins si le plugin venait à être diffusé et du coup à servir à d'autres, je verrai bien cela de la manière suivante:
- Soit l'utilisateur désigne les priorités via l'ID
- Soit elle est déterminée par plusieurs paramètres: l'arme tenue en main et le niveau d'acquisition de la compétence, la priorité allant à la compétence de plus haut niveau.

hum... ça se complique pour toi cette affaire semble-t-il...
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 17:01
J'ai passé quelques heure a ranger mon garage avant de commencer l'analyse ^_^.

On va rester sur la priorité par ID, sinon ça va devenir l'usine a gaz.
avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 17:16
Oui oui, va au plus simple !
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 17:41
Suite à la validation de la spécification fonctionnelle, on passe à la rédaction de la spécification technique.

I - Analyse de l'existant

Tout d'abord, on analyse le fonctionnement actuel de ce qui est impacté par la modification souhaitée

- La liste des compétences d'un personnage est affichée via une fenêtre Window_ActorCommand attachée dans Scene_Battle via la variable this._actorCommandWindow :
Code:
Scene_Battle.prototype.createActorCommandWindow = function() {
    this._actorCommandWindow = new Window_ActorCommand();
    this._actorCommandWindow.setHandler('attack', this.commandAttack.bind(this));
    this._actorCommandWindow.setHandler('skill',  this.commandSkill.bind(this));
    this._actorCommandWindow.setHandler('guard',  this.commandGuard.bind(this));
    this._actorCommandWindow.setHandler('item',   this.commandItem.bind(this));
    this._actorCommandWindow.setHandler('cancel', this.selectPreviousCommand.bind(this));
    this.addWindow(this._actorCommandWindow);
};

- Les commandes dans cette fenêtre sont ajoutées de la sorte :
Code:
Window_ActorCommand.prototype.makeCommandList = function() {
    if (this._actor) {
        this.addAttackCommand();
        this.addSkillCommands();
        this.addGuardCommand();
        this.addItemCommand();
    }
};
Code:
Window_ActorCommand.prototype.addAttackCommand = function() {
    this.addCommand(TextManager.attack, 'attack', this._actor.canAttack());
};

On peut donc constater que le nom de l'option est géré via le TextManager, et que son activation se fait via this._actor.canAttack(); voyons, voir ce que contient cette fonction :
Code:
Game_BattlerBase.prototype.canAttack = function() {
    return this.canUse($dataSkills[this.attackSkillId()]);
};
Encore 2 fonctions à regarder :
Code:
Game_BattlerBase.prototype.attackSkillId = function() {
    return 1;
};
Code:
Game_BattlerBase.prototype.canUse = function(item) {
    if (!item) {
        return false;
    } else if (DataManager.isSkill(item)) {
        return this.meetsSkillConditions(item);
    } else if (DataManager.isItem(item)) {
        return this.meetsItemConditions(item);
    } else {
        return false;
    }
};
on tombe sur une fonction fort intéressante à analyser également :
Code:
Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
    return (this.meetsUsableItemConditions(skill) &&
            this.isSkillWtypeOk(skill) && this.canPaySkillCost(skill) &&
            !this.isSkillSealed(skill.id) && !this.isSkillTypeSealed(skill.stypeId));
};
Arg, ya encore beaucoup de fonctions, et oui, souvent ce qui parait simple peut impliquer beaucoup de chose :
Code:
Game_BattlerBase.prototype.meetsUsableItemConditions = function(item) {
    return this.canMove() && this.isOccasionOk(item);
};
- this.canMove(), on n'y touche pas, par expérience, c'est lié au statu du personnage, on ne va pas y toucher
- this.isOccasionOk(item), ça retourne vrai ou faux, selon le moment d'utilisation et la configuration "Occasion" dans le skill, on ne va pas y toucher non plus

Continuons :
Code:
Game_Actor.prototype.isSkillWtypeOk = function(skill) {
    var wtypeId1 = skill.requiredWtypeId1;
    var wtypeId2 = skill.requiredWtypeId2;
    if ((wtypeId1 === 0 && wtypeId2 === 0) ||
            (wtypeId1 > 0 && this.isWtypeEquipped(wtypeId1)) ||
            (wtypeId2 > 0 && this.isWtypeEquipped(wtypeId2))) {
        return true;
    } else {
        return false;
    }
};
Ca permet de vérifier que l'arme équipée est en adéquation avec le paramétrage des armes requises, sur le skill.

Pour la fonction this.canPaySkillCost, ça fera l'objet d'un autre plugin, on y reviendra.
Et pour les fonctions this.isSkillSealed, this.isSkillTypeSealed, on n'y touche pas, la gestion des compétences sellées, n'est pas l'objet de la demande.

- Ensuite, la liste des skills est gérée dans une fenêtre Window_BattleSkill attachée à Scene_Battle via la variable  via la variable this._skillWindow :
Code:
Scene_Battle.prototype.createSkillWindow = function() {
    var wy = this._helpWindow.y + this._helpWindow.height;
    var wh = this._statusWindow.y - wy;
    this._skillWindow = new Window_BattleSkill(0, wy, Graphics.boxWidth, wh);
    this._skillWindow.setHelpWindow(this._helpWindow);
    this._skillWindow.setHandler('ok',     this.onSkillOk.bind(this));
    this._skillWindow.setHandler('cancel', this.onSkillCancel.bind(this));
    this.addWindow(this._skillWindow);
};

- Les commandes dans cette fenêtre sont ajoutées via cette fonction :
Code:
Window_SkillList.prototype.makeItemList = function() {
    if (this._actor) {
        this._data = this._actor.skills().filter(function(item) {
            return this.includes(item);
        }, this);
    } else {
        this._data = [];
    }
};
Ca met dans this._data le tableau des compétences du personnage filtrées via la fonction this.includes(item) :
Code:
Window_SkillList.prototype.includes = function(item) {
    return item && item.stypeId === this._stypeId;
};
qui vérifie que le type de la compétence correspond au type de compétence gérée par la fenêtre.

Bon voila pour l'affichage.

Maintenant passons a l'exécution de la commande attaque, dans le code de la fonction Scene_Battle.prototype.createActorCommandWindow, nous avons cela : this._actorCommandWindow.setHandler('attack', this.commandAttack.bind(this));, allons voir ce qu'il en est :
Code:
Scene_Battle.prototype.commandAttack = function() {
    BattleManager.inputtingAction().setAttack();
    this.selectEnemySelection();
};
la fonction BattleManager.inputtingAction() permet de retourner un objet Game_Action, que l'on va positionner en attaque, via setAttack();
Code:
Game_Action.prototype.setAttack = function() {
    this.setSkill(this.subject().attackSkillId());
};
En gros ça va positionner l'id de la compétence d'attaque (donc 1) dans l'action du sujet. Très intéressant!

Maintenant regardons ce que fait this.selectEnemySelection();
Code:
Scene_Battle.prototype.selectEnemySelection = function() {
    this._enemyWindow.refresh();
    this._enemyWindow.show();
    this._enemyWindow.select(0);
    this._enemyWindow.activate();
};
Hmmm, ça affiche la fenêtre de choix de l'ennemi, c'est bien pour une compétence mono-cible, mais bof pour une compétence multi-cible, et l'on constate donc, que le programme par défaut se fiche bien de la configuration de la cible la compétence ID 1 (Attaque). Et oui, j'en trouve tous les jours des comme ça!!

Voyons du coup, comment se fait l'utilisation d'une compétence dans le code de la fonction Scene_Battle.prototype.createSkillWindow : this._skillWindow.setHandler('ok',     this.onSkillOk.bind(this));
Code:
Scene_Battle.prototype.onSkillOk = function() {
    var skill = this._skillWindow.item();
    var action = BattleManager.inputtingAction();
    action.setSkill(skill.id);
    BattleManager.actor().setLastBattleSkill(skill);
    this.onSelectAction();
};
Code:
Scene_Battle.prototype.onSelectAction = function() {
    var action = BattleManager.inputtingAction();
    this._skillWindow.hide();
    this._itemWindow.hide();
    if (!action.needsSelection()) {
        this.selectNextCommand();
    } else if (action.isForOpponent()) {
        this.selectEnemySelection();
    } else {
        this.selectActorSelection();
    }
};

II - Les modifications à réaliser

Voila, on a fait le tour de l'existant, maintenant, voyons les modifications que l'on va devoir y apporter, en reprenant la spécification fonctionnelle. Autant pour l'analyse de l'existant on est rentré dans le code, autant pour les spécifications des modifications techniques, on reste à un niveau d'explication. En effet, dans la majorité des cas cela suffit. Mais l'on peut avoir besoin d'un niveau de détail beaucoup plus précis, et dans ce cas on rédige un dossier de spécification technique détaillé.

- Modifier la fonction Window_ActorCommand.prototype.addAttackCommand, afin de rechercher, pour le personnage, la compétence de remplacement correspondant à l'arme équipée, d'ID le plus élevé. La liste des compétence du personnage est retournée par la fonction Game_Actor.prototype.skills(). Si une compétence est trouvée, remplacer l'ajout de l'attaque par l'ajout du skill avec le handle 'attSkill', ce qui permettra de binder cet handle avec une fonction différente dans Scene_Battle.prototype.createActorCommandWindow. Le skill doit être sauvegardé dans une variable de la fenêtre Window_ActorCommand, afin d'être récupérer dans la fonction bindé.
La compétence de remplacement pourra être identifiée via sa liste de meta qui devra contenir l'index 'remplAtt'.

- Afin de ne pas faire apparaître les compétences de remplacement dans la liste de compétence, il faut modifier le comportement de la fonction Window_SkillList.prototype.makeItemList, afin de ne pas récupérer les compétences avec l'index 'remplAtt' dans la liste des meta. Le plus simple étant de modifier la fonction de filtre.

- Ajouter une nouvelle fonction dans Scene_Battle, qui sera une copie de Scene_Battle.prototype.onSkillOk, sauf que le skill a utiliser sera récupéré sur l'objet de fenêtre Window_ActorCommand (this._actorWindow)



Logiquement ça devrait être suffisant. Prochaine étape le développement en suivant la spécification technique, test et validation.


avatar
Alej
Membre

Nombre de messages : 128
Distinction : aucune
Date d'inscription : 08/01/2016

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 19:48
Whaou ! C'est très intéressant ! Je vais étudier tout ça en détail. Petite question au passage, comment fais-tu pour obtenir le code existant ?
avatar
tonyryu
Membre

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

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

le Sam 23 Avr 2016 - 19:56
J'utilise le logiciel Netbeans qui est un éditeur de code très puissant permettant de nombreuse chose et surtout gratuitement (http://www.rpgmakervx-fr.com/t19795-installer-et-utiliser-netbeans-avec-un-projet-rmmv). De plus, je connais très très bien l'architecture du code de rpgmaker, je m'y retrouve du coup facilement.

Et puis développeur logiciel, c'est mon métier! ^_^
Contenu sponsorisé

Re: Recherche de plugin (ou de système) pour évènement commun en combat.

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