【RPG Maker MV】突破等级和属性最大值的限制

作者:邻家校长

这个插件作用是突破MV等级和属性的最大值上限。MV最大等级在【数据库-角色-最高等级】中最大值只能设置为99,各项属性在【数据库-职业-参数曲线】中HP/MP最大值为9999,其他为999。

内容

  • 修改等级上限和每级属性值
  • 定义每级属性基准参数
  • 修改每个属性的最大值
    [图片上传中...(Lv1.png-d4ae5e-1603288538421-0)]
  • 修改经验值曲线

1.修改等级上限和每级属性值

修改等级首先需要找到原本存放最大等级上限的数据字段。该字段位置在 data/Actors.json/ 每一行的maxLevel,如果直接修改该字段使值大于99,在游戏中打开需要展示人物数据的地方都会报错,并且每次在工程项目中皆会覆盖修改的值。因此,更改值的地方最好是在第一次加载数据的地方。

首先我们在【数据库-职业-备注】中添加等级数据MaxLevel:200

Lv1.png

在MV中,会在DataManager.loadDataFile方法中加载数据文件。所以,接下来开始修改该方法,在其中加入方法ModifyActorInitializeAttribute

xhr.onload = function() {
        if (xhr.status < 400) {
            window[name] = JSON.parse(xhr.responseText);
            DataManager.onLoad(window[name]);
        }
        ModifyActorInitializeAttribute();
    };

function ModifyActorInitializeAttribute(){
    if($dataActors != null && $dataClasses != null){
        for(var i = 0; i < $dataActors.length; i++){
            if($dataActors[i] != null && $dataClasses[$dataActors[i].classId].note != ""){
                ModifyMaxLevel(i, JSON.parse($dataClasses[$dataActors[i].classId].note));
             }
        }
    }
}

ModifyActorInitializeAttribute中有着这么一个判断if($dataActors != null && $dataClasses != null),是因为我们MaxLevel是在职业备注栏中设置而不是角色备注栏,所以需要两个数据对象都有数据后才能对其修改。遍历队伍列表,对每一个角色的职业获取对应的等级,并传入在,在ModifyMaxLevel方法中修改。

///修改最大等级上限
///param:index 角色位置索引
///param:str 职业的备注数据
function ModifyMaxLevel(index, str){
    //如果插件参数不是默认值,则取插件参数为最大等级,否则取职业备注栏第一项为最大值
    if(Moghunter.MaxLevel != 99 ){
        _MaxLevel = Moghunter.MaxLevel;
    }else{
        if(str.hasOwnProperty("MaxLevel")){
            _MaxLevel = Number(str.MaxLevel) || 99;
        }
    }
    
    $dataActors[index].maxLevel = _MaxLevel;
}

到这里,队伍中每个角色的最大等级就已经修改完毕。但是别急,此时运行游戏将会引发异常。其原因是Game_Actor.prototype.paramBasethis.currentClass().params[paramId][this._level];导致的。
这一句的意思是获取对应【this.职业.参数曲线[参数id][等级索引]】。
MV项目在保存时会把Hp/Mp等八个参数的Lv0-Lv99的所有数据保存在params参数中。所有,当等级大于99时,params[paramId][200]将取不到数据,那么在展示数据的地方就会抛出异常的。接下来就是解决它。重写Game_Actor.prototype.paramBase

 var _Game_Actor_paramBase = Game_Actor.prototype.paramBase;
 Game_Actor.prototype.paramBase = function(paramId){
      // return this.currentClass().params[paramId][this._level];
     return CalculateValue(this.currentClass(),paramId,this._level);
     
 };

///每一级成长属性
function CalculateValue(classId,paramId,level){
    var MinVlaue = classId.params[paramId][1];
    var MaxVlaue = classId.params[paramId][99];
    
    var kVlaue = DecimalsValue((MaxVlaue - MinVlaue) / 98, 3);
    var bVlaue = MinVlaue - kVlaue;
    
    var sVlaue = DecimalsValueAdd(kVlaue * level + bVlaue, true);
    
    return sVlaue;
}
///保留小数位数
function DecimalsValue(value,leng){
    var index = value.toString().indexOf('.');
    if(index !== -1){
        value = value.toString().substring(0,index + leng + 1);
    }
    return value;
}
///有小数就加/减一
function DecimalsValueAdd(value, b){
    return b === true ? Math.ceil(value) : Math.floor(value);
}

CalculateValue这里使用的是mv属性计算公式,里面的代码可以自由发挥。比如Hp的值,可以是if(paramId === 0) return classId.params[paramId][level*100],这样1级hp就是100,200级hp就是2w。

2.定义每级属性基准参数

如果前面在CalculateValue方法中使用自定义属性成长公式的可以跳过这一步。

在【数据库-职业-备注】中添加一个AttributList属性有8个参数lv1和lv99级的数据共16个值。


Lv2.png
///修改属性上限
function ModifyInitializeAttribute(){
    
    if($dataActors != null && $dataClasses != null){
        for(var i = 0; i < $dataActors.length; i++){
            if($dataActors[i] != null){
                ModifyMaxLevel(i, $dataClasses[$dataActors[i].classId].note);
             }
        }
    }
    
    if($dataClasses != null){
        ModifyDataClasses();
    }
}

///修改$dataClasses初始数据
function ModifyDataClasses(){
    var _note = [];
    for(var i = 0; i < $dataClasses.length; i++){
        if($dataClasses[i] != null && $dataClasses[i].note != ""){
            
            _note = JSON.parse($dataClasses[i].note);
            
            ModifyAttributList(i, _note || "0");
            
            //ModifyExpParams(i, _note || "0");
                
        }
    }
}

///修改成长值属性
function ModifyAttributList(index, note){
    var _AttributList = [];
                
    if(note.hasOwnProperty("AttributList")){
        _AttributList = note.AttributList;
    }
    
    if( _AttributList.length != 16 && Moghunter.AttributList.length > 0){
        _AttributList = Moghunter.AttributList.split(",") || [];
    }
    
    if(_AttributList.length == 16){
        var _index = 99;
        for(var i = 0; i < 16; i++){
            _index = _index === 99 ? 1 : 99;
            $dataClasses[index].params[this.DecimalsValueAdd(i/2, false)][_index] = Number(_AttributList[i]);
        }
    }
}

修改ModifyInitializeAttribute方法,加上ModifyDataClasses方法。在ModifyAttributList_index 参数是对应params[paramId]lv1lv99的下标。同时因为16个值是严格按照[MinHp,MaxHp,MinMp.....]排列的,所以二维数组的第一个下标只需要除以2再抹除小数位数就可以了

3.修改每个属性的最大值

MV中人物8个属性最大值在Game_Actor.prototype.paramMax方法中限制MHP9999,其他6个属性为999。所以需要重写该方法。

var _Game_Actor_paramMax = Game_Actor.prototype.paramMax;
Game_Actor.prototype.paramMax = function(paramId) {
        return  100000000;
};

这样最大值就是1个亿而非不到1w的属性了,感觉从此能秒天秒地秒空气。这里也可以修改为取插件参数的值。

4.修改经验值曲线

备注中的ExeList4个参数的作用基本值,补正值,增加度a,增加度b

Lv3.png

取消上文ModifyDataClasses方法中//ModifyExpParams(i, _note || "0");的注释加入以下方法:

///修改经验值曲线
function ModifyExpParams(index, note){
    var _Exp = [];
    
    //先获取备注的信息  
    if(note.hasOwnProperty("ExeList")){
        _Exp = note.ExeList;
    }
    
    //长度不足4位或插件有定义数据再获取插件参数信息
    if( _Exp.length != 4 && Moghunter.ExeList.length > 0){
        _Exp =  Moghunter.ExeList.split(",") || [];
    }

    //参数不足就不改
    if(_Exp.length == 4){
        for(var i = 0; i < 4; i++){
            $dataClasses[index].expParams[i] = Number(_Exp[i]);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352