【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]);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。