设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5370|回复: 5
打印 上一主题 下一主题

[原创发布] 简单的物品掉落扩展插件

[复制链接]

Lv1.梦旅人

巫女会长

梦石
0
星屑
60
在线时间
1028 小时
注册时间
2009-10-24
帖子
3470

贵宾

跳转到指定楼层
1
发表于 2016-2-1 06:58:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 dukesward 于 2016-2-1 08:05 编辑

偷懒做的简单插件。

使用方法:
按照以下格式添加到数据库 敌人 的备注栏
<loot:掉落数[物品1:权重1,物品2:权重2,...]>
每样物品以 物品类别-物品id:权重 格式添加,物品之间用逗号分隔
例如:
<loot:2[w-1:3,i-1:2,a-2:5]>表示该敌人将会从id3的武器,id1的道具和id2的防具中选择两样掉落
注: i=道具 w=武器 a=防具

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

JAVASCRIPT 代码复制
  1. //===========================================================
  2. //RPG Maker MV Improved Loot System
  3. //使用方法:
  4. //按照以下格式添加到数据库 敌人 的备注栏
  5. //<loot:掉落数[物品1:权重1,物品2:权重2,...]>
  6. //每样物品以 物品类别-物品id:权重 格式添加,物品之间用','分隔
  7. //例如:<loot:2[w-1:3,i-1:2,a-2:5]>
  8. //i:道具 w:武器 a:防具
  9. //author:dukesward
  10. //version: 1.0
  11. //===========================================================
  12. //rpg_objects.js::4267
  13. var Game_Enemy_Alias = Game_Enemy_Alias || {},
  14.         ITEM_TYPE_MAPPING = {
  15.                 'i': 'Items',
  16.                 'w': 'Weapons',
  17.                 'a': 'Armors'
  18.         };
  19.  
  20. Array.prototype.removeItem = function(item) {
  21.         var temp = [];
  22.  
  23.         for(var i in this) {
  24.                 if(this.hasOwnProperty(i) && this[i] !== item) temp.push(this[i]);
  25.         }
  26.         return temp;
  27. };
  28.  
  29. Game_Enemy_Alias.setup = Game_Enemy.prototype.setup;
  30. Game_Enemy.prototype.setup = function(enemyId, x, y) {
  31.         Game_Enemy_Alias.setup.call(this, enemyId, x, y);
  32.         //load loot data from enemy metadata
  33.         this.processLoot();
  34. }
  35.  
  36. Game_Enemy.prototype.processLoot = function() {
  37.         var loot = this.enemy().meta.loot,
  38.               re = /([0-9])\[(.*)\]/,
  39.               match = loot ? loot.match(re) : null;
  40.         //set number of drop items and drop item list
  41.         if(match) {
  42.                 this._lootNumber = parseInt(match[1]);
  43.                 this._lootList = match[2].split(',');
  44.         }
  45. }
  46.  
  47. //rpg_objects::4327
  48. Game_Enemy.prototype.makeDropItems = function() {
  49.         var list = this._lootList,
  50.               dropped = [],
  51.               debug = 0;
  52.  
  53.         while(dropped.length < this._lootNumber && list.length > 0) {
  54.                 var prevRate = 0, temp = [], total = this.calculateTotalRate(list);
  55.                 var rand = Math.random();
  56.                 inner:
  57.                 for(var i in list) {
  58.                         if(list.hasOwnProperty(i)) {
  59.                                 var tokens = list[i].split(':');
  60.                                 prevRate = temp[1] || 0;
  61.                                 //caculate drop rate for each item in dropitem list
  62.                                 temp = this.calculateDropRate(tokens[1], total, prevRate);
  63.  
  64.                                 if(this.isDropped(rand, temp)) {
  65.                                         var info = tokens[0].split('-'),
  66.                                                 type = info[0] ? ITEM_TYPE_MAPPING[info[0]] : null,
  67.                                                 item = info[1] ? window['$data'+type][info[1]] : null;
  68.                                         //add dropped item into dropped, meanwhile remove from list
  69.                                         dropped.push(item);
  70.                                         list = list.removeItem(list[i]);
  71.                                         break inner;
  72.                                 }
  73.                         }
  74.                 }
  75.         }
  76.         return dropped;
  77. }
  78.  
  79. Game_Enemy.prototype.calculateTotalRate = function(items) {
  80.         var total = 0;
  81.         //loop through items and add all rates up
  82.         for(var i in items) {
  83.                 if(items.hasOwnProperty(i)) {
  84.                         var tokens = items[i].split(':'),
  85.                                 rate = parseInt(tokens[1]) || 0;
  86.  
  87.                         total += rate;
  88.                 }
  89.         }
  90.         return total;
  91. }
  92.  
  93. Game_Enemy.prototype.calculateDropRate = function(rate, total, prev) {
  94.         var temp = prev,
  95.                 rate = parseInt(rate) || 0,
  96.                 rateToAdd = Math.round(rate/total*100)/100 + prev;
  97.         //the range of drop rate is determined by both current and prev items
  98.         return [temp, rateToAdd];
  99. };
  100.  
  101. Game_Enemy.prototype.isDropped = function(rand, range) {
  102.         return rand > range[0] && rand < range[1];
  103. }

评分

参与人数 2梦石 +1 +1 收起 理由
一纸书凡 + 1 厉害
余烬之中 + 1 原创发布

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
179 小时
注册时间
2013-12-8
帖子
100
2
发表于 2016-2-1 11:54:52 | 只看该作者
挺好的啊,权重计算掉落也是个不错的思路呢。(主要可以多掉落感觉挺不错的),加油

全部RM技能点全都点到了做地图和写文本上了,别拦着我我准备去点那个专精点!(大义凛然状
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
992
在线时间
108 小时
注册时间
2022-7-2
帖子
149
3
发表于 2022-7-6 17:29:22 | 只看该作者
6666666666
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
118
在线时间
19 小时
注册时间
2022-11-19
帖子
22
4
发表于 2022-11-21 12:08:12 | 只看该作者
可以增加掉落物个数吗 原版只有三个实在不够用
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
264
在线时间
18 小时
注册时间
2023-3-3
帖子
31
5
发表于 2023-3-3 16:30:19 | 只看该作者
谢谢谢谢谢谢谢谢谢谢谢谢‘
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
40
在线时间
8 小时
注册时间
2023-7-19
帖子
26
6
发表于 2023-7-23 12:32:57 | 只看该作者
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 07:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表