80后的玩家中昆咽,應(yīng)該有不少人像我一樣喜歡讀武俠小說吧金踪?而喜歡讀武俠小說的人中捺氢,大概很少有不知道、沒玩過智冠的《金庸群俠傳》這款游戲的吧把曼?有誰還記得這款游戲里面新武功是怎么獲得的嗎杨帽?——廢話,當(dāng)然是修煉武功秘籍呀嗤军!那好注盈,廢話不多說,咱就直接上干貨叙赚,看看在RPG Maker MV中怎么制作武功秘籍老客。
注意:本文中的插件代碼適用于RPG Maker MV 1.5.x
聲明:原創(chuàng)內(nèi)容,你可以直接使用于任何商業(yè)的震叮、非商業(yè)的游戲胧砰,也可以修改代碼以適應(yīng)你的需求,但是要保留原作者的版權(quán)信息苇瓣。由于使用本代碼而直接或間接造成的損失以及相關(guān)責(zé)任尉间,由使用者自負(fù),代碼原作者概不負(fù)責(zé)击罪。如果你不同意上述聲明哲嘲,請勿使用本文中提供的代碼。
//=============================================================================
// SuTao_EquipToLearn.js
//=============================================================================
/*:
* @plugindesc 裝備特定武器媳禁、裝備眠副,在戰(zhàn)斗中汲取一定經(jīng)驗(yàn)后學(xué)會新技能。
* @author sutao80216
*
* @param 汲取固定經(jīng)驗(yàn)
* @type select
* @option 固定(默認(rèn)值)
* @value true
* @option 不固定
* @value false
* @desc 無論戰(zhàn)斗規(guī)模竣稽,每場戰(zhàn)斗汲取的經(jīng)驗(yàn)值固定囱怕。
* true - 固定(默認(rèn));false - 不固定毫别。
* @default true
*
* @param 固定經(jīng)驗(yàn)值
* @type number
* @min 0
* @desc 每場戰(zhàn)斗固定汲取的經(jīng)驗(yàn)值娃弓。
* 默認(rèn)值:10
* @default 10
*
* @param 經(jīng)驗(yàn)值比例
* @desc 汲取固定經(jīng)驗(yàn)關(guān)閉時,汲取經(jīng)驗(yàn)值與戰(zhàn)斗經(jīng)驗(yàn)的比例拧烦。它可
* 以是浮點(diǎn)數(shù)或表達(dá)式,如this.level/10或0.1钝计,this為裝備者恋博。
* @default Math.ceil(this.mdf / 15) * 0.2
*
* @param 完成周目數(shù)變量ID
* @type number
* @min 0
* @desc 保存已完成周目數(shù)的變量ID。
* 不用的話設(shè)為0即可私恬。
* 默認(rèn)值:0
* @default 0
*
* @param 每周目增加可研習(xí)武功數(shù)量
* @type number
* @min 0
* @desc 每完成一個周目债沮,增加的可研習(xí)武功數(shù)量。
* 不用的話設(shè)為0即可本鸣。
* 默認(rèn)值:0
* @default 0
*
* @help
* Version 1.0
*
* 建議配合YEP_ItemCore, YEP_EquipCore以及YEP_X_EquipRequirements來使用本插件疫衩。
* 如果使用了上述插件,請將本插件置于它們之下荣德。
*
* ================Notetag================
* 適用于Weapon, Armor等可以裝備到身上的物品闷煤。
* <EquipToLearn: max_exp, skill_id, force_learn>
* 參數(shù)說明:
* max_exp: 習(xí)得技能所需要之經(jīng)驗(yàn)值總量童芹,不可省略。
* skill_id: 可以習(xí)得的技能之ID鲤拿,不可省略假褪。
* force_learn: 是否可以重新學(xué)習(xí)曾經(jīng)學(xué)會但被遺忘的技能,可省略近顷。
* 0 - 否(默認(rèn))生音;1 - 是。
* 【注意】如果輸入了多條上述指令窒升,僅有最頂部的一條生效缀遍。
*/
var Imported = Imported || {};
Imported.SuTao_EquipToLearn = true;
var SuTao = SuTao || {};
SuTao.ETL = SuTao.ETL || {};
SuTao.ETL.version = 1.0;
(function ($) {
'use strick';
$.Paramaters = PluginManager.parameters('SuTao_EquipToLearn');
$.Param = $.Param || {};
$.Param.gainSolidExp = eval(String($.Paramaters['汲取固定經(jīng)驗(yàn)'] || 'true'));
$.Param.solidExp = Number($.Paramaters['固定經(jīng)驗(yàn)值']) || 10;
$.Param.expPercent = String($.Paramaters['經(jīng)驗(yàn)值比例']);
$.Param.circleCountId = Number($.Paramaters['完成周目數(shù)變量ID']) || 0;
$.Param.maxCountPerCircle = Number($.Paramaters['每周目增加可研習(xí)武功數(shù)量']) || 0;
//=============================================================================
// DataManager
//=============================================================================
$.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!$.DataManager_isDatabaseLoaded.call(this)) return false;
if (!SuTao._loaded_EquipToLearn) {
this.processEquipToLearnNotetags($dataWeapons);
this.processEquipToLearnNotetags($dataArmors);
SuTao._loaded_EquipToLearn = true;
}
return true;
};
DataManager.processEquipToLearnNotetags = function (group) {
var regexp1 = /[ ]*<[ ]*EquipToLearn:[ ]*(\d+),[ ]*(\d+)[,]?[ ]*(\d+)?[ ]*>[ ]*/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
// 初始化修煉信息
obj.EquipToLearn = {
'max_exp': 0,
'skill_id': 0,
'force_learn': false
};
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(regexp1)) {
obj.EquipToLearn.max_exp = parseInt(RegExp.$1);
obj.EquipToLearn.skill_id = parseInt(RegExp.$2);
obj.EquipToLearn.force_learn = parseInt(RegExp.$3) > 0;
// 一件裝備只能修煉一個技能
break;
}
}
}
};
//=============================================================================
// Game_Actor
//=============================================================================
$.Game_Actor_gainExp = Game_Actor.prototype.gainExp;
Game_Actor.prototype.gainExp = function (exp) {
// 先調(diào)用原始方法
$.Game_Actor_gainExp.call(this, exp);
var equip = {};
this._expPercent = eval($.Param.expPercent) || 0.1;
var _exp = $.Param.gainSolidExp ? $.Param.solidExp : exp * this._expPercent;
var _ret = {};
for (var i = 0; i < this._equips.length; i++) {
// 如果裝備欄是空的則下一個
if (!this._equips[i].object()) continue;
equip = this._equips[i].object();
// 如果不是可修煉型裝備則下一個
if (equip.EquipToLearn.max_exp <= 0 || equip.EquipToLearn.skill_id <= 0) continue;
// 更新修煉經(jīng)驗(yàn),如果經(jīng)驗(yàn)積滿則學(xué)習(xí)新技能
_ret = this.updateEquipToLearns(equip, _exp);
// 如果可以學(xué)習(xí)新技能饱须,并且相關(guān)技能以前沒有學(xué)習(xí)過或者可以重復(fù)學(xué)習(xí)域醇,則可以學(xué)會新技能。
// 有些秘籍被設(shè)置成不能重復(fù)修煉冤寿,是為了兼容
// MrTS_SimpleSkillLeveling與SRD_SkillExtender這兩個插件歹苦。
if (_ret.canLearn && (!this._equipToLearns[_ret.id].learned || equip.EquipToLearn.force_learn)) {
if (!this.isLearnedSkill(equip.EquipToLearn.skill_id)) {
if (!!this._learnedCount) {
// this._learnedCount++;
} else {
this._learnedCount = 0;
}
// 檢查通過秘籍習(xí)得的技能數(shù)量是否達(dá)到當(dāng)前周目的上限
if ($.Param.circleCountId > 0 && $.Param.maxCountPerCircle > 0) {
var _circle = $gameVariables.value($.Param.circleCountId);
var _maxCount = 10 + $.Param.maxCountPerCircle * _circle;
if (this._learnedCount < _maxCount) {
this.learnSkill(equip.EquipToLearn.skill_id);
this._learnedCount++;
}
} else if (this._learnedCount < 10) {
this.learnSkill(equip.EquipToLearn.skill_id);
this._learnedCount++;
}
}
this._equipToLearns[_ret.id].learned = true;
}
}
};
// 參數(shù)item是具體類型的物品,如道具督怜、武器殴瘦、防具等,而非抽象的Game_Item
// 參數(shù)exp是要更新(增長)的經(jīng)驗(yàn)值
Game_Actor.prototype.updateEquipToLearns = function (item, exp) {
// 如果數(shù)組未聲明則初始化之
this._equipToLearns = this._equipToLearns || [];
if (!!Imported.YEP_ItemCore) {
// 兼容YEP_ItemCore引入的獨(dú)立物品
// 統(tǒng)統(tǒng)轉(zhuǎn)換為基礎(chǔ)物品
item = DataManager.getBaseItem(item);
}
var _matchId = -1;
var _canLearn = false;
// 如果數(shù)組不空則會遍歷之
this._equipToLearns.every(function (obj, id) {
// 如果已有相關(guān)記錄
if (obj.item.etypeId === item.etypeId && obj.item.id === item.id) {
// 保存對應(yīng)的序號
_matchId = id;
// 處理經(jīng)驗(yàn)值
obj.exp += exp;
// 如果經(jīng)驗(yàn)值已經(jīng)積滿
if (obj.exp >= item.EquipToLearn.max_exp) {
// 可以學(xué)習(xí)新技能了
_canLearn = true;
// 避免經(jīng)驗(yàn)值溢出
obj.exp = obj.item.EquipToLearn.max_exp;
}
// 中斷遍歷
return false;
}
// 沒有相關(guān)記錄則繼續(xù)遍歷直至完成
return true;
}, this);
// 序號沒有變化号杠,表示沒找到相關(guān)記錄
if (_matchId < 0) {
// 生成記錄數(shù)據(jù)對象
var obj = {};
obj.item = item;
obj.exp = Math.min(exp, item.EquipToLearn.max_exp);
_canLearn = obj.exp >= item.EquipToLearn.max_exp;
obj.learned = false;
// 添加對象到數(shù)組
_matchId = this._equipToLearns.push(obj) - 1;
}
// 返回裝備相關(guān)記錄在數(shù)組中的id蚪腋,以及是否可學(xué)新技能
return {
'id': _matchId,
'canLearn': _canLearn
};
};
//=============================================================================
// Window_EquipSlot
//=============================================================================
$.Window_EquipSlot_drawItem = Window_EquipSlot.prototype.drawItem;
Window_EquipSlot.prototype.drawItem = function (index) {
$.Window_EquipSlot_drawItem.call(this, index);
if (this._actor) {
var rect = this.itemRectForText(index);
var _exp = 0;
var _maxExp = 0;
var _newText1 = ' %1\%';
var _newText2 = ' %1\%';
var _nameText = '';
var _percent = 0;
if (!!this._actor._equipToLearns) {
var obj = {};
var _itemEquip = {};
for (var i = 0, len = this._actor._equipToLearns.length; i < len; i++) {
if (!this._actor._equipToLearns[i]) continue;
obj = this._actor._equipToLearns[i];
_itemEquip = this._actor.equips()[index];
if (!!Imported.YEP_ItemCore) {
// 兼容YEP_ItemCore引入的獨(dú)立物品
// 統(tǒng)統(tǒng)轉(zhuǎn)換為基礎(chǔ)物品
_itemEquip = DataManager.getBaseItem(_itemEquip);
}
if (_itemEquip && obj.item.etypeId === _itemEquip.etypeId && obj.item.id === _itemEquip.id) {
_exp = obj.exp;
_maxExp = obj.item.EquipToLearn.max_exp;
_percent = _exp * 100 / _maxExp;
if (_percent < 10) {
_nameText = _newText1.format(_percent.toFixed(2));
} else if (_percent < 100) {
_nameText = _newText2.format(_percent.toFixed(2));
} else {
_nameText = '研習(xí)完畢';
}
break;
}
}
}
this.changePaintOpacity(this.isEnabled(index));
if (_percent >= 100) {
this.changeTextColor(this.textColor(13));
} else {
this.changeTextColor(this.textColor(24));
}
if (!!Imported.YEP_ItemCore) {
// 啟用了YEP_ItemCore.js,使用插件附帶的裝備顯示界面
// 此處第二個參數(shù)的修正量適用于1024x640大小的游戲窗口
this.drawText(_nameText, rect.x + 372, rect.y, 96, this.lineHeight(), 'right');
} else {
// 沒有啟用YEP_ItemCore.js姨蟋,使用默認(rèn)的裝備顯示界面
// 此處第二個參數(shù)的修正量適用于默認(rèn)的816x624大小的游戲窗口
this.drawText(_nameText, rect.x + 360, rect.y, 96, this.lineHeight(), 'right');
}
this.changePaintOpacity(true);
this.changeTextColor(this.systemColor());
}
};
})(SuTao.ETL);