// // ラーニング ver1.03 // // / ------------------------------------------------------ // Copyright (c) 2016 Yana // Released under the MIT license // http://opensource.org/licenses/mit-license.php // ------------------------------------------------------ // // author Yana // var Imported = Imported || {}; Imported["Learning"] = 1.03; /*: * @target MZ MV * @url https://raw.githubusercontent.com/munokura/Yana-MV-plugins/master/Item_Skill/Learning.js * @plugindesc ver1.03/敵の攻撃を受けた時、その技を元にスキルを習得する機能を追加します。 * @author Yana * * @param Learning Skill Shared * @text ラーニングをパーティ共用 * @desc ラーニングしたスキルをパーティで共用するかの設定です。 * @type boolean * @on 共用する * @off 共用しない * @default true * * @param Miss Learning * @text スキルミス時にラーニング * @desc スキルがミスした時、ラーニングできるかの設定です。 * @type boolean * @on ラーニングする * @off ラーニングしない * @default true * * @param Evaded Learning * @text スキル回避時にラーニング * @desc スキルを回避した時、ラーニングできるかの設定です。 * @type boolean * @on ラーニングする * @off ラーニングしない * @default true * * @param Watch Learning * @text スキルを見てラーニング * @desc スキルを見るだけでラーニングできるかの設定です。 * @type boolean * @on ラーニングする * @off ラーニングしない * @default true * * @param Instant Learning * @text ラーニング時に即時習得 * @desc スキルをラーニングした時、即時習得するかの設定です。 * @type boolean * @on 即時習得する * @off 即時習得しない * @default true * * @param Display Learning Text * @text ラーニング時の表示ログ * @desc ラーニングした時にログに表示するメッセージです。 * @default _nameは_skillをラーニング! * * @param Display Learning Text Shared * @text パーティ共用時の表示ログ * @desc ラーニングした時にログに表示するメッセージです。共用設定用です。 * @default _skillをラーニング! * * @param Log Color * @text ラーニング時のログ色 * @desc ラーニング表示のログカラーです。 * @type number * @default 4 * * @param Play SE Name * @text ラーニング時SE * @desc ラーニングした時に鳴らすSEのファイル名です。 * @default Flash2 * @require 1 * @dir audio/se/ * @type file * * @param Play SE Params * @text ラーニング時SEパラメータ * @desc ラーニングした時に鳴らすSEのパラメータです。 * パン、ピッチ、ボリュームの順で指定してください。 * @default 0,100,100 * * @param Info Text * @text 入手インフォ表示テキスト * @desc 入手インフォメーション併用時、表示されるテキストです。 * _actor:アクター名 _icon:スキルアイコン _name:スキル名 * @default _actorは「\i[_icon]_name」をラーニング! * * @help * ------------------------------------------------------ * 設定方法 * ------------------------------------------------------ * スキルのメモ欄に * * <ラーニング スキルID,習得率%> * * * と記述します。 * * * そのスキルをラーニング能力を持ったアクターが受けたとき、 * または、設定によっては見るだけで * 習得率%の確率で設定したIDのスキルを習得します。 * ラーニング能力は特徴オブジェクト * (アクター,クラス,装備,ステートなど)のメモ欄に * * <ラーニング能力> * * * と記述することで設定することができます。 * * * また、特徴オブジェクト(アクター,クラス,装備,ステートなど)のメモ欄に * * <ラーニング率補正:[+-]補正率> * * * と記述することで、ラーニング率を補正する特徴を設定することができます。 * この補正率はそれぞれ加算で計算され、元の習得率に乗算されます。 * * ------------------------------------------------------ * プラグインコマンドはありません。 * ------------------------------------------------------ * ------------------------------------------------------ * 注意事項 * ------------------------------------------------------ * 入手インフォメーションプラグインはRPGツクールMZで動作しません。 * * ------------------------------------------------------ * 利用規約 * ------------------------------------------------------ * 当プラグインはMITライセンスで公開されています。 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。 * 二次配布も制限はしませんが、サポートは行いません。 * 著作表示は任意です。行わなくても利用できます。 * 要するに、特に規約はありません。 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、 * または、Twitterにお願いします。 * https://twitter.com/yanatsuki_ * 素材利用は自己責任でお願いします。 * ------------------------------------------------------ * 更新履歴: * ver1.03: * ConditionallyCoreと併用時、ラーニングに条件を付けられるように機能を追加 * 行動が発生する前にラーニングを行う、事前ラーニングの仕組みを追加 * ver1.02: * MissLearningとEvadedLearningのパラメータが正常に機能していないバグを修正。 * ログにラーニングの表示が出た後、次の文字カラーがラーニング時の * カラーになるバグを修正。 * 入手インフォメーションと併用時エラーが発生するバグを修正。 * ver1.011: * console.logを削除。 * ver1.01: * 利用規約をMITライセンスに変更。 * Learning Skill Sharedがtrueの時、ラーニングの表示が正常でないバグを修正。 * ver1.00: * 公開 */ (function () { "use strict"; //////////////////////////////////////////////////////////////////////////////////// var parameters = PluginManager.parameters("Learning"); var learningSkillShared = String(parameters["Learning Skill Shared"]) === "true"; var missLearning = String(parameters["Miss Learning"]) === "true"; var evadedLearning = String(parameters["Evaded Learning"]) === "true"; var instantLearning = String(parameters["Instant Learning"]) === "true"; var watchLearning = String(parameters["Watch Learning"]) === "true"; var displayLearningText = String( parameters["Display Learning Text"] || "_nameは_skillをラーニング!" ); var displayLearningTextShared = String( parameters["Display Learning Text Shared"] || "_skillをラーニング!" ); var logColor = Number(parameters["Log Color"] || 4); var playSEName = String(parameters["Play SE Name"] || ""); var playSEParams = String(parameters["Play SE Params"] || ""); var infoText = String(parameters["Info Text"] || ""); //////////////////////////////////////////////////////////////////////////////////// var _L_BManager_gainRewards = BattleManager.gainRewards; BattleManager.gainRewards = function () { this.showLearningSkills(); _L_BManager_gainRewards.call(this); }; BattleManager.showLearningSkills = function () { if (!this._learningList) { return; } var length = this._learningList.length; for (var i = 0; i < length; i++) { var l = this._learningList[i]; var actor = $gameActors.actor(l[0]); var skill = $dataSkills[l[1]]; var text; if (learningSkillShared) { text = displayLearningTextShared; $gameParty.addLearningSkill(l[1]); $gameParty.refreshLearning(); } else { text = displayLearningText; actor.learnSkill(l[1]); } text = text.replace(/_name/, actor.name()); text = text.replace(/_skill/, skill.name); if (i === 0) { $gameMessage.newPage(); } $gameMessage.add("\\." + text); } this._learningList = null; }; var _L_BManager_startAction = BattleManager.startAction; BattleManager.startAction = function () { this._checkLearns = []; _L_BManager_startAction.call(this); /* if ($gameTemp._learnings && $gameTemp._learnings.length > 0 && learningSkillShared){ var length = $gameTemp._learnings.length; for (var i=0;i 0; } else { return false; } }; DataManager.initLearningSkill = function (skill) { var result = [[], []]; var texts = skill.note.split("\n"); var length = texts.length; for (var i = 0; i < length; i++) { var text = texts[i]; if ( text.match(/[<<](?:ラーニング|LEARNING)\s*(\d+)[,,](\d+)[%%]?[>>]/) ) { var obj = { skill: Number(RegExp.$1), rate: Number(RegExp.$2), conditions: [], text: null, popup: null, se: null, infoText: null, }; var ts = []; for (var j = i + 1; j < length; j++) { if (texts[j].match(/[<<]\/(?:ラーニング|LEARNING)[>>]/)) { for (var k = 0, max = ts.length; k < max; k++) setConditions(obj, ts[k]); i = j; break; } ts.push(texts[j]); } result[1].push(obj); } else if ( text.match( /[<<](?:事前ラーニング|PRE_LEARNING)\s*(\d+)[,,](\d+)[%%]?[>>]/ ) ) { var obj = { skill: Number(RegExp.$1), rate: Number(RegExp.$2), conditions: [], }; var ts = []; for (var j = i + 1; j < length; j++) { if (texts[j].match(/[<<]\/(?:事前ラーニング|PRE_LEARNING)[>>]/)) { for (var k = 0, max = ts.length; k < max; k++) setConditions(obj, ts[k]); i = j; break; } ts.push(texts[j]); } result[0].push(obj); } } skill._learningSkills = result; }; DataManager.learningSupply = function (item) { if (!item) { return 0; } if (item.meta["LEARNING_RATE_SUP"]) { return Number(item.meta["LEARNING_RATE_SUP"]); } if (item.meta["ラーニング率補正"]) { return Number(item.meta["ラーニング率補正"]); } return 0; }; DataManager.isLearningObject = function (obj) { if (!obj) { return false; } if (obj._learningObject === undefined) { obj._learningObject = obj.note.match( /[<<](?:ラーニング能力|LEARNING_ABILITY)[>>]/ ); } return obj._learningObject; }; //////////////////////////////////////////////////////////////////////////////////// var __BManager_invokeAction = BattleManager.invokeAction; BattleManager.invokeAction = function (subject, target) { if (this._action) this._action.processBeforeLearning(target); __BManager_invokeAction.call(this, subject, target); }; //////////////////////////////////////////////////////////////////////////////////// Game_BattlerBase.prototype.isEnableLearning = function () { return false; }; //////////////////////////////////////////////////////////////////////////////////// var _L_GAction_apply = Game_Action.prototype.apply; Game_Action.prototype.apply = function (target) { _L_GAction_apply.call(this, target); BattleManager._checkLearns = []; this.processAfterLearning(target); }; Game_Action.prototype.processBeforeLearning = function (target) { if (this.subject().isActor()) { return; } if (!DataManager.isLearningSkill(this.item())) { return; } if (!$gameTemp._learnings) { $gameTemp._learnings = []; } var targets = [target]; if (watchLearning) { targets = $gameParty.battleMembers(); } this.processLearning(targets, 0); }; Game_Action.prototype.processAfterLearning = function (target) { if (this.subject().isActor()) { return; } if (target.result().missed && !missLearning) { return; } if (target.result().evaded && !evadedLearning) { return; } if (!DataManager.isLearningSkill(this.item())) { return; } if (!$gameTemp._learnings) { $gameTemp._learnings = []; } var targets = [target]; if (watchLearning) { targets = $gameParty.battleMembers(); } this.processLearning(targets, 1); }; Game_Action.prototype.processLearning = function (targets, timing) { var l1 = targets.length; var item = this.item(); for (var i = 0; i < l1; i++) { var m = targets[i]; if (!m.isAlive()) { continue; } if (BattleManager._checkLearns) { if (BattleManager._checkLearns.contains(m)) { continue; } BattleManager._checkLearns.push(m); } if (!m.isEnableLearning()) { continue; } var ls = item._learningSkills[timing]; var l2 = ls.length; for (var j = 0; j < l2; j++) { var s = ls[j]; if (!m.isLearnedSkill(s["skill"])) { if (Math.random() < (s["rate"] / 100) * (m.learningSupply() / 100)) { if ( !Imported["ConditionallyCore"] || ConditionallyManager.checkConditions( m, this.subject(), s["conditions"] ) ) { if (instantLearning) { $gameTemp._learnings.push([m, s]); if (learningSkillShared) { $gameParty.addLearningSkill(s["skill"]); $gameParty.refreshLearning(); } else { m.learnSkill(s["skill"]); m.refresh(); } } else { if (BattleManager._learningList === undefined) { BattleManager._learningList = []; } var r = [m.actorId(), s]; if (BattleManager._learningList.contains(r)) { continue; } BattleManager._learningList.push(r); } } } } } } }; //////////////////////////////////////////////////////////////////////////////////// Game_Actor.prototype.isEnableLearning = function () { var objects = this.traitObjects(); var length = objects.length; for (var i = 0; i < length; i++) { if (DataManager.isLearningObject(objects[i])) { return true; } } return false; }; Game_Actor.prototype.learningSupply = function () { var r = 100; var objects = this.traitObjects(); var length = objects.length; for (var i = 0; i < length; i++) { r += DataManager.learningSupply(objects[i]); } return r; }; //////////////////////////////////////////////////////////////////////////////////// Game_Party.prototype.addLearningSkill = function (skillId) { if (this._learningSkills === undefined) { this._learningSkills = []; } if (!this._learningSkills.contains(skillId)) { this._learningSkills.push(skillId); } }; Game_Party.prototype.refreshLearning = function () { if (!this._learningSkills) { return; } var length = this._learningSkills.length; for (var i = 0; i < length; i++) { var skillId = this._learningSkills[i]; this.allMembers().forEach(function (actor) { if (actor && !actor.isLearnedSkill(skillId)) { actor.learnSkill(skillId); } }); } }; var _L_GParty_addActor = Game_Party.prototype.addActor; Game_Party.prototype.addActor = function (actorId) { _L_GParty_addActor.call(this, actorId); this.refreshLearning(); }; //////////////////////////////////////////////////////////////////////////////////// Window_BattleLog.prototype.displayLearning = function (actor, learn) { var fmt; var skill = $dataSkills[learn.skill]; if (playSEName) { if (learn.se !== "null") { var sa = playSEParams.split(","); var pan = Number(sa[0]) || 0; var pitch = Number(sa[1]) || 100; var volume = Number(sa[2]) || 90; var se = { name: playSEName, pan: pan, pitch: pitch, volume: volume }; if (learn.se) se["name"] = learn.se; if (learn.seSetting) { var setting = learn.seSetting.split(","); se["pan"] = Number(setting[0]); se["pitch"] = Number(setting[1]); se["volume"] = Number(setting[2]); } AudioManager.playStaticSe(se); } } if (learn.text !== "null") { if (learningSkillShared) { fmt = displayLearningTextShared; if (learn.text) fmt = learn.text; } else { fmt = displayLearningText; if (learn.text) fmt = learn.text; } fmt = fmt.replace("_name", actor.name()); fmt = fmt.replace("_skill", skill.name); fmt = "\\C[" + logColor + "]" + fmt + "\\C[0]"; this.push("addText", fmt); } if ( Imported["GetInformation"] && Imported["GetInformation"] >= 1.04 && learn.infoText !== "null" ) { var it = infoText; if (learn.infoText) it = learn.infoText; if (CommonPopupManager.popEnable() && !!it) { CommonPopupManager.showInfo(skill, it, "learning", actor.actorId()); } } }; var _L_WBattleLog_displayFailure = Window_BattleLog.prototype.displayFailure; Window_BattleLog.prototype.displayFailure = function (target) { _L_WBattleLog_displayFailure.call(this, target); if ($gameTemp._learnings && $gameTemp._learnings.length > 0) { var length = $gameTemp._learnings.length; for (var i = 0; i < length; i++) { var l = $gameTemp._learnings[i]; this.displayLearning(l[0], l[1]); } $gameTemp._learnings = []; } }; })();