blue-mage-luna/js/plugins/Learning.js
2024-02-25 22:13:05 -06:00

595 lines
19 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// ラーニング 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,習得率%>
* <LEARNING スキルID,習得率%>
*
* と記述します。
*
*
* そのスキルをラーニング能力を持ったアクターが受けたとき、
* または、設定によっては見るだけで
* 習得率%の確率で設定したIDのスキルを習得します。
* ラーニング能力は特徴オブジェクト
* (アクター,クラス,装備,ステートなど)のメモ欄に
*
* <ラーニング能力>
* <LEARNING_ABILITY>
*
* と記述することで設定することができます。
*
*
* また、特徴オブジェクト(アクター,クラス,装備,ステートなど)のメモ欄に
*
* <ラーニング率補正:[+-]補正率>
* <LEARNING_RATE_SUP:[+-]補正率>
*
* と記述することで、ラーニング率を補正する特徴を設定することができます。
* この補正率はそれぞれ加算で計算され、元の習得率に乗算されます。
*
* ------------------------------------------------------
* プラグインコマンドはありません。
* ------------------------------------------------------
* ------------------------------------------------------
* 注意事項
* ------------------------------------------------------
* 入手インフォメーションプラグインは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<length;i++){
var l = $gameTemp._learnings[i];
this._logWindow.displayLearning(l[0],$dataSkills[l[1]]);
}
$gameTemp._learnings = [];
}*/
};
////////////////////////////////////////////////////////////////////////////////////
var setConditions = function (obj, text) {
if (!obj) return;
if (text.match(/(?:テキスト|Text)[:](.+)]/gi)) {
obj.text = RegExp.$1;
} else if (text.match(/(?:ポップアップ|Popup)[:](.+)/gi)) {
obj.popup = RegExp.$1;
} else if (text.match(/SE[:](.+)/gi)) {
obj.se = RegExp.$1;
} else if (text.match(/(?:インフォ|Info)[:](.+)/gi)) {
obj.infoText = RegExp.$1;
} else {
var cond = text;
if (Imported["ConditionallyCore"])
cond = ConditionallyManager.makeCondition(text);
obj.conditions.push(cond);
}
};
////////////////////////////////////////////////////////////////////////////////////
DataManager.isLearningSkill = function (skill) {
if (this.isSkill(skill)) {
if (!skill._learningSkills) {
this.initLearningSkill(skill);
}
return skill._learningSkills.length > 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 = [];
}
};
})();