作者:邻家校长
这个插件作用是突破MV等级和属性的最大值上限。MV最大等级在【数据库-角色-最高等级】中最大值只能设置为99,各项属性在【数据库-职业-参数曲线】中HP/MP最大值为9999,其他为999。
内容
- 修改等级上限和每级属性值
- 定义每级属性基准参数
- 修改每个属性的最大值
[图片上传中...(Lv1.png-d4ae5e-1603288538421-0)] - 修改经验值曲线
1.修改等级上限和每级属性值
修改等级首先需要找到原本存放最大等级上限的数据字段。该字段位置在 data/Actors.json/
每一行的maxLevel
,如果直接修改该字段使值大于99,在游戏中打开需要展示人物数据的地方都会报错,并且每次在工程项目中皆会覆盖修改的值。因此,更改值的地方最好是在第一次加载数据的地方。
首先我们在【数据库-职业-备注】中添加等级数据MaxLevel:200
。
在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.paramBase
中this.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个值。
///修改属性上限
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]
的lv1
和lv99
的下标。同时因为16个值是严格按照[MinHp,MaxHp,MinMp.....]
排列的,所以二维数组的第一个下标只需要除以2再抹除小数位数就可以了
3.修改每个属性的最大值
MV中人物8个属性最大值在Game_Actor.prototype.paramMax
方法中限制MHP
为9999
,其他6个属性为999
。所以需要重写该方法。
var _Game_Actor_paramMax = Game_Actor.prototype.paramMax;
Game_Actor.prototype.paramMax = function(paramId) {
return 100000000;
};
这样最大值就是1个亿而非不到1w的属性了,感觉从此能秒天秒地秒空气。这里也可以修改为取插件参数的值。
4.修改经验值曲线
备注中的ExeList
4个参数的作用基本值,补正值,增加度a,增加度b
:
取消上文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]);
}
}
}