じ☆ve冰风 发表于 7 天前

简单的物品掉落扩展插件

偷懒做的简单插件。

使用方法:
按照以下格式添加到数据库 敌人 的备注栏

每样物品以 物品类别-物品id:权重 格式添加,物品之间用逗号分隔
例如:
表示该敌人将会从id3的武器,id1的道具和id2的防具中选择两样掉落
注: i=道具 w=武器 a=防具

功能:
1.根据权重判断掉落。权重数字越大掉落的概率越大。
2.允许掉落任意数量的物品。在备注栏定义 掉落数 即可。

JAVASCRIPT 代码
//===========================================================
//RPG Maker MV Improved Loot System
//使用方法:
//按照以下格式添加到数据库 敌人 的备注栏
//
//每样物品以 物品类别-物品id:权重 格式添加,物品之间用','分隔
//例如:
//i:道具 w:武器 a:防具
//author:dukesward
//version: 1.0
//===========================================================
//rpg_objects.js::4267
var Game_Enemy_Alias = Game_Enemy_Alias || {},
      ITEM_TYPE_MAPPING = {
                'i': 'Items',
                'w': 'Weapons',
                'a': 'Armors'
      };

Array.prototype.removeItem = function(item){
      var temp = [];

      for(var i inthis){
                if(this.hasOwnProperty(i) && this !== item) temp.push(this);
      }
      return temp;
};

Game_Enemy_Alias.setup = Game_Enemy.prototype.setup;
Game_Enemy.prototype.setup = function(enemyId, x, y){
      Game_Enemy_Alias.setup.call(this, enemyId, x, y);
      //load loot data from enemy metadata
      this.processLoot();
}

Game_Enemy.prototype.processLoot = function(){
      var loot = this.enemy().meta.loot,
            re = /()\[(.*)\]/,
            match = loot ? loot.match(re) : null;
      //set number of drop items and drop item list
      if(match){
                this._lootNumber = parseInt(match);
                this._lootList = match.split(',');
      }
}

//rpg_objects::4327
Game_Enemy.prototype.makeDropItems = function(){
      var list = this._lootList,
            dropped = [],
            debug = 0;

      while(dropped.length < this._lootNumber && list.length > 0){
                var prevRate = 0, temp = [], total = this.calculateTotalRate(list);
                var rand = Math.random();
                inner:
                for(var i in list){
                        if(list.hasOwnProperty(i)){
                              var tokens = list.split(':');
                              prevRate = temp || 0;
                              //caculate drop rate for each item in dropitem list
                              temp = this.calculateDropRate(tokens, total, prevRate);

                              if(this.isDropped(rand, temp)){
                                        var info = tokens.split('-'),
                                                type = info ? ITEM_TYPE_MAPPING] : null,
                                                item = info ? window['$data'+type]] : null;
                                        //add dropped item into dropped, meanwhile remove from list
                                        dropped.push(item);
                                        list = list.removeItem(list);
                                        break inner;
                              }
                        }
                }
      }
      return dropped;
}

Game_Enemy.prototype.calculateTotalRate = function(items){
      var total = 0;
      //loop through items and add all rates up
      for(var i in items){
                if(items.hasOwnProperty(i)){
                        var tokens = items.split(':'),
                              rate = parseInt(tokens) || 0;

                        total += rate;
                }
      }
      return total;
}

Game_Enemy.prototype.calculateDropRate = function(rate, total, prev){
      var temp = prev,
                rate = parseInt(rate) || 0,
                rateToAdd = Math.round(rate/total*100)/100 + prev;
      //the range of drop rate is determined by both current and prev items
      return;
};

Game_Enemy.prototype.isDropped = function(rand, range){
      return rand > range && rand < range;
}

            本帖来自P1论坛作者dukesward,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=388947若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 简单的物品掉落扩展插件