在RPG Maker MV中制作“武功秘籍”

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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屉凯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眼溶,更是在濱河造成了極大的恐慌悠砚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂飞,死亡現(xiàn)場離奇詭異灌旧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绰筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枢泰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铝噩,你說我怎么就攤上這事衡蚂。” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵毛甲,是天一觀的道長年叮。 經(jīng)常有香客問我,道長丽啡,這世上最難降的妖魔是什么谋右? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮补箍,結(jié)果婚禮上改执,老公的妹妹穿的比我還像新娘。我一直安慰自己坑雅,他們只是感情好辈挂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裹粤,像睡著了一般终蒂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遥诉,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天拇泣,我揣著相機(jī)與錄音,去河邊找鬼矮锈。 笑死霉翔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苞笨。 我是一名探鬼主播债朵,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瀑凝!你這毒婦竟也來了序芦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粤咪,失蹤者是張志新(化名)和其女友劉穎谚中,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥枝,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪塔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脉顿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝌麸。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡点寥,死狀恐怖艾疟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蔽莱,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布弟疆,位于F島的核電站,受9級特大地震影響盗冷,放射性物質(zhì)發(fā)生泄漏怠苔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一仪糖、第九天 我趴在偏房一處隱蔽的房頂上張望柑司。 院中可真熱鬧,春花似錦锅劝、人聲如沸攒驰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玻粪。三九已至,卻和暖如春诬垂,著一層夾襖步出監(jiān)牢的瞬間劲室,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工结窘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留很洋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓晦鞋,卻偏偏與公主長得像蹲缠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悠垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容