Project1
标题:
人工汉化插件(浮游术)
[打印本页]
作者:
黛惠
时间:
2021-1-18 17:40
标题:
人工汉化插件(浮游术)
测试过可以使用的~
还要感谢分享插件本体的坛友们XD
//=============================================================================
// FloatingCharacter.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.5.1 2020/03/24 競合等の理由でメモ欄が取得できない場合に発生するエラーを回避
// 1.5.0 2020/03/13 浮遊速度を変更できる機能を追加
// 1.4.1 2019/06/18 メモ欄の設定を適切に読み込めるように修正(ツミオ)
// 1.4.0 2018/10/08 浮遊イベントの影を非表示にできる機能を追加
// 1.3.0 2018/01/24 イベントを初期状態で浮遊させる機能を追加
// 1.2.0 2018/01/07 プレイヤーの浮遊とフォロワーと連動させるかどうかを選択できる機能を追加
// 1.1.2 2016/07/31 パラメータ名の変換ミス修正(敷居値→閾値)
// 隊列歩行時のフォロワーの高度がデフォルト値で固定になっていた問題の修正
// 1.1.1 2016/04/06 本プラグインを適用していないセーブデータをロードしたときも、正しく動作するよう修正
// 1.1.0 2016/04/03 一定以上の高度の場合のみ通行可能になる地形タグとリージョンを指定できる機能を追加
// 着地可能な場合のみ着地する機能を追加、指定されたキャラクターが浮遊中かどうかの判定を追加
// 1.0.2 2016/03/31 隊列歩行でない場合のフォロワーや画像が指定されていないイベントでも影が表示される不具合を修正
// 1.0.1 2016/03/31 浮遊中に強制的に待機アニメが設定される仕様を撤廃
// 1.0.0 2016/03/29 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc Floating character plugin
* @author triacontane
*
* @param TerrainTags
* @desc 浮空时可通行的地形标志,以逗号分隔
* 例:1,2,3
* @default
*
* @param RegionId
* @desc 浮空时可通行的区域编号,以逗号分隔
* 例:1,2,3
* @default
*
* @param HighestTerrainTags
* @desc 在该高度以上的地形,可以浮空通行
* 例:1,2,3
* @default
*
* @param HighestRegionId
* @desc 在该高度以上的区域,可以浮空通行
* 例:1,2,3
* @default
*
* @param HighestThreshold
* @desc 该高度的值
* @default 48
*
* @param FloatFollower
* @desc 浮空时,队员/跟随者也会自动浮空
* @default true
* @type boolean
*
* @help 使角色浮空
* 浮空时有以下效果。
*
* 允许在多个指定的地形标签通行。
* 允许在多个指定的区域通行。
* 禁用图块的梯子、茂密、有害地形。
*
* Script
* 从“指定移动路径”的“脚本”中执行以下操作。
*
* this.float([权重], [高度(省略时为图块尺寸的一半)]);
* 使角色浮空[高度]的像素。
* 如果将[权重]设置为[ture],则在浮空完成前不会转移到下一命令。
* 例:this.float(true, 48);
*
* this.landing([权重]);
* 使角色着陆。
* 如果将[权重]设置为[true],则在着陆完成前不会转移到下一命令。
* 例:this.landing(true);
*
* this.landingIfOk([权重]);
* 在可以着陆的地形上,使角色着陆。
* 是否着陆的条件与飞行船的着陆条件相同。
* 如果将[权重]设置为[true],则在落地完成前不会转移到下一命令。
* 例:this.landingIfOk(true);
*
* this.setFloatSpeed([速度]);
* 设定浮空速度。通常情况下,用[1]指定较大的数字会变快。
*
* Script
* 从“条件分支”的“脚本”中执行以下操作。
*
* this.isFloating([キャラクターID]);
* 指定的角色浮空时在,执行分支。
* 指定角色ID如下。
*
* -1 : 玩家
* 0 : 本事件
* 1... : 指定ID的事件
*
* 此插件没有插件指令。
*
* 在事件的备注栏中如此输入,则该事件初始即浮空
* <FCAltitude:24> # 以24个像素的高度浮动
* <FC高度:24> # 同上
*
* 在事件的备注栏中如此输入,则该事件浮空时无阴影
* <FC影なし>
* <FCNoShadow>
*
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function () {
'use strict';
var pluginName = 'FloatingCharacter';
var metaTagPrefix = 'FC';
var getParamString = function(paramNames) {
var value = getParamOther(paramNames);
return value == null ? '' : value;
};
var getParamNumber = function(paramNames, min, max) {
var value = getParamOther(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(value, 10) || 0).clamp(min, max);
};
var getParamBoolean = function(paramNames) {
var value = getParamOther(paramNames);
return (value || '').toUpperCase() === 'ON' || (value || '').toUpperCase() === 'TRUE';
};
var getParamOther = function(paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (var i = 0; i < paramNames.length; i++) {
var name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return name;
}
return null;
};
var getParamArrayString = function (paramNames) {
var values = getParamString(paramNames).split(',');
for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
return values;
};
var getParamArrayNumber = function (paramNames, min, max) {
var values = getParamArrayString(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
for (var i = 0; i < values.length; i++) {
if (!isNaN(parseInt(values[i], 10))) {
values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
} else {
values.splice(i--, 1);
}
}
return values;
};
var getMetaValue = function(object, name) {
var metaTagName = metaTagPrefix + name;
if (!object.meta) {
return undefined;
}
return object.meta.hasOwnProperty(metaTagName) ? convertEscapeCharacters(object.meta[metaTagName]) : undefined;
};
var getMetaValues = function(object, names) {
for (var i = 0, n = names.length; i < n; i++) {
var value = getMetaValue(object, names[i]);
if (value !== undefined) return value;
}
return undefined;
};
var hasMetaValue = function(object, name) {
var metaTagName = metaTagPrefix + name;
if (!object.meta) {
return false;
}
return object.meta.hasOwnProperty(metaTagName);
};
var hasMetaValues = function(object, names) {
return names.some(function(name) {
return hasMetaValue(object, name);
});
};
var convertEscapeCharacters = function(text) {
if (String(text) !== text) text = '';
text = text.replace(/\\/g, '\x1b');
text = text.replace(/\x1b\x1b/g, '\\');
text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
return $gameVariables.value(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
return $gameVariables.value(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bN\[(\d+)\]/gi, function() {
var actor = parseInt(arguments[1]) >= 1 ? $gameActors.actor(parseInt(arguments[1])) : null;
return actor ? actor.name() : '';
}.bind(this));
text = text.replace(/\x1bP\[(\d+)\]/gi, function() {
var actor = parseInt(arguments[1]) >= 1 ? $gameParty.members()[parseInt(arguments[1]) - 1] : null;
return actor ? actor.name() : '';
}.bind(this));
text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
return text;
};
//=============================================================================
// パラメータの取得と整形
//=============================================================================
var paramTerrainTags = getParamArrayNumber(['通行可能地形タグ', 'TerrainTags']);
var paramRegionId = getParamArrayNumber(['通行可能リージョン', 'RegionId']);
var paramHighestTerrainTags = getParamArrayNumber(['高度通行地形タグ', 'HighestTerrainTags']);
var paramHighestRegionId = getParamArrayNumber(['高度通行リージョン', 'HighestRegionId']);
var paramHighestThreshold = getParamNumber(['高度閾値', 'HighestThreshold']);
var paramFloatFollower = getParamBoolean(['フォロワー連動', 'FloatFollower']);
//=============================================================================
// Game_Interpreter
// キャラクターの浮遊判定を追加定義します。
//=============================================================================
Game_Interpreter.prototype.isFloating = function(characterId) {
var character = this.character(characterId);
if (character !== null) {
return character.isFloating();
} else {
return false;
}
};
//=============================================================================
// Game_CharacterBase
// キャラクターの浮遊関連情報を追加定義します。
//=============================================================================
var _Game_CharacterBase_initMembers = Game_CharacterBase.prototype.initMembers;
Game_CharacterBase.prototype.initMembers = function() {
_Game_CharacterBase_initMembers.apply(this, arguments);
this.initFloatingInfo();
};
Game_CharacterBase.prototype.isLowest = Game_Vehicle.prototype.isLowest;
Game_CharacterBase.prototype.isHighest = Game_Vehicle.prototype.isHighest;
Game_CharacterBase.prototype.shadowOpacity = Game_Vehicle.prototype.shadowOpacity;
Game_CharacterBase.prototype.initFloatingInfo = function() {
this._altitude = 0;
this._altitudeAnimeCount = 0;
this._maxAltitude = 0;
this._needFloat = false;
this._floatSpped = 1;
};
var _Game_CharacterBase_isMapPassable = Game_CharacterBase.prototype.isMapPassable;
Game_CharacterBase.prototype.isMapPassable = function(x, y, d) {
if (this.isNeedFloat()) {
var x2 = $gameMap.roundXWithDirection(x, d);
var y2 = $gameMap.roundYWithDirection(y, d);
if (paramRegionId.some(function(id) {
return id === $gameMap.regionId(x2, y2);
}.bind(this))) return true;
if (paramTerrainTags.some(function(id) {
return id === $gameMap.terrainTag(x2, y2);
}.bind(this))) return true;
if (this._altitude >= paramHighestThreshold) {
if (paramHighestRegionId.some(function(id) {
return id === $gameMap.regionId(x2, y2);
}.bind(this))) return true;
if (paramHighestTerrainTags.some(function(id) {
return id === $gameMap.terrainTag(x2, y2);
}.bind(this))) return true;
}
}
return _Game_CharacterBase_isMapPassable.apply(this, arguments);
};
var _Game_CharacterBase_screenY = Game_CharacterBase.prototype.screenY;
Game_CharacterBase.prototype.screenY = function() {
return _Game_CharacterBase_screenY.apply(this, arguments) +
(this.isFloating() ? Math.floor(Math.sin(this._altitudeAnimeCount / 16) * 3) - this._altitude : 0);
};
var _Game_CharacterBase_screenZ = Game_CharacterBase.prototype.screenZ;
Game_CharacterBase.prototype.screenZ = function() {
return _Game_CharacterBase_screenZ.apply(this, arguments) +
(this._altitude >= $gameMap.tileHeight() ? 1 : 0);
};
Game_CharacterBase.prototype.screenShadowY = function() {
return _Game_CharacterBase_screenY.apply(this, arguments) - this.screenY();
};
var _Game_CharacterBase_isOnLadder = Game_CharacterBase.prototype.isOnLadder;
Game_CharacterBase.prototype.isOnLadder = function() {
return this.isFloating() ? false : _Game_CharacterBase_isOnLadder.apply(this, arguments);
};
var _Game_CharacterBase_isOnBush = Game_CharacterBase.prototype.isOnBush;
Game_CharacterBase.prototype.isOnBush = function() {
return this.isFloating() ? false : _Game_CharacterBase_isOnBush.apply(this, arguments);
};
Game_CharacterBase.prototype.maxAltitude = function() {
return this._maxAltitude;
};
Game_CharacterBase.prototype.isFloating = function() {
return this._altitude > 0;
};
Game_CharacterBase.prototype.isShadowVisible = function() {
return this.isFloating() && (this._characterName || this._tileId) && this.isNeedShadow();
};
Game_CharacterBase.prototype.isNeedFloat = function() {
return this._needFloat;
};
Game_CharacterBase.prototype.float = function(waitFlg, max) {
if (!this.hasOwnProperty('_altitude') || isNaN(this._altitude)) {
this.initFloatingInfo();
}
if (!max) max = $gameMap.tileHeight() / 2;
this._needFloat = true;
this._maxAltitude = max;
if (waitFlg) {
this._waitCount = this.getFloatingWaitCount(this.maxAltitude() - this._altitude);
}
};
Game_CharacterBase.prototype.landing = function(waitFlg) {
this._needFloat = false;
if (waitFlg) {
this._waitCount = this.getFloatingWaitCount(this.maxAltitude());
}
};
Game_CharacterBase.prototype.getFloatingWaitCount = function(altitudeDiff) {
return Math.floor(Math.max(altitudeDiff, 0) / this.getFloatSpeed());
};
Game_CharacterBase.prototype.landingIfOk = function(waitFlg) {
if ($gameMap.isAirshipLandOk(this.x, this.y)) this.landing(waitFlg);
};
var _Game_CharacterBase_update = Game_CharacterBase.prototype.update;
Game_CharacterBase.prototype.update = function() {
_Game_CharacterBase_update.apply(this, arguments);
this.updateFloating();
};
Game_CharacterBase.prototype.isNeedShadow = function() {
return false;
};
Game_CharacterBase.prototype.getFloatSpeed = function() {
return this._floatSpped || 1;
};
Game_CharacterBase.prototype.setFloatSpeed = function(value) {
return this._floatSpped = value;
};
Game_CharacterBase.prototype.updateFloating = function() {
this._floatingPrev = this.isFloating();
if (this.isNeedFloat()) {
if (this.isHighest()) {
this._altitudeAnimeCount++;
}
this._altitude = Math.min(this._altitude + this.getFloatSpeed(), this.maxAltitude());
} else {
if (this.isHighest()) {
this._altitudeAnimeCount = 0;
}
this._altitude = Math.max(this._altitude - this.getFloatSpeed(), 0);
}
if (this._floatingPrev !== this.isFloating()) {
this.refreshBushDepth();
}
};
Game_Player.prototype.float = function(waitFlg, max) {
Game_CharacterBase.prototype.float.apply(this, arguments);
if (!paramFloatFollower) {
return;
}
this.followers().forEach(function(follower) {
follower.float(waitFlg, max);
follower._altitude = -follower._memberIndex * 4;
}.bind(this));
};
var _Game_Player_isOnDamageFloor = Game_Player.prototype.isOnDamageFloor;
Game_Player.prototype.isOnDamageFloor = function() {
return this.isFloating() ? false : _Game_Player_isOnDamageFloor.apply(this, arguments);
};
Game_Player.prototype.landing = function() {
Game_CharacterBase.prototype.landing.apply(this, arguments);
if (!paramFloatFollower) {
return;
}
this.followers().forEach(function(follower) {
follower.landing();
}.bind(this));
};
Game_Player.prototype.setFloatSpeed = function(value) {
Game_CharacterBase.prototype.setFloatSpeed.apply(this, arguments);
if (!paramFloatFollower) {
return;
}
this.followers().forEach(function(follower) {
follower.setFloatSpeed(value);
}.bind(this));
};
Game_Vehicle.prototype.updateFloating = function() {};
Game_Vehicle.prototype.isFloating = function() {
return false;
};
var _Game_Event_initialize = Game_Event.prototype.initialize;
Game_Event.prototype.initialize = function(mapId, eventId) {
_Game_Event_initialize.apply(this, arguments);
var altitude = getMetaValues(this.event(), ['高度', 'Altitude']);
this._noShadow = hasMetaValues(this.event(), ['影なし', 'NoShadow']);
if (altitude !== undefined) {
this.setInitAltitude(parseInt(altitude || 24));
}
};
Game_Event.prototype.setInitAltitude = function(altitude) {
this.float(false, altitude);
this._altitude = this._maxAltitude;
this.refreshBushDepth();
};
Game_Event.prototype.isNeedShadow = function() {
return !this._noShadow;
};
//=============================================================================
// Sprite_Character
// キャラクターの浮遊関連情報を追加定義します。
//=============================================================================
var _Sprite_Character_initMembers = Sprite_Character.prototype.initMembers;
Sprite_Character.prototype.initMembers = function() {
_Sprite_Character_initMembers.apply(this, arguments);
this._shadowSprite = null;
};
var _Sprite_Character_update = Sprite_Character.prototype.update;
Sprite_Character.prototype.update = function() {
_Sprite_Character_update.apply(this, arguments);
this.updateFloating();
};
Sprite_Character.prototype.updateFloating = function() {
if (this._character.isShadowVisible()) {
if (!this._shadowSprite) this.createShadow();
this._shadowSprite.y = this._character.screenShadowY();
this._shadowSprite.opacity = this._character.shadowOpacity();
} else if (this._shadowSprite) {
this.disposeShadow();
}
};
Sprite_Character.prototype.createShadow = function() {
this._shadowSprite = new Sprite();
this._shadowSprite.bitmap = ImageManager.loadSystem('Shadow1');
this._shadowSprite.anchor.x = 0.5;
this._shadowSprite.anchor.y = 1;
this.addChild(this._shadowSprite);
};
Sprite_Character.prototype.disposeShadow = function() {
this.removeChild(this._shadowSprite);
this._shadowSprite = null;
};
})();
复制代码
作者:
xiamumomo
时间:
2021-1-18 23:42
源地址呢
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1