Partagez
Aller en bas
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu limiteur d'inventaire

le Mar 26 Avr 2016 - 13:56
bonjour,
j'ai une demande qui concerne la gestion de l'inventaire :
plutôt que d'avoir un inventaire pour les objets, un pour les armes ... j'aimerai un inventaire fourre tout mais avec des restrictions suivantes :
le nombre de slot et limité (et la limite peut évoluer au cours du jeu, par exemple on commence avec 20 slots et on peut modifier ce nombre en cour de partie)

on peut empiler ou non les objet et on peut contrôler le nombre d'objet dans une pile, par exemple les jus de fruit sont empilable jusqu'à 12 alors que les cookies sont empilable par 99 et une arme ne peut être empilable, il suffit pour cela de préciser dans la zone commentaire de l'item < stack: 12 >
donc si j'ai une bouteille de jus de fruit < stack: 12 > :
si j'ai entre 1 et 12 bouteilles : ça ne prend qu'un slot, chaque foit que j'en utilise une le nombre diminue d'un
si j'ai entre 13 et 24 bouteille : ça prend 2 slot etc.

et surtout (c'est primordial si je veux que le joueur puisse gérer son inventaire) : une option pour jeter un ou plusieurs items


Dernière édition par scottsummers le Mer 19 Oct 2016 - 13:17, édité 1 fois
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mar 26 Avr 2016 - 16:09
Et dans le cas d'obtention d'objet dans le cas d'inventaire plein, c'est perdu?

De plus, au niveau de l'utilisation sur la scene de gestion d'objet pas mal de petite chose à modifier et a ajouter. Et la gestion du multi-stack d'un même item, va nécessiter pas mal de modif sur les fonction de gestion d'objet dans Game_Party.

Va falloir faire une bonne spécification fonctionnelle avant de s'y attaquer. J'ai pas trop le temps en ce début de semaine.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 27 Avr 2016 - 6:26
dans le cas d'un inventaire plein si le joueur obtient un objet ce dernier est perdu (histoire d'obliger à gérer au mieux son inventaire et aussi pour donner un intérêt à des quêtes permettant d'augmenter la taille de l'inventaire)
Après si le multi stack d'un même objet pose problème on peut laisser tomber, ça pourra même donner un peu plus de challenge dans la gestion de l'inventaire.
La fonction importante par contre c'est la possibilité de jeter un objet de son inventaire.

J'avais aussi imaginé un coffre indépendant ou le joueur pourrai déposer les objets importants dont il n'a pas une utilité immédiate mais là je ne sais pas si c'est possible.

Mon objectif c'est de me rapprocher le plus possible du système d'inventaire de final fantasy XI pour ceux qui connaissent.

En tout cas merci de ton aide
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mer 27 Avr 2016 - 7:19
Alors figure toi que la mise en place d'un coffre, est en fait bien plus simple que la modification de la gestion de l'inventaire. J'essai de te faire le tout pour la fin de semaine.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 27 Avr 2016 - 9:40
merci beaucoup
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 4 Mai 2016 - 10:19
des nouvelles ?
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mer 4 Mai 2016 - 11:37
C'est en cours, le limiteur d'inventaire est pratiquement terminé, il faut que je réorganise les fenêtres pour gérer l'option de groupement de l'inventaire (arme, armure, objet). Et je met dans le même pluggin la gestion du coffre.

J'ai logiquement un peu de temps cette aprem, je devrais voir le bout.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 4 Mai 2016 - 13:15
merci Smile
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mer 4 Mai 2016 - 17:42
par contre, j'ai un soucis, sur le fait qu'une arme ne soit pas stackable. Du coup actuellement, si je prend une arme et que je reprend une arme, j'en ai qu'une dans l'inventaire. et je ne pense pas que ce soit ce que tu souhaites.


voici le premier jet sans la banque, il me reste donc toute la scene de gestion de banque à faire.

Code:
//=============================================================================
// Tonyryu_LimitBagBank.js
//=============================================================================

/*:
 * @plugindesc Plugin permettant de gérer une limite de l'inventaire
 * @version 0.0.1
 * @author Tonyryu
 *
 * @param GroupAllItemType
 * @desc Regrouper tous les types d'objet dans le menu objet (1 : actif)
 * @default 0
 *
 * @param AddDeleteMenu
 * @desc Ajouter un menu pour proposer le choix de jeter un objet (1 : actif)
 * @default 1
 *
 * @param NameUseOption
 * @desc Nom de l'option d'utilisation
 * @default Utiliser
 *
 * @param NameDeleteOption
 * @desc Nom de l'option de suppression
 * @default Jeter
 *
 * @param NbrOfDiffItem
 * @desc Nombre de type d'objet différent au départ
 * @default 20
 *
 * @param ItemStackDefault
 * @desc Quantité par défaut d'un stack pour les objets
 * @default 99
 *
 * @param ArmorStackDefault
 * @desc Quantité par défaut d'un stack pour les armures
 * @default 1
 *
 * @param WeaponStackDefault
 * @desc Quantité par défaut d'un stack pour les armes
 * @default 1
 *
 * @param BankNbrOfDiffItem
 * @desc Nombre de type d'objet différent dans la banque au départ
 * @default 100
 *
 * @help http://www.tonyryudev.com/
 *
 */

/*
 * Suivi de version
 * 1.0.0 : 28/04/2016 : Tonyryu : Création plugin
 *
 */
var Imported = Imported || {};
Imported.Tonyryu_LimitBagBank = true;

var Tonyryu = Tonyryu || {};
Tonyryu.LBB = Tonyryu.LBB || {};

(function() {

  var parameters = PluginManager.parameters('Tonyryu_LimitBagBank');
  var paramGroupAllItemType = Number(parameters['GroupAllItemType'] || 0);
  var paramAddMenuDelete = Number(parameters['AddDeleteMenu'] || 1);
  var paramNameDeleteOption = String(parameters['NameDeleteOption'] || 'Jeter');
  var paramNameUseOption = String(parameters['NameUseOption'] || 'Utiliser');
  var paramNbrOfDiffItem = Number(parameters['NbrOfDiffItem'] || 20);
  var paramItemStackDefault = Number(parameters['ItemStackDefault'] || 99);
  var paramArmorStackDefault = Number(parameters['ArmorStackDefault'] || 1);
  var paramWeaponStackDefault = Number(parameters['WeaponStackDefault'] || 1);

 

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Party
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : nbAllTypeItems (ajout)
  * Fonction : retourne le nombre de type d'objet possédé
  * Params : --
  **********************************************************************/
  Game_Party.prototype.nbAllTypeItems = function() {
    return Object.keys(this._items).length + Object.keys(this._weapons).length + Object.keys(this._armors).length ;
  };
 
  /**********************************************************************
  * Méthode : bagFull (ajout)
  * Fonction : permet se savoir si le sac est plein
  * Params : --
  **********************************************************************/
  Game_Party.prototype.bagFull = function() {
    return (this.nbAllTypeItems() >= this._bagLimit);
  };
 
  /**********************************************************************
  * Méthode : stackLimit (ajout)
  * Fonction : retourne la limit d'un stack pour un objet
  * Params : --
  **********************************************************************/
  Game_Party.prototype.stackLimit = function(item) {
    var limit = 0 ;
    var typeItem = '';
    if (!item) {
      return 0;
    }
   
    limit = item.meta.StackLimit || 0;
   
    if (DataManager.isItem(item)) {
      typeItem = 'i';
      limit = this._modStackLimit._items[item.id] || limit;
    } else if (DataManager.isWeapon(item)) {
      typeItem = 'w';
      limit = this._modStackLimit._weapons[item.id] || limit;
    } else if (DataManager.isArmor(item)) {
      typeItem = 'a';
      limit = this._modStackLimit._armors[item.id] || limit;
    } else {
      return 0;
    }

    if(limit > 0)
      return limit;
   
    limit = item.meta.StackLimit || 0;

    if(limit > 0)
      return limit;
    if(typeItem === 'i')
      return paramItemStackDefault;
    if(typeItem === 'w')
      return paramWeaponStackDefault;
    if(typeItem === 'a')
      return paramArmorStackDefault;
  };
 
  /**********************************************************************
  * Méthode : initAllItems (surcharge)
  * Fonction : Ajoute la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_initAllItems = Game_Party.prototype.initAllItems;
  Game_Party.prototype.initAllItems = function() {
    _Game_Party_initAllItems.call(this);
    this._bank = {};
    this._bagLimit = paramNbrOfDiffItem;
    this._modStackLimit = {};
    this._modStackLimit._items = {};
    this._modStackLimit._weapons = {};
    this._modStackLimit._armors = {};
  };
 
  /**********************************************************************
  * Méthode : gainItem (surcharge)
  * Fonction : Ajoute ou retire une recette de la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_gainItem = Game_Party.prototype.gainItem;
  Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
    var nbr = this.numItems(item);
    var stackLimitItem = this.stackLimit(item);
    if(nbr === 0 && this.bagFull())
      return;
    else{
      var dif = stackLimitItem - nbr;
      if( dif === 0)
        return;
      if(dif < amount)
        amount = dif;
      _Game_Party_gainItem.call(this, item, amount, includeEquip);
    }
  };
 
 
 
  function Window_ItemAction() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemAction.prototype = Object.create(Window_HorzCommand.prototype);
  Window_ItemAction.prototype.constructor = Window_ItemAction;

  Window_ItemAction.prototype.initialize = function() {
    Window_HorzCommand.prototype.initialize.call(this, 0, 0);
    this.visible = false;
  };

  Window_ItemAction.prototype.windowWidth = function() {
    return Graphics.boxWidth;
  };

  Window_ItemAction.prototype.maxCols = function() {
    return 2;
  };

  Window_ItemAction.prototype.makeCommandList = function() {
    this.addCommand(paramNameUseOption,    'use');
    this.addCommand(paramNameDeleteOption, 'delete');
  };

 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Création d'une nouvelle "classe" Window_ItemCount
  *  hérite de la classe Window_Base
  *----------------------------------------------------------------------
  **********************************************************************/
  function Window_ItemCount() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemCount.prototype = Object.create(Window_Base.prototype);
  Window_ItemCount.prototype.constructor = Window_ItemCount;

  Window_ItemCount.prototype.initialize = function(pX, pY) {
    Window_Base.prototype.initialize.call(this, pX, pY, 100, this.fittingHeight(1));
    this._max = 0;
    this._number = 0;
    this.backOpacity = 0;
    this.opacity = 0;
  };
 
 
  Window_ItemCount.prototype.setData = function(pNumber, pMax) {
    this._max = pMax;
    this._number = pNumber;
    this.refresh();
  };
 
  Window_ItemCount.prototype.setMax = function(pMax) {
    this._max = pMax;
    this.refresh();
  };

  Window_ItemCount.prototype.setNumber = function(pNumber) {
    this._number = pNumber;
    this.refresh();
  };

  Window_ItemCount.prototype.refresh = function(){
    this.contents.clear();
    this.drawText(String(this._number)+'/'+String(this._max), 0, 0, this.contentsWidth());
  };
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Window_ItemList
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : includes (surcharge)
  * Fonction : permet de gérer la catégorie all
  * Params : --
  **********************************************************************/
  var _Window_ItemList_includes = Window_ItemList.prototype.includes;
  Window_ItemList.prototype.includes = function(item) {
    if(!item)
      return false;
    if(this._category !== 'all')
      return _Window_ItemList_includes.call(this, item);
    else{
      return true;
    }
  };

  var _Window_ItemList_setCategory = Window_ItemList.prototype.setCategory;
  Window_ItemList.prototype.setCategory = function(category) {
    if(paramGroupAllItemType === 1)
      category = 'all';
    _Window_ItemList_setCategory.call(this, category);
  };
 
  Window_ItemList.prototype.setMode = function(mode) {
    if(this._mode !== mode){
      this._mode = mode;
      this.refresh();
    }
  };
 
  var _Window_ItemList_isEnabled = Window_ItemList.prototype.isEnabled;
  Window_ItemList.prototype.isEnabled = function(item) {
    if((this._mode || 'use') === 'use')
      return _Window_ItemList_isEnabled.call(this, item);
    return true;
  };

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Scene_Item
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : create (surcharge)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  var _Scene_Item_create = Scene_Item.prototype.create;
  Scene_Item.prototype.create = function() {
    _Scene_Item_create.call(this);
    this.createItemCountWindow();
    this.createItemActionWindow();
   
    if(paramGroupAllItemType === 1){
      this._categoryWindow.visible = false;
      this._itemWindow.y -= this._categoryWindow.height;
      this._itemWindow.height += this._categoryWindow.height;
      this._itemWindow.setCategory('all');
    }
    if(paramAddMenuDelete === 1){
      this._itemActionWindow.visible = true;
      this._itemWindow.y += this._itemActionWindow.height;
      this._itemWindow.height -= this._itemActionWindow.height;
    }
   
    this._itemWindow.deactivate();
    this._itemActionWindow.deactivate();
    this._categoryWindow.deactivate();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this._itemWindow.activate();
      this._itemWindow.selectLast();
    }else if(paramGroupAllItemType === 1){
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }else{
      this._itemActionWindow.deselect();
      this._categoryWindow.activate();
    }
   
  };


  /**********************************************************************
  * Méthode : createItemCountWindow (ajout)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.createItemCountWindow = function() {
    this._itemCountWindow = new Window_ItemCount();
    this._itemCountWindow.setData($gameParty.nbAllTypeItems(), paramNbrOfDiffItem);
    this._itemCountWindow.x = this._itemWindow.width - this._itemCountWindow.width + 10;
    this._itemCountWindow.y = this._itemWindow.height - this._itemCountWindow.height + 10;
    this._itemWindow.addChild(this._itemCountWindow);
  };
 
  /**********************************************************************
  * Méthode : createItemActionWindow (ajout)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.createItemActionWindow = function() {
    this._itemActionWindow = new Window_ItemAction();
    this._itemActionWindow.y = this._helpWindow.height + (paramGroupAllItemType === 0 ? this._categoryWindow.height : 0);
    this._itemActionWindow.setHandler('ok', this.onOptionOk.bind(this));
    this._itemActionWindow.setHandler('cancel', this.onOptionCancel.bind(this));
    this._windowLayer.addChildAt(this._itemActionWindow, 0);

  };
 
  var _Scene_Item_onCategoryOk = Scene_Item.prototype.onCategoryOk;
  Scene_Item.prototype.onCategoryOk = function() {
    if(paramAddMenuDelete !== 1)
      _Scene_Item_onCategoryOk.call(this);
    else{
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }
  };
 
  Scene_Item.prototype.onOptionOk = function() {
    this._itemWindow.setMode(this._itemActionWindow.currentSymbol());
    this._itemWindow.activate();
    this._itemWindow.selectLast();
  };
 
  Scene_Item.prototype.onOptionCancel = function() {
    this._itemActionWindow.deselect();
    if(paramGroupAllItemType === 1)
      this.popScene();
    else{
      this._categoryWindow.activate();
    }
  };
 
  var _Scene_Item_onItemOk = Scene_Item.prototype.onItemOk;
  Scene_Item.prototype.onItemOk = function() {
    if(this._itemActionWindow.currentSymbol() === 'use'){
      _Scene_Item_onItemOk.call(this);
    }else{
      // TODO voir pour ajouter une fenêtre de spécification du nombre
      $gameParty.loseItem(this.item(), 1);
      this._itemWindow.refresh();
      this._itemWindow.activate();
      if(this._itemWindow.index() === this._itemWindow.maxItems() && this._itemWindow.index() !== 0)
        this._itemWindow.select(this._itemWindow.maxItems()-1);
      this._itemCountWindow.setNumber($gameParty.nbAllTypeItems());
    }
  };
 
  Scene_Item.prototype.onItemCancel = function() {
    this._itemWindow.deselect();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this.popScene();
    }else if(paramAddMenuDelete === 1){
      this._itemActionWindow.activate();
    }else{
      this._categoryWindow.activate();
    }
   
  };
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Interpreter
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : pluginCommand (surcharge)
  * Fonction : Ajoute la commande TonyryuAlchimie
  * Params : --
  **********************************************************************/
  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);

  };
 
})();

le fichier doit se nommer Tonyryu_LimitBagBank.js
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Sam 7 Mai 2016 - 11:43
merci beaucoup, je vais tester ça
juste une question : c'est quoi la banque ?

[edit]
j'ai donc testé ton plugin
est ce qu'il serai possible de remettre les items clés, j'avais dit dans ma demande de faire un sac "fourre tout" mais j'avais complètement zappé les items clés désolé.
comme je ne sais pas ce qu'il te reste à faire je ne sais pas si les bugs sont normal ou pas
j'ai réglé les stack à 12
j'ai créé deux coffres qui me donnent plein d'items

le premier donne 20 ethers, 20 cristaux d'eau et 20 grappes de raisin
quand je l'ouvre :
résultat attendu : dans l'inventaire je devrais avoir un stack de 12 ethers, un stack de 8 ether, idem pour les cristaux et les grappes de raisin
résultat constaté : dans l'inventaire j'ai un stack de 12 ethers, idem pour les deux autres items donc ce qui dépasse la capacité du stack est perdu

le deuxième coffre me donne une grappe de raisin et un cristal d'eau
là je les retrouve bien dans l'inventaire
mais j'ai un souci avec ton plugin d'alchimie v1.05
un cristal d'eau + une grappe de raisin = un jus de raisin

avec ce deuxième coffre pas de pb je fait mon jus de raisin et mes deux ingrédients disparaissent

par contre si j’atteins la limite de mon stack les ingrédients ne disparaissent pas et dans objet je ne peux pas les jeter non plus
si j'ai 11/12 items je peux les jeter sans pb
si j'ai 12/12 items quand je veux jeter l'item ça reste à 12

je ne sais pas si c'est ça que tu entendait par gestion de la banque

un autre pb avec l'alchimie :
si j'ai 1/12 grappe de raisin et 12/12 cristal d'eau
dans le menu alchimie je ne vois que 1/12 pour les 2 items
je clique sur jus de raisin, mes deux ingrédient tombent à 0/12
mais une fois revenu dans le menu objet j'ai bien ma grappe de raisin qui a disparu (normal) mais mon stack de cristal d'eau et toujours à 12/12
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Dim 8 Mai 2016 - 17:55
Oui, c'est le premier jet, ya encore pas mal de petite chose à régler.

Le multistack n'est pas actuellement géré, j'suis dessus.

Pour les problèmes d'alchimie, il y a un topic dédié.

La banque est la gestion du coffre. c'est en cours également.
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mar 10 Mai 2016 - 7:30
Pour les objets clefs qui ne sont pas géré par le fourre-tout, ça remet en cause pratiquement tout. Donc ça sera géré dans le fourre-tout avec la gestion de limite.

Le multistack pour un même objet nécessite la réécriture de la fenêtre de liste.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 11 Mai 2016 - 6:30
ok
n'y connaissant rien en programmation c'est vrai que j'ai du mal à savoir ce qui est difficilement faisable ou pas.

En tout cas un énorme merci à toi
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mer 11 Mai 2016 - 8:05
Voici une nouvelle version toujours en beta, et la fonctionnalité de coffre n'est pas encore présente, mais la notion de multi-stack est géré.

Cependant, je dois ajouter une vérification sur la gestion d'équipement afin de ne pas permettre de se déséquipper d'un objet si le sac est plein.

Code:
//=============================================================================
// Tonyryu_LimitBagBank.js
//=============================================================================

/*:
 * @plugindesc Plugin permettant de gérer une limite de l'inventaire
 * @version 0.0.2
 * @author Tonyryu
 *
 * @param GroupAllItemType
 * @desc Regrouper tous les types d'objet dans le menu objet (1 : actif)
 * @default 0
 *
 * @param AddDeleteMenu
 * @desc Ajouter un menu pour proposer le choix de jeter un objet (1 : actif)
 * @default 1
 *
 * @param NameUseOption
 * @desc Nom de l'option d'utilisation
 * @default Utiliser
 *
 * @param NameDeleteOption
 * @desc Nom de l'option de suppression
 * @default Jeter
 *
 * @param NbrOfDiffItem
 * @desc Nombre de type d'objet différent au départ
 * @default 20
 *
 * @param ItemStackDefault
 * @desc Quantité par défaut d'un stack pour les objets
 * @default 99
 *
 * @param ArmorStackDefault
 * @desc Quantité par défaut d'un stack pour les armures
 * @default 1
 *
 * @param WeaponStackDefault
 * @desc Quantité par défaut d'un stack pour les armes
 * @default 1
 *
 * @param BankNbrOfDiffItem
 * @desc Nombre de type d'objet différent dans la banque au départ
 * @default 100
 *
 * @help http://www.tonyryudev.com/
 *
 */

/*
 * Suivi de version
 *
 *
 */
var Imported = Imported || {};
Imported.Tonyryu_LimitBagBank = true;

var Tonyryu = Tonyryu || {};
Tonyryu.LBB = Tonyryu.LBB || {};

(function() {

  var parameters = PluginManager.parameters('Tonyryu_LimitBagBank');
  var paramGroupAllItemType = Number(parameters['GroupAllItemType'] || 0);
  var paramAddMenuDelete = Number(parameters['AddDeleteMenu'] || 1);
  var paramNameDeleteOption = String(parameters['NameDeleteOption'] || 'Jeter');
  var paramNameUseOption = String(parameters['NameUseOption'] || 'Utiliser');
  var paramNbrOfDiffItem = Number(parameters['NbrOfDiffItem'] || 20);
  var paramItemStackDefault = Number(parameters['ItemStackDefault'] || 99);
  var paramArmorStackDefault = Number(parameters['ArmorStackDefault'] || 1);
  var paramWeaponStackDefault = Number(parameters['WeaponStackDefault'] || 1);

 

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Party
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : initialize (surcharge)
  * Fonction : ajoute la notion de limite d'inventaire
  * Params : --
  **********************************************************************/
  var _Game_Party_initialize = Game_Party.prototype.initialize;
  Game_Party.prototype.initialize = function() {
    _Game_Party_initialize.call(this);
    this._limitNbrItem = paramNbrOfDiffItem;
  };
 
  /**********************************************************************
  * Méthode : numAllStack (ajout)
  * Fonction : retourne le nombre de stack dans l'inventaire
  * Params : --
  **********************************************************************/
  Game_Party.prototype.numAllStack = function() {
    // pour chaque objet possédés
    var n = 0;
    $gameParty.allItems().forEach(function(item) {
      n += $gameParty.numItemStack(item);
    });
    return n;
  };
 
  /**********************************************************************
  * Méthode : bagFull (ajout)
  * Fonction : permet se savoir si le sac est plein
  * Params : --
  **********************************************************************/
  Game_Party.prototype.bagFull = function() {
    return (this.numAllStack() >= this._bagLimit );
  };
 
  /**********************************************************************
  * Méthode : stackLimit (ajout)
  * Fonction : retourne la limite d'un stack pour un objet
  * Params : --
  **********************************************************************/
  Game_Party.prototype.stackLimit = function(item) {
    var limit = 0 ;
    var typeItem = '';
    if (!item) {
      return 1;
    }
   
    limit = item.meta.StackLimit || 0;
   
    if (DataManager.isItem(item)) {
      typeItem = 'i';
      limit = this._modStackLimit._items[item.id] || limit;
    } else if (DataManager.isWeapon(item)) {
      typeItem = 'w';
      limit = this._modStackLimit._weapons[item.id] || limit;
    } else if (DataManager.isArmor(item)) {
      typeItem = 'a';
      limit = this._modStackLimit._armors[item.id] || limit;
    } else {
      return 1;
    }

    if(limit > 0)
      return limit;
   
    limit = item.meta.StackLimit || 0;

    if(limit > 0)
      return limit;
    if(typeItem === 'i')
      return paramItemStackDefault;
    if(typeItem === 'w')
      return paramWeaponStackDefault;
    if(typeItem === 'a')
      return paramArmorStackDefault;
    return 1;
  };
 
  /**********************************************************************
  * Méthode : numItemStack (ajout)
  * Fonction : retourne le nombre de stack pris par un objet
  * Params : --
  **********************************************************************/
  Game_Party.prototype.numItemStack = function(item, offset) {
    if(this.numItems(item) === 0)
      return 0;
    return Math.floor((this.numItems(item)-1 + (offset || 0))/ this.stackLimit(item)) + 1;
  };
 
  /**********************************************************************
  * Méthode : initAllItems (surcharge)
  * Fonction : Ajoute la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_initAllItems = Game_Party.prototype.initAllItems;
  Game_Party.prototype.initAllItems = function() {
    _Game_Party_initAllItems.call(this);
    this._bank = {};
    this._bagLimit = paramNbrOfDiffItem;
    this._modStackLimit = {};
    this._modStackLimit._items = {};
    this._modStackLimit._weapons = {};
    this._modStackLimit._armors = {};
  };
 
  /**********************************************************************
  * Méthode : maxItems (remplacement)
  * Fonction : modifie la limite du nombre d'objet à 999999
  * Params : --
  **********************************************************************/
  Game_Party.prototype.maxItems = function(item) {
    return 999999;
  };
 
  /**********************************************************************
  * Méthode : gainItem (surcharge)
  * Fonction : Ajoute ou retire une recette de la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_gainItem = Game_Party.prototype.gainItem;
  Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
    if(amount < 0)
      _Game_Party_gainItem.call(this, item, amount, includeEquip);
    else{
      var stackLimit = this.stackLimit(item);
      var numItemStack = this.numItemStack(item);
      var stackPlus = this.numItemStack(item, amount) - numItemStack;
      if(this.numAllStack() + stackPlus <= this._bagLimit)
        _Game_Party_gainItem.call(this, item, amount, includeEquip);
      else{
        stackPlus = this._bagLimit - this.numAllStack();
        _Game_Party_gainItem.call(this, item, ((numItemStack + stackPlus) * stackLimit) - this.numItems(item), includeEquip);
      }
    }
  };
 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Création de la "classe" Window_ItemAction
  *----------------------------------------------------------------------
  **********************************************************************/
  function Window_ItemAction() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemAction.prototype = Object.create(Window_HorzCommand.prototype);
  Window_ItemAction.prototype.constructor = Window_ItemAction;

  /**********************************************************************
  * Méthode : initialize
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.initialize = function() {
    Window_HorzCommand.prototype.initialize.call(this, 0, 0);
    this.visible = false;
  };

  /**********************************************************************
  * Méthode : windowWidth
  * Fonction : retourne la largeur de la fenêtre de jeu
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.windowWidth = function() {
    return Graphics.boxWidth;
  };

  /**********************************************************************
  * Méthode : maxCols
  * Fonction : retourne le nombre max de colonne de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.maxCols = function() {
    return 2;
  };

  /**********************************************************************
  * Méthode : makeCommandList
  * Fonction : cré la liste des commande du menu
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.makeCommandList = function() {
    this.addCommand(paramNameUseOption,    'use');
    this.addCommand(paramNameDeleteOption, 'delete');
  };

 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Création d'une nouvelle "classe" Window_ItemCount
  *  hérite de la classe Window_Base
  *----------------------------------------------------------------------
  **********************************************************************/
  function Window_ItemCount() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemCount.prototype = Object.create(Window_Base.prototype);
  Window_ItemCount.prototype.constructor = Window_ItemCount;

  /**********************************************************************
  * Méthode : initialize
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.initialize = function(pX, pY) {
    Window_Base.prototype.initialize.call(this, pX, pY, 100, this.fittingHeight(1));
    this._max = $gameParty._limitNbrItem;
    this._number = $gameParty.numAllStack();
    this.backOpacity = 0;
    this.opacity = 0;
    this.refresh();
  };
 
  /**********************************************************************
  * Méthode : refresh
  * Fonction : permet de recréer le contenu de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.refresh = function(){
    this.contents.clear();
    this.drawText(String(this._number)+'/'+String(this._max), 0, 0, this.contentsWidth());
  };
 
  /**********************************************************************
  * Méthode : update
  * Fonction : vérifie un changement de données affichées
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.update = function(){
    if($gameParty.numAllStack() !== this._number || this._max !== $gameParty._limitNbrItem){
      this._max = $gameParty._limitNbrItem;
      this._number = $gameParty.numAllStack();
      this.refresh();
    }
  };
 

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Window_ItemList
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : initialize (surcharge)
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  var _Window_ItemList_initialize = Window_ItemList.prototype.initialize;
  Window_ItemList.prototype.initialize = function(x, y, width, height) {
    _Window_ItemList_initialize.call(this, x, y, width, height);
    this._dataNumItem = [];
    this._itemCountWindow = new Window_ItemCount();
    this._itemCountWindow.x = this.width - this._itemCountWindow.width + 14;
    this._itemCountWindow.y = this.height - this._itemCountWindow.height + 14;
    this.addChild(this._itemCountWindow);
   
  };

  /**********************************************************************
  * Méthode : spacing (ajout)
  * Fonction : définie à 12 l'espacement entre les objets
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.spacing = function() {
    return 12;
  };
 
  /**********************************************************************
  * Méthode : itemWidth (ajout)
  * Fonction : modifie la largeur de la sélection si compteur présent
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.itemWidth = function() {
    var newWidth = Window_Selectable.prototype.itemWidth.call(this);
    if(this._itemCountWindow)
      newWidth -= ((this.width - this._itemCountWindow.x) / this.maxCols());
    return newWidth;
  };

  /**********************************************************************
  * Méthode : includes (surcharge)
  * Fonction : permet de gérer la catégorie all
  * Params : --
  **********************************************************************/
  var _Window_ItemList_includes = Window_ItemList.prototype.includes;
  Window_ItemList.prototype.includes = function(item) {
    if(!item)
      return false;
    if(this._category !== 'all')
      return _Window_ItemList_includes.call(this, item);
    else{
      return true;
    }
  };

  /**********************************************************************
  * Méthode : setCategory (surcharge)
  * Fonction : permet d'afficher tous les objets si tout est groupé
  * Params : --
  **********************************************************************/
  var _Window_ItemList_setCategory = Window_ItemList.prototype.setCategory;
  Window_ItemList.prototype.setCategory = function(category) {
    if(paramGroupAllItemType === 1)
      category = 'all';
    _Window_ItemList_setCategory.call(this, category);
  };
 
  /**********************************************************************
  * Méthode : setMode (ajout)
  * Fonction : permet de changer le mode d'affichage
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.setMode = function(mode) {
    if(this._mode !== mode){
      this._mode = mode;
      this.refresh();
    }
  };
 
  /**********************************************************************
  * Méthode : isEnabled (surcharge)
  * Fonction : permet de rendre actif tous les objets si pas en mode 'use'
  * Params : --
  **********************************************************************/
  var _Window_ItemList_isEnabled = Window_ItemList.prototype.isEnabled;
  Window_ItemList.prototype.isEnabled = function(item) {
    if((this._mode || 'use') === 'use')
      return _Window_ItemList_isEnabled.call(this, item);
    return true;
  };
 
  /**********************************************************************
  * Méthode : makeItemList (surcharge)
  * Fonction : construit la liste des objets affichables
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.makeItemList = function() {
    this._data = [];
    this._dataNumItem = [];
    var dataItemParty = [];
    dataItemParty = $gameParty.allItems().filter(function(item) {
      return this.includes(item);
    }, this);
    if (this.includes(null)) {
      dataItemParty.push(null);
    }
   
    for(var i = 0; i < dataItemParty.length; i++) {
      var item = dataItemParty[i];
      if(item === null)
        this._data.push(item);
      else{
        var stackLimit = $gameParty.stackLimit(item);
        var num = $gameParty.numItems(item);
        while(num > 0) {
          var stackSize = Math.min(stackLimit, num);
          this._data.push(item);
          this._dataNumItem.push(stackSize);
          num -= stackLimit;
        }
      }
    }
  };
 
  /**********************************************************************
  * Méthode : drawItem (surcharge)
  * Fonction : ajoute la gestion du nombre d'objet sur un stack
  * Params : --
  **********************************************************************/
  var _Window_ItemList_drawItem = Window_ItemList.prototype.drawItem;
  Window_ItemList.prototype.drawItem = function(index) {
    this._numItemSave = this._dataNumItem[index];
    _Window_ItemList_drawItem.call(this, index);
  };
 
  /**********************************************************************
  * Méthode : drawItemNumber (surcharge)
  * Fonction : prend en charge la propriété du nombre d'objet d'un stack
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.drawItemNumber = function(item, x, y, width) {
    if (this.needsNumber()) {
      this.drawText(':', x, y, width - this.textWidth('00'), 'right');
      this.drawText(this._numItemSave, x, y, width, 'right');
    }
  };

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Scene_Item
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : create (surcharge)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  var _Scene_Item_create = Scene_Item.prototype.create;
  Scene_Item.prototype.create = function() {
    _Scene_Item_create.call(this);
    this.createItemActionWindow();
   
    if(paramGroupAllItemType === 1){
      this._categoryWindow.visible = false;
      this._itemWindow.y -= this._categoryWindow.height;
      this._itemWindow.height += this._categoryWindow.height;
      this._itemWindow.setCategory('all');
    }
    if(paramAddMenuDelete === 1){
      this._itemActionWindow.visible = true;
      this._itemWindow.y += this._itemActionWindow.height;
      this._itemWindow.height -= this._itemActionWindow.height;
    }
   
    this._itemWindow.deactivate();
    this._itemActionWindow.deactivate();
    this._categoryWindow.deactivate();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this._itemWindow.activate();
      this._itemWindow.selectLast();
    }else if(paramGroupAllItemType === 1){
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }else{
      this._itemActionWindow.deselect();
      this._categoryWindow.activate();
    }
   
  };
 
  /**********************************************************************
  * Méthode : createItemActionWindow (ajout)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.createItemActionWindow = function() {
    this._itemActionWindow = new Window_ItemAction();
    this._itemActionWindow.y = this._helpWindow.height + (paramGroupAllItemType === 0 ? this._categoryWindow.height : 0);
    this._itemActionWindow.setHandler('ok', this.onActionOk.bind(this));
    this._itemActionWindow.setHandler('cancel', this.onActionCancel.bind(this));
    this._windowLayer.addChildAt(this._itemActionWindow, 0);

  };
 
  /**********************************************************************
  * Méthode : onCategoryOk (surcharge)
  * Fonction : ajoute la gestion de suppression
  * Params : --
  **********************************************************************/
  var _Scene_Item_onCategoryOk = Scene_Item.prototype.onCategoryOk;
  Scene_Item.prototype.onCategoryOk = function() {
    if(paramAddMenuDelete !== 1)
      _Scene_Item_onCategoryOk.call(this);
    else{
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }
  };
 
  /**********************************************************************
  * Méthode : onActionOk (ajout)
  * Fonction : gère la validation du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onActionOk = function() {
    this._itemWindow.setMode(this._itemActionWindow.currentSymbol());
    this._itemWindow.activate();
    this._itemWindow.selectLast();
  };
 
  /**********************************************************************
  * Méthode : onActionCancel (ajout)
  * Fonction : gère l'annulation du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onActionCancel = function() {
    this._itemActionWindow.deselect();
    if(paramGroupAllItemType === 1)
      this.popScene();
    else{
      this._categoryWindow.activate();
    }
  };
 
  /**********************************************************************
  * Méthode : onItemOk (surcharge)
  * Fonction : ajoute la gestion de la suppression
  * Params : --
  **********************************************************************/
  var _Scene_Item_onItemOk = Scene_Item.prototype.onItemOk;
  Scene_Item.prototype.onItemOk = function() {
    if(this._itemActionWindow.currentSymbol() === 'use'){
      _Scene_Item_onItemOk.call(this);
    }else{
      // TODO voir pour ajouter une fenêtre de spécification du nombre
      $gameParty.loseItem(this.item(), 1);
      this._itemWindow.refresh();
      this._itemWindow.activate();
      if(this._itemWindow.index() === this._itemWindow.maxItems() && this._itemWindow.index() !== 0)
        this._itemWindow.select(this._itemWindow.maxItems()-1);
    }
  };
 
  /**********************************************************************
  * Méthode : onItemCancel (surcharge)
  * Fonction : ajoute la gestion du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onItemCancel = function() {
    this._itemWindow.deselect();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this.popScene();
    }else if(paramAddMenuDelete === 1){
      this._itemActionWindow.activate();
    }else{
      this._categoryWindow.activate();
    }
   
  };
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Interpreter
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : pluginCommand (surcharge)
  * Fonction : Ajoute la commande
  * Params : --
  **********************************************************************/
  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);

  };
 
})();
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mer 11 Mai 2016 - 9:25
ok je testerai ça en rentrant du boulot
juste une question : est-ce que le joueur pourra switcher d'équipement quand le sac est plein ?
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mer 11 Mai 2016 - 9:30
@scottsummers a écrit:juste une question : est-ce que le joueur pourra switcher d'équipement quand le sac est plein ?

en fait, ça dépendra des stack, et c'est pareil pour se déséquiper en soit.

Si l'arme a déséquiper peut être stacké par 5 et qu'il en existe déjà un exemplaire dans l'inventaire, le fait de se déséquiper ne va pas rajouter de stack, donc c'est possible. Et il en va de même pour le switch, si le sac contient 10 stack sur 10, et que l'on tente de remplacer une épée de fer équipé et non possédé dans l'inventaire par une épée de bronze que l'on a en 2 exemplaires dans l'équipement, ce ne sera pas possible, car le résultat de ce switch provoquera l'ajout d'un onzième stack pour l'épée de fer.

petit screen rapide :

avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Jeu 12 Mai 2016 - 10:47
effectivement ça fonctionne beaucoup mieux même avec l'alchimie

il y a juste un truc mais je n'arrive pas a comprendre quand cela se produit : en mettant la limite totale de l'inventaire à 20 slots à un moment j'ai dépassé de 1
j'avais 21/20 en bas à droite
mais pas moyen de savoir comment j'ai fait ça (pour le test j'ai juste un coffre qui donne plein d'items armes et armures)

merci
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Jeu 12 Mai 2016 - 12:28
tu as du déséquiper un objet, comme la vérification n'est pas encore présente a ce moment là, ça a du rajouter un stack.

Avec gestion de l'équipement :

Code:
//=============================================================================
// Tonyryu_LimitBagBank.js
//=============================================================================

/*:
 * @plugindesc Plugin permettant de gérer une limite de l'inventaire
 * @version 0.0.3
 * @author Tonyryu
 *
 * @param GroupAllItemType
 * @desc Regrouper tous les types d'objet dans le menu objet (1 : actif)
 * @default 0
 *
 * @param AddDeleteMenu
 * @desc Ajouter un menu pour proposer le choix de jeter un objet (1 : actif)
 * @default 1
 *
 * @param NameUseOption
 * @desc Nom de l'option d'utilisation
 * @default Utiliser
 *
 * @param NameDeleteOption
 * @desc Nom de l'option de suppression
 * @default Jeter
 *
 * @param NbrOfDiffItem
 * @desc Nombre de type d'objet différent au départ
 * @default 20
 *
 * @param ItemStackDefault
 * @desc Quantité par défaut d'un stack pour les objets
 * @default 99
 *
 * @param ArmorStackDefault
 * @desc Quantité par défaut d'un stack pour les armures
 * @default 1
 *
 * @param WeaponStackDefault
 * @desc Quantité par défaut d'un stack pour les armes
 * @default 1
 *
 * @param BankNbrOfDiffItem
 * @desc Nombre de type d'objet différent dans la banque au départ
 * @default 100
 *
 * @help http://www.tonyryudev.com/
 *
 */

/*
 * Suivi de version
 *
 *
 */
var Imported = Imported || {};
Imported.Tonyryu_LimitBagBank = true;

var Tonyryu = Tonyryu || {};
Tonyryu.LBB = Tonyryu.LBB || {};

(function() {

  var parameters = PluginManager.parameters('Tonyryu_LimitBagBank');
  var paramGroupAllItemType = Number(parameters['GroupAllItemType'] || 0);
  var paramAddMenuDelete = Number(parameters['AddDeleteMenu'] || 1);
  var paramNameDeleteOption = String(parameters['NameDeleteOption'] || 'Jeter');
  var paramNameUseOption = String(parameters['NameUseOption'] || 'Utiliser');
  var paramNbrOfDiffItem = Number(parameters['NbrOfDiffItem'] || 20);
  var paramItemStackDefault = Number(parameters['ItemStackDefault'] || 99);
  var paramArmorStackDefault = Number(parameters['ArmorStackDefault'] || 1);
  var paramWeaponStackDefault = Number(parameters['WeaponStackDefault'] || 1);

 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Actor
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : unequipPossible (ajout)
  * Fonction : vérifie la possibilité de déséquiper un slot
  * Params : --
  **********************************************************************/
  Game_Actor.prototype.unequipPossible = function(slotId) {
    var itemEquip = this.equips()[slotId];
    if($gameParty.bagFull() && itemEquip){
      var stackDif = $gameParty.numItemStack(itemEquip) - $gameParty.numItemStack(itemEquip, 1);
      if(stackDif < 0)
        return false;
    }
    return true;
  };

  /**********************************************************************
  * Méthode : changeEquipPossible (ajout)
  * Fonction : vérifie la possibilité de changer d'équipement
  * Params : --
  **********************************************************************/
  Game_Actor.prototype.changeEquipPossible = function(slotId, item) {
    var itemEquip = this.equips()[slotId];
    var stackDif = 0;
    if(itemEquip)
      stackDif += $gameParty.numItemStack(itemEquip, 1) - $gameParty.numItemStack(itemEquip);
    if(item)
      stackDif += $gameParty.numItemStack(item, -1) - $gameParty.numItemStack(item);
    return ($gameParty.numAllStack() + stackDif <= $gameParty._limitNbrItem);
  };
 
  /**********************************************************************
  * Méthode : changeEquip (surcharge)
  * Fonction : vérifie la possibilité de changer un slot
  * Params : --
  **********************************************************************/
  var _Game_Actor_changeEquip = Game_Actor.prototype.changeEquip;
  Game_Actor.prototype.changeEquip = function(slotId, item) {
    if(this.changeEquipPossible(slotId, item))
      _Game_Actor_changeEquip.call(this, slotId, item);
  };

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Party
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : initialize (surcharge)
  * Fonction : ajoute la notion de limite d'inventaire
  * Params : --
  **********************************************************************/
  var _Game_Party_initialize = Game_Party.prototype.initialize;
  Game_Party.prototype.initialize = function() {
    _Game_Party_initialize.call(this);
    this._limitNbrItem = paramNbrOfDiffItem;
  };
 
  /**********************************************************************
  * Méthode : numAllStack (ajout)
  * Fonction : retourne le nombre de stack dans l'inventaire
  * Params : --
  **********************************************************************/
  Game_Party.prototype.numAllStack = function() {
    // pour chaque objet possédés
    var n = 0;
    $gameParty.allItems().forEach(function(item) {
      n += $gameParty.numItemStack(item);
    });
    return n;
  };
 
  /**********************************************************************
  * Méthode : bagFull (ajout)
  * Fonction : permet se savoir si le sac est plein
  * Params : --
  **********************************************************************/
  Game_Party.prototype.bagFull = function() {
    return (this.numAllStack() >= this._bagLimit );
  };
 
  /**********************************************************************
  * Méthode : stackLimit (ajout)
  * Fonction : retourne la limite d'un stack pour un objet
  * Params : --
  **********************************************************************/
  Game_Party.prototype.stackLimit = function(item) {
    var limit = 0 ;
    var typeItem = '';
    if (!item) {
      return 1;
    }
   
    limit = item.meta.StackLimit || 0;
   
    if (DataManager.isItem(item)) {
      typeItem = 'i';
      limit = this._modStackLimit._items[item.id] || limit;
    } else if (DataManager.isWeapon(item)) {
      typeItem = 'w';
      limit = this._modStackLimit._weapons[item.id] || limit;
    } else if (DataManager.isArmor(item)) {
      typeItem = 'a';
      limit = this._modStackLimit._armors[item.id] || limit;
    } else {
      return 1;
    }

    if(limit > 0)
      return limit;
   
    limit = item.meta.StackLimit || 0;

    if(limit > 0)
      return limit;
    if(typeItem === 'i')
      return paramItemStackDefault;
    if(typeItem === 'w')
      return paramWeaponStackDefault;
    if(typeItem === 'a')
      return paramArmorStackDefault;
    return 1;
  };
 
  /**********************************************************************
  * Méthode : numItemStack (ajout)
  * Fonction : retourne le nombre de stack pris par un objet
  * Params : --
  **********************************************************************/
  Game_Party.prototype.numItemStack = function(item, offset) {
    if((this.numItems(item) + (offset || 0)) === 0)
      return 0;
    return Math.floor((this.numItems(item)-1 + (offset || 0))/ this.stackLimit(item)) + 1;
  };
 
  /**********************************************************************
  * Méthode : initAllItems (surcharge)
  * Fonction : Ajoute la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_initAllItems = Game_Party.prototype.initAllItems;
  Game_Party.prototype.initAllItems = function() {
    _Game_Party_initAllItems.call(this);
    this._bank = {};
    this._bagLimit = paramNbrOfDiffItem;
    this._modStackLimit = {};
    this._modStackLimit._items = {};
    this._modStackLimit._weapons = {};
    this._modStackLimit._armors = {};
  };
 
  /**********************************************************************
  * Méthode : maxItems (remplacement)
  * Fonction : modifie la limite du nombre d'objet à 999999
  * Params : --
  **********************************************************************/
  Game_Party.prototype.maxItems = function(item) {
    return 999999;
  };
 
  /**********************************************************************
  * Méthode : gainItem (surcharge)
  * Fonction : Ajoute ou retire une recette de la liste des recettes
  * Params : --
  **********************************************************************/
  var _Game_Party_gainItem = Game_Party.prototype.gainItem;
  Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
    if(amount < 0)
      _Game_Party_gainItem.call(this, item, amount, includeEquip);
    else{
      var stackLimit = this.stackLimit(item);
      var numItemStack = this.numItemStack(item);
      var stackPlus = this.numItemStack(item, amount) - numItemStack;
      if(this.numAllStack() + stackPlus <= this._bagLimit)
        _Game_Party_gainItem.call(this, item, amount, includeEquip);
      else{
        stackPlus = this._bagLimit - this.numAllStack();
        _Game_Party_gainItem.call(this, item, ((numItemStack + stackPlus) * stackLimit) - this.numItems(item), includeEquip);
      }
    }
  };
 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Création de la "classe" Window_ItemAction
  *----------------------------------------------------------------------
  **********************************************************************/
  function Window_ItemAction() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemAction.prototype = Object.create(Window_HorzCommand.prototype);
  Window_ItemAction.prototype.constructor = Window_ItemAction;

  /**********************************************************************
  * Méthode : initialize
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.initialize = function() {
    Window_HorzCommand.prototype.initialize.call(this, 0, 0);
    this.visible = false;
  };

  /**********************************************************************
  * Méthode : windowWidth
  * Fonction : retourne la largeur de la fenêtre de jeu
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.windowWidth = function() {
    return Graphics.boxWidth;
  };

  /**********************************************************************
  * Méthode : maxCols
  * Fonction : retourne le nombre max de colonne de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.maxCols = function() {
    return 2;
  };

  /**********************************************************************
  * Méthode : makeCommandList
  * Fonction : cré la liste des commande du menu
  * Params : --
  **********************************************************************/
  Window_ItemAction.prototype.makeCommandList = function() {
    this.addCommand(paramNameUseOption,    'use');
    this.addCommand(paramNameDeleteOption, 'delete');
  };

 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Création d'une nouvelle "classe" Window_ItemCount
  *  hérite de la classe Window_Base
  *----------------------------------------------------------------------
  **********************************************************************/
  function Window_ItemCount() {
    this.initialize.apply(this, arguments);
  }

  Window_ItemCount.prototype = Object.create(Window_Base.prototype);
  Window_ItemCount.prototype.constructor = Window_ItemCount;

  /**********************************************************************
  * Méthode : initialize
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.initialize = function(pX, pY) {
    Window_Base.prototype.initialize.call(this, pX, pY, 100, this.fittingHeight(1));
    this._max = $gameParty._limitNbrItem;
    this._number = $gameParty.numAllStack();
    this.backOpacity = 0;
    this.opacity = 0;
    this.refresh();
  };
 
  /**********************************************************************
  * Méthode : refresh
  * Fonction : permet de recréer le contenu de la fenêtre
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.refresh = function(){
    this.contents.clear();
    this.drawText(String(this._number)+'/'+String(this._max), 0, 0, this.contentsWidth());
  };
 
  /**********************************************************************
  * Méthode : update
  * Fonction : vérifie un changement de données affichées
  * Params : --
  **********************************************************************/
  Window_ItemCount.prototype.update = function(){
    if($gameParty.numAllStack() !== this._number || this._max !== $gameParty._limitNbrItem){
      this._max = $gameParty._limitNbrItem;
      this._number = $gameParty.numAllStack();
      this.refresh();
    }
  };
 

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Window_ItemList
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : initialize (surcharge)
  * Fonction : initialisation de la fenêtre
  * Params : --
  **********************************************************************/
  var _Window_ItemList_initialize = Window_ItemList.prototype.initialize;
  Window_ItemList.prototype.initialize = function(x, y, width, height) {
    _Window_ItemList_initialize.call(this, x, y, width, height);
    this._dataNumItem = [];
    this._itemCountWindow = new Window_ItemCount();
    this._itemCountWindow.x = this.width - this._itemCountWindow.width + 14;
    this._itemCountWindow.y = this.height - this._itemCountWindow.height + 14;
    this.addChild(this._itemCountWindow);
   
  };

  /**********************************************************************
  * Méthode : spacing (ajout)
  * Fonction : définie à 12 l'espacement entre les objets
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.spacing = function() {
    return 12;
  };
 
  /**********************************************************************
  * Méthode : itemWidth (ajout)
  * Fonction : modifie la largeur de la sélection si compteur présent
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.itemWidth = function() {
    var newWidth = Window_Selectable.prototype.itemWidth.call(this);
    if(this._itemCountWindow)
      newWidth -= ((this.width - this._itemCountWindow.x) / this.maxCols());
    return newWidth;
  };

  /**********************************************************************
  * Méthode : includes (surcharge)
  * Fonction : permet de gérer la catégorie all
  * Params : --
  **********************************************************************/
  var _Window_ItemList_includes = Window_ItemList.prototype.includes;
  Window_ItemList.prototype.includes = function(item) {
    if(!item)
      return false;
    if(this._category !== 'all')
      return _Window_ItemList_includes.call(this, item);
    else{
      return true;
    }
  };

  /**********************************************************************
  * Méthode : setCategory (surcharge)
  * Fonction : permet d'afficher tous les objets si tout est groupé
  * Params : --
  **********************************************************************/
  var _Window_ItemList_setCategory = Window_ItemList.prototype.setCategory;
  Window_ItemList.prototype.setCategory = function(category) {
    if(paramGroupAllItemType === 1)
      category = 'all';
    _Window_ItemList_setCategory.call(this, category);
  };
 
  /**********************************************************************
  * Méthode : setMode (ajout)
  * Fonction : permet de changer le mode d'affichage
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.setMode = function(mode) {
    if(this._mode !== mode){
      this._mode = mode;
      this.refresh();
    }
  };
 
  /**********************************************************************
  * Méthode : isEnabled (surcharge)
  * Fonction : permet de rendre actif tous les objets si pas en mode 'use'
  * Params : --
  **********************************************************************/
  var _Window_ItemList_isEnabled = Window_ItemList.prototype.isEnabled;
  Window_ItemList.prototype.isEnabled = function(item) {
    if((this._mode || 'use') === 'use')
      return _Window_ItemList_isEnabled.call(this, item);
    return true;
  };
 
  /**********************************************************************
  * Méthode : makeItemList (surcharge)
  * Fonction : construit la liste des objets affichables
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.makeItemList = function() {
    this._data = [];
    this._dataNumItem = [];
    var dataItemParty = [];
    dataItemParty = $gameParty.allItems().filter(function(item) {
      return this.includes(item);
    }, this);
    if (this.includes(null)) {
      dataItemParty.push(null);
    }
   
    for(var i = 0; i < dataItemParty.length; i++) {
      var item = dataItemParty[i];
      if(item === null)
        this._data.push(item);
      else{
        var stackLimit = $gameParty.stackLimit(item);
        var num = $gameParty.numItems(item);
        while(num > 0) {
          var stackSize = Math.min(stackLimit, num);
          this._data.push(item);
          this._dataNumItem.push(stackSize);
          num -= stackLimit;
        }
      }
    }
  };
 
  /**********************************************************************
  * Méthode : drawItem (surcharge)
  * Fonction : ajoute la gestion du nombre d'objet sur un stack
  * Params : --
  **********************************************************************/
  var _Window_ItemList_drawItem = Window_ItemList.prototype.drawItem;
  Window_ItemList.prototype.drawItem = function(index) {
    this._numItemSave = this._dataNumItem[index];
    _Window_ItemList_drawItem.call(this, index);
  };
 
  /**********************************************************************
  * Méthode : drawItemNumber (surcharge)
  * Fonction : prend en charge la propriété du nombre d'objet d'un stack
  * Params : --
  **********************************************************************/
  Window_ItemList.prototype.drawItemNumber = function(item, x, y, width) {
    if (this.needsNumber()) {
      this.drawText(':', x, y, width - this.textWidth('00'), 'right');
      this.drawText(this._numItemSave, x, y, width, 'right');
    }
  };

  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Scene_Item
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : create (surcharge)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  var _Scene_Item_create = Scene_Item.prototype.create;
  Scene_Item.prototype.create = function() {
    _Scene_Item_create.call(this);
    this.createItemActionWindow();
   
    if(paramGroupAllItemType === 1){
      this._categoryWindow.visible = false;
      this._itemWindow.y -= this._categoryWindow.height;
      this._itemWindow.height += this._categoryWindow.height;
      this._itemWindow.setCategory('all');
    }
    if(paramAddMenuDelete === 1){
      this._itemActionWindow.visible = true;
      this._itemWindow.y += this._itemActionWindow.height;
      this._itemWindow.height -= this._itemActionWindow.height;
    }
   
    this._itemWindow.deactivate();
    this._itemActionWindow.deactivate();
    this._categoryWindow.deactivate();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this._itemWindow.activate();
      this._itemWindow.selectLast();
    }else if(paramGroupAllItemType === 1){
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }else{
      this._itemActionWindow.deselect();
      this._categoryWindow.activate();
    }
   
  };
 
  /**********************************************************************
  * Méthode : createItemActionWindow (ajout)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.createItemActionWindow = function() {
    this._itemActionWindow = new Window_ItemAction();
    this._itemActionWindow.y = this._helpWindow.height + (paramGroupAllItemType === 0 ? this._categoryWindow.height : 0);
    this._itemActionWindow.setHandler('ok', this.onActionOk.bind(this));
    this._itemActionWindow.setHandler('cancel', this.onActionCancel.bind(this));
    this._windowLayer.addChildAt(this._itemActionWindow, 0);

  };
 
  /**********************************************************************
  * Méthode : onCategoryOk (surcharge)
  * Fonction : ajoute la gestion de suppression
  * Params : --
  **********************************************************************/
  var _Scene_Item_onCategoryOk = Scene_Item.prototype.onCategoryOk;
  Scene_Item.prototype.onCategoryOk = function() {
    if(paramAddMenuDelete !== 1)
      _Scene_Item_onCategoryOk.call(this);
    else{
      this._itemActionWindow.select(0);
      this._itemActionWindow.activate();
    }
  };
 
  /**********************************************************************
  * Méthode : onActionOk (ajout)
  * Fonction : gère la validation du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onActionOk = function() {
    this._itemWindow.setMode(this._itemActionWindow.currentSymbol());
    this._itemWindow.activate();
    this._itemWindow.selectLast();
  };
 
  /**********************************************************************
  * Méthode : onActionCancel (ajout)
  * Fonction : gère l'annulation du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onActionCancel = function() {
    this._itemActionWindow.deselect();
    if(paramGroupAllItemType === 1)
      this.popScene();
    else{
      this._categoryWindow.activate();
    }
  };
 
  /**********************************************************************
  * Méthode : onItemOk (surcharge)
  * Fonction : ajoute la gestion de la suppression
  * Params : --
  **********************************************************************/
  var _Scene_Item_onItemOk = Scene_Item.prototype.onItemOk;
  Scene_Item.prototype.onItemOk = function() {
    if(this._itemActionWindow.currentSymbol() === 'use'){
      _Scene_Item_onItemOk.call(this);
    }else{
      // TODO voir pour ajouter une fenêtre de spécification du nombre
      $gameParty.loseItem(this.item(), 1);
      this._itemWindow.refresh();
      this._itemWindow.activate();
      if(this._itemWindow.index() === this._itemWindow.maxItems() && this._itemWindow.index() !== 0)
        this._itemWindow.select(this._itemWindow.maxItems()-1);
    }
  };
 
  /**********************************************************************
  * Méthode : onItemCancel (surcharge)
  * Fonction : ajoute la gestion du menu d'action
  * Params : --
  **********************************************************************/
  Scene_Item.prototype.onItemCancel = function() {
    this._itemWindow.deselect();
    if(paramGroupAllItemType === 1 && paramAddMenuDelete !== 1){
      this.popScene();
    }else if(paramAddMenuDelete === 1){
      this._itemActionWindow.activate();
    }else{
      this._categoryWindow.activate();
    }
   
  };
 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Scene_Equip
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : onItemOk (surcharge)
  * Fonction : Ajoute l'appel à la fonction de création de la fenêtre ItemCount
  * Params : --
  **********************************************************************/
  var _Scene_Equip_onItemOk = Scene_Equip.prototype.onItemOk;
  Scene_Equip.prototype.onItemOk = function() {
    //var itemEquip = this.actor().equips()[this._slotWindow.index()];
    /*
    var changeOk = true;
    if($gameParty.bagFull()){
      var itemBag = this._itemWindow.item();
      if(itemBag){
        var stackDif = $gameParty.numItemStack(itemBag) - $gameParty.numItemStack(itemBag, -1);
        if(stackDif === 0 && !this.actor().unequipPossible(this._slotWindow.index()))
          changeOk = false;
      }else
        changeOk = this.actor().unequipPossible(this._slotWindow.index());
    }
    if(changeOk)
      _Scene_Equip_onItemOk.call(this);
    else{
      SoundManager.playBuzzer();
      this._itemWindow.activate();
    }*/
    if(this.actor().changeEquipPossible(this._slotWindow.index(), this._itemWindow.item()))
      _Scene_Equip_onItemOk.call(this);
    else{
      SoundManager.playBuzzer();
      this._itemWindow.activate();
    }
  };
 
 
  /**********************************************************************
  *----------------------------------------------------------------------
  * Modification de la "classe" Game_Interpreter
  *----------------------------------------------------------------------
  **********************************************************************/
  /**********************************************************************
  * Méthode : pluginCommand (surcharge)
  * Fonction : Ajoute la commande
  * Params : --
  **********************************************************************/
  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);

  };
 
})();

je m'attaque à la gestion des coffres de stockages.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Lun 23 Mai 2016 - 6:27
impeccable, merci
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Lun 23 Mai 2016 - 7:27
J'attendais ton retour sur cette partie pour continuer la gestion de coffre, je te fais ça au plus vite.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mar 24 Mai 2016 - 13:47
merci Smile
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Mar 31 Mai 2016 - 13:22
des nouvelles ?
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Mar 31 Mai 2016 - 21:52
Je ne t'ai pas oublié, t'en fait pas, mais, j'ai des grosses journées de taf, et j'ai du mal a coder le soir. je te fini ça Jeudi.
avatar
tonyryu
Membre

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

Résolu Re: limiteur d'inventaire

le Ven 3 Juin 2016 - 7:50
ça prend un peu plus de temps que prévu, la gestion de banque ou coffre (enfin un endroit de stockage d'objet), nécessite l'écriture de pas mal de fonction de gestion d'objet dans ce module.
Actuellement, la partie visuel est terminée, mais toute la partie contrôleur n'est pas encore géré.
avatar
scottsummers
Membre

Nombre de messages : 197
Distinction : aucune
Date d'inscription : 14/06/2015

Résolu Re: limiteur d'inventaire

le Ven 3 Juin 2016 - 17:01
pas de souci, il n'y a pas le feu au lac lol
pour l'instant je m'arrache les cheveux avec le job de summoner
encore merci à toi
Contenu sponsorisé

Résolu Re: limiteur d'inventaire

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