Add english version
This commit is contained in:
parent
7bf44fa645
commit
49e9a37f3c
1675 changed files with 1309268 additions and 0 deletions
572
www.eng/js/plugins/YEP_EventMiniLabel.js
Normal file
572
www.eng/js/plugins/YEP_EventMiniLabel.js
Normal file
|
@ -0,0 +1,572 @@
|
|||
//=============================================================================
|
||||
// Yanfly Engine Plugins - Event Mini Label
|
||||
// YEP_EventMiniLabel.js
|
||||
//=============================================================================
|
||||
|
||||
var Imported = Imported || {};
|
||||
Imported.YEP_EventMiniLabel = true;
|
||||
|
||||
var Yanfly = Yanfly || {};
|
||||
Yanfly.EML = Yanfly.EML || {};
|
||||
Yanfly.EML.version = 1.12
|
||||
|
||||
//=============================================================================
|
||||
/*:
|
||||
* @plugindesc v1.12 Creates miniature-sized labels over events to allow
|
||||
* you to insert whatever text you'd like in them.
|
||||
* @author Yanfly Engine Plugins
|
||||
*
|
||||
* @param Default Show
|
||||
* @desc Show mini labels by default?
|
||||
* @type boolean
|
||||
* @on YES
|
||||
* @off NO
|
||||
* NO - false YES - true
|
||||
* @default true
|
||||
*
|
||||
* @param Minimum Width
|
||||
* @type number
|
||||
* @min 1
|
||||
* @desc What is the minimum width in pixels for mini labels?
|
||||
* @default 136
|
||||
*
|
||||
* @param Font Size
|
||||
* @type number
|
||||
* @min 1
|
||||
* @desc What is the font size used for text inside a mini label?
|
||||
* Default: 28
|
||||
* @default 20
|
||||
*
|
||||
* @param X Buffer
|
||||
* @type number
|
||||
* @desc Alter the X position of the label by this much.
|
||||
* @default 0
|
||||
*
|
||||
* @param Y Buffer
|
||||
* @type number
|
||||
* @desc Alter the Y position of the label by this much.
|
||||
* @default 36
|
||||
*
|
||||
* @param Battle Transition
|
||||
* @type boolean
|
||||
* @on YES
|
||||
* @off NO
|
||||
* @desc Show Event Mini label during battle transition?
|
||||
* NO - false YES - true
|
||||
* @default false
|
||||
*
|
||||
* @help
|
||||
* ============================================================================
|
||||
* Introduction
|
||||
* ============================================================================
|
||||
*
|
||||
* This plugin lets you place text above the heads of various events using a
|
||||
* miniature label through a comment tag.
|
||||
*
|
||||
* ============================================================================
|
||||
* Comment Tags
|
||||
* ============================================================================
|
||||
*
|
||||
* Comment tags are 'notetags' used within the lines of an event's comments.
|
||||
* The reason I'm using the comment tags instead of the notetags is because
|
||||
* each page of an event can yield a different potential name.
|
||||
*
|
||||
* To use this, make a comment within the event you wish to make the mini
|
||||
* label for and insert the following:
|
||||
*
|
||||
* <Mini Label: text>
|
||||
* This will display the 'text' above the event. You can use text codes for
|
||||
* this comment tag and it will create dynamic messages.
|
||||
*
|
||||
* <Mini Label Font Size: x>
|
||||
* This will change the font size used for the mini label to x. If this tag
|
||||
* isn't used, the font size will be the default value in the parameters.
|
||||
*
|
||||
* <Mini Label X Buffer: +x>
|
||||
* <Mini Label X Buffer: -x>
|
||||
* This will adjust the X buffer for the mini label by x value. If this tag
|
||||
* isn't used, the X buffer will be the default value in the parameters.
|
||||
*
|
||||
* <Mini Label Y Buffer: +x>
|
||||
* <Mini Label Y Buffer: -x>
|
||||
* This will adjust the Y buffer for the mini label by x value. If this tag
|
||||
* isn't used, the Y buffer will be the default value in the parameters.
|
||||
*
|
||||
* <Always Show Mini Label>
|
||||
* This will make the mini label to always be shown, even when the plugin
|
||||
* command to hide mini labels is used.
|
||||
*
|
||||
* <Mini Label Range: x>
|
||||
* The player will have to be within x tiles of this event in order for the
|
||||
* mini label to appear visibly.
|
||||
*
|
||||
* <Mini Label Require Facing>
|
||||
* This will require the player to be facing the direction of the event in
|
||||
* order for the mini label to appear.
|
||||
*
|
||||
* ============================================================================
|
||||
* Plugin Commands
|
||||
* ============================================================================
|
||||
*
|
||||
* If you would like to shut off the Event Mini Label mid-game or turn it on,
|
||||
* you can use the following plugin commands:
|
||||
*
|
||||
* Plugin Command:
|
||||
*
|
||||
* HideMiniLabel
|
||||
* Hides all Event Mini Label.
|
||||
*
|
||||
* ShowMiniLabel
|
||||
* Shows all Event Mini Label.
|
||||
*
|
||||
* RefreshMiniLabel
|
||||
* Refreshes all Event Mini Labels on the map.
|
||||
*
|
||||
* ============================================================================
|
||||
* Changelog
|
||||
* ============================================================================
|
||||
*
|
||||
* Version 1.12:
|
||||
* - Updated for RPG Maker MV version 1.5.0.
|
||||
*
|
||||
* Version 1.11:
|
||||
* - Added 'Battle Transition' plugin parameter. Enabling this will allow you
|
||||
* to show the Event Mini Labels during the battle transition. Keeping it
|
||||
* disabled will hide them during the transition.
|
||||
*
|
||||
* Version 1.10:
|
||||
* - Mini Windows will now readjust their size to show at normal scale if the
|
||||
* map is zoomed in.
|
||||
*
|
||||
* Version 1.09:
|
||||
* - Fixed a bug that caused Mini Labels that started off as hidden to remain
|
||||
* hidden even after turning the Mini Labels on.
|
||||
*
|
||||
* Version 1.08:
|
||||
* - Added <Mini Label Require Facing> comment tag.
|
||||
* - Moved the priority of the Mini Labels to be later added to the spriteset
|
||||
* so they can stay on top of more effects.
|
||||
*
|
||||
* Version 1.07:
|
||||
* - Added more padding space so text doesn't get cut off.
|
||||
*
|
||||
* Version 1.06:
|
||||
* - Fixed a bug that caused some mini labels to show if the event was loaded
|
||||
* onto the map without any currently active pages.
|
||||
*
|
||||
* Version 1.05:
|
||||
* - Added 'X Buffer' plugin parameter and the <Mini Label X Buffer: +x> and
|
||||
* <Mini Label X Buffer: -x> comment tags to alter the X position of the event
|
||||
* mini label.
|
||||
*
|
||||
* Version 1.04:
|
||||
* - Added 'RefreshMiniLabel' plugin command to allow you to manually refresh
|
||||
* all mini labels on the map.
|
||||
*
|
||||
* Version 1.03:
|
||||
* - Optimized updating performance to reduce lag on maps with many events.
|
||||
*
|
||||
* Version 1.01:
|
||||
* - Fixed a bug that didn't update event labels under certain page conditions.
|
||||
* - Added <Mini Label Range: x> notetag.
|
||||
*
|
||||
* Version 1.00:
|
||||
* - Finished Plugin!
|
||||
*/
|
||||
//=============================================================================
|
||||
|
||||
//=============================================================================
|
||||
// Parameter Variables
|
||||
//=============================================================================
|
||||
|
||||
Yanfly.Parameters = PluginManager.parameters('YEP_EventMiniLabel');
|
||||
Yanfly.Param = Yanfly.Param || {};
|
||||
|
||||
Yanfly.Param.EMWDefaultShow = eval(String(Yanfly.Parameters['Default Show']));
|
||||
Yanfly.Param.EMWMinWidth = Number(Yanfly.Parameters['Minimum Width']);
|
||||
Yanfly.Param.EMWFontSize = Number(Yanfly.Parameters['Font Size']);
|
||||
Yanfly.Param.EMWBufferX = Number(Yanfly.Parameters['X Buffer']);
|
||||
Yanfly.Param.EMWBufferY = Number(Yanfly.Parameters['Y Buffer']);
|
||||
Yanfly.Param.EMWBatTran = eval(String(Yanfly.Parameters['Battle Transition']));
|
||||
|
||||
//=============================================================================
|
||||
// Game_System
|
||||
//=============================================================================
|
||||
|
||||
Yanfly.EML.Game_System_initialize = Game_System.prototype.initialize;
|
||||
Game_System.prototype.initialize = function() {
|
||||
Yanfly.EML.Game_System_initialize.call(this);
|
||||
this.initEventMiniLabel();
|
||||
};
|
||||
|
||||
Game_System.prototype.initEventMiniLabel = function() {
|
||||
this._showEventMiniLabel = Yanfly.Param.EMWDefaultShow;
|
||||
};
|
||||
|
||||
Game_System.prototype.isShowEventMiniLabel = function() {
|
||||
if (this._showEventMiniLabel === undefined) this.initEventMiniLabel();
|
||||
return this._showEventMiniLabel;
|
||||
};
|
||||
|
||||
Game_System.prototype.setEventMiniLabel = function(value) {
|
||||
this._showEventMiniLabel = value;
|
||||
Game_Interpreter.prototype.refreshEventMiniLabel.call(this);
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// Game_Interpreter
|
||||
//=============================================================================
|
||||
|
||||
Yanfly.EML.Game_Interpreter_pluginCommand =
|
||||
Game_Interpreter.prototype.pluginCommand;
|
||||
Game_Interpreter.prototype.pluginCommand = function(command, args) {
|
||||
Yanfly.EML.Game_Interpreter_pluginCommand.call(this, command, args)
|
||||
if (command === 'HideMiniLabel') $gameSystem.setEventMiniLabel(false);
|
||||
if (command === 'ShowMiniLabel') $gameSystem.setEventMiniLabel(true);
|
||||
if (command === 'RefreshMiniLabel') this.refreshEventMiniLabel();
|
||||
};
|
||||
|
||||
Game_Interpreter.prototype.refreshEventMiniLabel = function() {
|
||||
if ($gameParty.inBattle()) return;
|
||||
var scene = SceneManager._scene;
|
||||
if (scene instanceof Scene_Map) {
|
||||
scene.refreshAllMiniLabels();
|
||||
}
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// Window_EventMiniLabel
|
||||
//=============================================================================
|
||||
|
||||
function Window_EventMiniLabel() {
|
||||
this.initialize.apply(this, arguments);
|
||||
}
|
||||
|
||||
Window_EventMiniLabel.prototype = Object.create(Window_Base.prototype);
|
||||
Window_EventMiniLabel.prototype.constructor = Window_EventMiniLabel;
|
||||
|
||||
Window_EventMiniLabel.prototype.initialize = function() {
|
||||
this._bufferX = Yanfly.Param.EMWBufferX;
|
||||
this._bufferY = Yanfly.Param.EMWBufferY;
|
||||
this._fontSize = Yanfly.Param.EMWFontSize;
|
||||
this._alwaysShow = false;
|
||||
var width = Yanfly.Param.EMWMinWidth;
|
||||
var height = this.windowHeight();
|
||||
this._range = 500;
|
||||
this._reqFacing = false;
|
||||
Window_Base.prototype.initialize.call(this, 0, 0, width, height);
|
||||
this.opacity = 0;
|
||||
this.contentsOpacity = 0;
|
||||
this._character = null;
|
||||
this._page = 0;
|
||||
this._text = '';
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.standardFontSize = function() {
|
||||
if (this._fontSize !== undefined) return this._fontSize;
|
||||
return Yanfly.Param.EMWFontSize;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.windowHeight = function() {
|
||||
var height = this.fittingHeight(1)
|
||||
height = Math.max(height, 36 + this.standardPadding() * 2);
|
||||
return height;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.lineHeight = function() {
|
||||
return this.standardFontSize() + 8;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.bufferX = function() {
|
||||
if (this._bufferX !== undefined) return this._bufferX;
|
||||
return Yanfly.Param.EMWBufferX;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.bufferY = function() {
|
||||
if (this._bufferY !== undefined) return this._bufferY;
|
||||
return Yanfly.Param.EMWBufferY;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.setCharacter = function(character) {
|
||||
this.setText('');
|
||||
this._character = character;
|
||||
if (character._eventId) this.gatherDisplayData();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.gatherDisplayData = function() {
|
||||
this._page = this._character.page();
|
||||
this._pageIndex = this._character._pageIndex;
|
||||
this._range = 500;
|
||||
this._bufferY = Yanfly.Param.EMWBufferY;
|
||||
this._fontSize = Yanfly.Param.EMWFontSize;
|
||||
this._alwaysShow = false;
|
||||
this._reqFacing = false;
|
||||
if (!this._character.page()) {
|
||||
return this.visible = false;
|
||||
}
|
||||
var list = this._character.list();
|
||||
var max = list.length;
|
||||
var comment = '';
|
||||
for (var i = 0; i < max; ++i) {
|
||||
var ev = list[i];
|
||||
if ([108, 408].contains(ev.code)) comment += ev.parameters[0] + '\n';
|
||||
}
|
||||
this.extractNotedata(comment);
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.extractNotedata = function(comment) {
|
||||
if (comment === '') return;
|
||||
var tag1 = /<(?:MINI WINDOW|MINI LABEL):[ ](.*)>/i;
|
||||
var tag2 = /<(?:MINI WINDOW FONT SIZE|MINI LABEL FONT SIZE):[ ](\d+)>/i;
|
||||
var tag3 = /<(?:MINI WINDOW Y BUFFER|MINI LABEL Y BUFFER):[ ]([\+\-]\d+)>/i;
|
||||
var tag4 = /<(?:ALWAYS SHOW MINI WINDOW|ALWAYS SHOW MINI LABEL)>/i;
|
||||
var tag5 = /<(?:MINI WINDOW RANGE|MINI LABEL RANGE):[ ](\d+)>/i;
|
||||
var tag6 = /<(?:MINI WINDOW X BUFFER|MINI LABEL X BUFFER):[ ]([\+\-]\d+)>/i;
|
||||
var tag7 = /<(?:MINI WINDOW REQUIRE FACING|MINI LABEL REQUIRE FACING)>/i;
|
||||
var notedata = comment.split(/[\r\n]+/);
|
||||
var text = '';
|
||||
for (var i = 0; i < notedata.length; ++i) {
|
||||
var line = notedata[i];
|
||||
if (line.match(tag1)) {
|
||||
text = String(RegExp.$1);
|
||||
} else if (line.match(tag2)) {
|
||||
this._fontSize = parseInt(RegExp.$1);
|
||||
} else if (line.match(tag3)) {
|
||||
this._bufferY = parseInt(RegExp.$1);
|
||||
} else if (line.match(tag4)) {
|
||||
this._alwaysShow = true;
|
||||
} else if (line.match(tag5)) {
|
||||
this._range = parseInt(RegExp.$1);
|
||||
} else if (line.match(tag6)) {
|
||||
this._bufferX = parseInt(RegExp.$1);
|
||||
} else if (line.match(tag7)) {
|
||||
this._reqFacing = true;
|
||||
}
|
||||
}
|
||||
this.setText(text);
|
||||
if (this._text === '' || !$gameSystem.isShowEventMiniLabel()) {
|
||||
this.visible = false;
|
||||
this.contentsOpacity = 0;
|
||||
} else {
|
||||
this.visible = true;
|
||||
if (this._reqFacing) {
|
||||
this.contentsOpacity = 0;
|
||||
} else {
|
||||
this.contentsOpacity = 255;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.setText = function(text) {
|
||||
if (this._text === text) return;
|
||||
this._text = text;
|
||||
this.refresh();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.refresh = function() {
|
||||
if (Imported.YEP_SelfSwVar) {
|
||||
$gameTemp.setSelfSwVarEvent(this._character._mapId, this._character._eventId);
|
||||
}
|
||||
this.contents.clear();
|
||||
var txWidth = this.textWidthEx(this._text);
|
||||
txWidth += this.textPadding() * 2;
|
||||
var width = txWidth;
|
||||
this.width = Math.max(width, Yanfly.Param.EMWMinWidth);
|
||||
this.width += this.standardPadding() * 2;
|
||||
this.height = this.windowHeight();
|
||||
this.createContents();
|
||||
var wx = (this.contents.width - txWidth) / 2;
|
||||
var wy = 0;
|
||||
this.drawTextEx(this._text, wx + this.textPadding(), wy);
|
||||
if (Imported.YEP_SelfSwVar) $gameTemp.clearSelfSwVarEvent();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.forceRefresh = function() {
|
||||
this.refresh();
|
||||
this.updateOpacity();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.textWidthEx = function(text) {
|
||||
return this.drawTextEx(text, 0, this.contents.height);
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.update = function() {
|
||||
Window_Base.prototype.update.call(this);
|
||||
if (!this._character) return;
|
||||
if (!this._character._eventId) return;
|
||||
this.updatePage();
|
||||
if (this._text === '') return;
|
||||
this.updateOpacity();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.updatePage = function() {
|
||||
if (this._pageIndex === this._character._pageIndex) return;
|
||||
this._pageIndex = this._character._pageIndex;
|
||||
this.contents.clear();
|
||||
this._text = '';
|
||||
this.gatherDisplayData();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.updateOpacity = function() {
|
||||
if (this.showMiniLabel()) {
|
||||
this.show();
|
||||
} else {
|
||||
this.hide();
|
||||
}
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.show = function() {
|
||||
if (this.contentsOpacity >= 255) return;
|
||||
this.contentsOpacity += 16;
|
||||
this.visible = true;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.hide = function() {
|
||||
if (this.contentsOpacity <= 0) {
|
||||
if (this.visible) this.visible = false;
|
||||
return;
|
||||
}
|
||||
this.contentsOpacity -= 16;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.showMiniLabel = function() {
|
||||
if (this._alwaysShow) return true;
|
||||
if (!this.withinRange()) return false;
|
||||
if (!this.meetsFacingRequirements()) return false;
|
||||
if (!Yanfly.Param.EMWBatTran) {
|
||||
if (SceneManager._scene._encounterEffectDuration > 0) {
|
||||
this.contentsOpacity = 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return $gameSystem.isShowEventMiniLabel();
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.withinRange = function() {
|
||||
if (this._range >= 500) return true;
|
||||
var player = $gamePlayer;
|
||||
var chara = this._character;
|
||||
if (this._range >= Math.abs(player.x - chara.x)) {
|
||||
if (this._range >= Math.abs(player.y - chara.y)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
Window_EventMiniLabel.prototype.meetsFacingRequirements = function() {
|
||||
if (!this._character) return true;
|
||||
if (!this._reqFacing) return true;
|
||||
var direction = $gamePlayer.direction();
|
||||
var playerX = $gamePlayer.x;
|
||||
var playerY = $gamePlayer.y;
|
||||
var eventX = this._character.x;
|
||||
var eventY = this._character.y;
|
||||
switch (direction) {
|
||||
case 1:
|
||||
return playerX >= eventX && playerY <= eventY;
|
||||
break;
|
||||
case 2:
|
||||
return playerY <= eventY;
|
||||
break;
|
||||
case 3:
|
||||
return playerX <= eventX && playerY <= eventY;
|
||||
break;
|
||||
case 4:
|
||||
return playerX >= eventX;
|
||||
break;
|
||||
case 6:
|
||||
return playerX <= eventX;
|
||||
break;
|
||||
case 7:
|
||||
return playerX >= eventX && playerY >= eventY;
|
||||
break;
|
||||
case 8:
|
||||
return playerY >= eventY;
|
||||
break;
|
||||
case 9:
|
||||
return playerX <= eventX && playerY >= eventY;
|
||||
break;
|
||||
default:
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// Sprite_Character
|
||||
//=============================================================================
|
||||
|
||||
Yanfly.EML.Sprite_Character_update = Sprite_Character.prototype.update;
|
||||
Sprite_Character.prototype.update = function() {
|
||||
Yanfly.EML.Sprite_Character_update.call(this);
|
||||
this.updateMiniLabel();
|
||||
this.updateMiniLabelZoom();
|
||||
};
|
||||
|
||||
Sprite_Character.prototype.updateMiniLabel = function() {
|
||||
this.setupMiniLabel();
|
||||
if (!this._miniLabel) return;
|
||||
this.positionMiniLabel();
|
||||
};
|
||||
|
||||
Sprite_Character.prototype.setupMiniLabel = function() {
|
||||
if (this._miniLabel) {
|
||||
if(this._miniLabel._text !== "") {
|
||||
if(!this._miniLabel.parent) {
|
||||
SceneManager._scene._spriteset.addChild(this._miniLabel);
|
||||
}
|
||||
}
|
||||
else if(this._miniLabel._text === "") {
|
||||
if(!!this._miniLabel.parent) {
|
||||
this._miniLabel.parent.removeChild(this._miniLabel);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!SceneManager._scene._spriteset) return;
|
||||
this._miniLabel = new Window_EventMiniLabel();
|
||||
this._miniLabel.setCharacter(this._character);
|
||||
//this.parent.parent.addChild(this._miniLabel);
|
||||
if(this._miniLabel._text === "") {return;}
|
||||
SceneManager._scene._spriteset.addChild(this._miniLabel);
|
||||
};
|
||||
|
||||
Sprite_Character.prototype.positionMiniLabel = function() {
|
||||
if(!this._miniLabel.parent) {return;}
|
||||
var win = this._miniLabel;
|
||||
var width = win.width * win.scale.x;
|
||||
win.x = this.x + width / -2 + win.bufferX();
|
||||
var height = win.height * win.scale.y;
|
||||
var buffer = win.bufferY() * win.scale.y;
|
||||
win.y = this.y + (this.height * -1) - height + buffer;
|
||||
};
|
||||
|
||||
Sprite_Character.prototype.updateMiniLabelZoom = function() {
|
||||
if (!this._miniLabel) return;
|
||||
if (!this._miniLabel.parent) {return;}
|
||||
var spriteset = SceneManager._scene._spriteset;
|
||||
this._miniLabel.scale.x = 1 / spriteset.scale.x;
|
||||
this._miniLabel.scale.y = 1 / spriteset.scale.y;
|
||||
};
|
||||
|
||||
Sprite_Character.prototype.refreshMiniLabel = function() {
|
||||
if (this._miniLabel) this._miniLabel.forceRefresh();
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// Scene_Map
|
||||
//=============================================================================
|
||||
|
||||
Scene_Map.prototype.refreshAllMiniLabels = function() {
|
||||
var length = this._spriteset._characterSprites.length;
|
||||
for (var i = 0; i < length; ++i) {
|
||||
var sp = this._spriteset._characterSprites[i];
|
||||
sp.refreshMiniLabel();
|
||||
}
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// End of File
|
||||
//=============================================================================
|
Loading…
Add table
Add a link
Reference in a new issue