Last active
September 21, 2023 19:52
-
-
Save KageDesu/0ac14cf147fd82ab29cf06366ab6f7e0 to your computer and use it in GitHub Desktop.
PKD Fog Of War plugin v 1.0.1 [Basic]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2021 Vladimir Skrypnikov (Pheonix KageDesu) | |
* <http://kdworkshop.net/> | |
* | |
* License: Creative Commons 4.0 Attribution, Share Alike, Non-Commercial | |
*/ | |
// * CHANGELOG =================== | |
// v1.0.1 (3.02.2022) | |
// - Compatibility fix for VisuMZ_0_CoreEngine plugin | |
// | |
// v1.0 (21.10.2021) | |
// - Release | |
// =============================== | |
/*: | |
* @plugindesc (v.1.0.1)[BASIC] Fog Of War on Map | |
* @author Pheonix KageDesu | |
* @target MZ MV | |
* @url http://kdworkshop.net/plugins/fog-of-war | |
* | |
* | |
* @help | |
* --------------------------------------------------------------------------- | |
* This plugin add fog of war on map | |
* | |
* For activate plugin on certain map, add <PFOG> in map Note section | |
* (not works on maps without Note for performance reasons) | |
* | |
* You can find guide on plugin webpage | |
* | |
* Script calls: | |
* FOG_Refresh(); - refresh fog around player | |
* - use when you change variable with player fog open radius | |
* FOG_OpenInPoint(X, Y, RADIUS); - open fog in certain point on map | |
* - example: FOG_OpenInPoint(3, 4, 3); | |
* FOG_Reset(MAP_ID); - reset fog for certain map. | |
* - use for create fog of war again | |
* - [PRO only] use for clear fog saved state if player never return to | |
* this map. Recommended for reduce savefile size! | |
* | |
* Plugin not have plugin commands | |
* | |
* --------------------------------------------------------------------------- | |
* This is BASIC plugin version and have some restrictions: | |
* - Fog Of War state NOT SAVES when you change map | |
* - NOT HAVE custom fog fragments settings per regions | |
* - Obfuscated plugin code | |
* - Commercial use NOT allowed | |
* | |
* PRO version of plugin don't have this restrictions! | |
* If you like my Plugins, want more and offten updates, | |
* please support me on Patreon! | |
* | |
* Patreon Page: | |
* https://www.patreon.com/KageDesu | |
* YouTube Channel: | |
* https://www.youtube.com/channel/UCA3R61ojF5vp5tGwJ1YqdgQ? | |
* | |
* You can use this plugin in your game thanks to all my Patrons! | |
* | |
* License: Creative Commons 4.0 Attribution, Share Alike, Non-Commercial | |
* | |
* @param resetFog:b | |
* @type boolean | |
* @text Reset Fog? | |
* @on Reset | |
* @off No | |
* @default false | |
* @desc Reset (not save) fog of war state when player change (leave) map? | |
* | |
* @param playerRadiusVarId:int | |
* @type variable | |
* @text Open fog radius | |
* @default 0 | |
* @desc Variable ID that contains value of player open fog radius | |
* | |
* @param fogRegions:intA | |
* @type number[] | |
* @text Regions for Fog | |
* @min 1 | |
* @max 255 | |
* @default [] | |
* @desc Region's ID for Fog on map | |
* | |
* @param fogIgnorePairs:structA | |
* @parent fogRegions:intA | |
* @type struct<FogIgnorePair>[] | |
* @text Ignore Regions | |
* @default [] | |
* @desc Region pairs that not open Fog on each other (read guide) | |
* | |
* @param defFogSettingsGroup:struct | |
* @text Default Fog Settings | |
* @type struct<FogFragmentGroup> | |
* @default {"regionId:i":"0","fogSettings:struct":"{\"color:color\":\"#000000\",\"opacity:i\":\"255\"}","fogSettingsOuter:struct":"{\"color:color\":\"#000000\",\"opacity:i\":\"230\"}","halfFadeSettings:struct":"{\"fadeStep:i\":\"4\",\"fadeSpeed:i\":\"1\"}","fullFadeSettings:struct":"{\"fadeStep:i\":\"6\",\"fadeSpeed:i\":\"1\"}"} | |
* @desc Default fog fragments settings (for all region ID's) | |
* | |
* @param fogFragmentsSettings:structA | |
* @type struct<FogFragmentGroup>[] | |
* @text Custom Fog Settings | |
* @default [] | |
* @desc [PRO only] Custom fog fragments settings per certain Region ID | |
* | |
* | |
*/ | |
/*~struct~FogIgnorePair: | |
* @param regionId:i | |
* @text Main Region ID | |
* @type number | |
* @min 1 | |
* @max 255 | |
* @desc Region ID from Ignored Regions ID's will NOT opened | |
* @default 1 | |
@param ignoredRegions:intA | |
@type number[] | |
@text Ignored Regions ID's | |
@min 1 | |
@max 255 | |
@default [] | |
@desc Region's ID that will NOT open when player stay in Main Region ID | |
*/ | |
/*~struct~FogFragment: | |
* @param color:color | |
* @text Color | |
* @default #000000 | |
* @desc Fog fragment color in HEX | |
* @param opacity:i | |
* @text Opacity | |
* @type number | |
* @min 0 | |
* @max 255 | |
* @desc Fog fragment initial opacity | |
* @default 255 | |
*/ | |
/*~struct~FogFade: | |
* @param fadeStep:i | |
* @text Step | |
* @type number | |
* @min 1 | |
* @max 255 | |
* @desc Fog fragment opacity change value per Speed | |
* @default 4 | |
* @param fadeSpeed:i | |
* @text Speed | |
* @type number | |
* @min 1 | |
* @max 60 | |
* @desc Change fog opacity by Step per Speed frame | |
* @default 1 | |
*/ | |
/*~struct~FogFragmentGroup: | |
* @param regionId:i | |
* @text Region ID | |
* @type number | |
* @min 1 | |
* @max 255 | |
* @desc Region ID for that this settings is. Should be in Regions for Fog parameter | |
* @default 1 | |
* @param fogSettings:struct | |
* @text Fog | |
* @type struct<FogFragment> | |
* @desc Fog fragment settings | |
* @default | |
* @param fogSettingsOuter:struct | |
* @text Outer Fog | |
* @type struct<FogFragment> | |
* @desc Outer fog fragment settings | |
* @default | |
* @param halfFadeSettings:struct | |
* @text Half Open | |
* @type struct<FogFade> | |
* @desc Setting when fog starts open (for half state), near the open fog radius | |
* @default | |
* @param fullFadeSettings:struct | |
* @text Full Open | |
* @type struct<FogFade> | |
* @desc Setting when fog starts open fully (and should disappear), in the open fog radius | |
* @default | |
*/ | |
// * MAIN | |
var Imported = Imported || {}; | |
Imported.PKD_FOG = true; | |
var PKD_FOG = {}; | |
PKD_FOG.version = 101; // 1.0.1 | |
PKD_FOG.link = function (library) { | |
this[library.name] = library; | |
}; | |
// * For parameters | |
PKD_FOG.PP = {}; | |
// * For fog bitmaps | |
// * Битмапы для обоих цветов храняться в кэшэ и используются одни и теже | |
// * Так как не изменяются | |
PKD_FOG.CACHE = {}; | |
// Generated by CoffeeScript 2.5.1 | |
// ========================================================================== | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ KDCore.coffee | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
// * LIBRARY WITH MZ AND MZ SUPPORT | |
//! {OUTER FILE} | |
//?rev 18.09.21 | |
var KDCore; | |
KDCore = KDCore || {}; | |
// * Двузначные числа нельзя в версии, сравнение идёт по первой цифре поулчается | |
KDCore._fileVersion = '2.6'; | |
if ((KDCore.Version != null) && KDCore.Version > KDCore._fileVersion) { | |
// * ПРОПУСКАЕМ ЗАГРУЗКУ, так как уже загруженна более новая | |
console.log('XDev KDCore ' + KDCore._fileVersion + ' skipped by new version'); | |
} else { | |
KDCore.Version = KDCore._fileVersion; | |
KDCore.LIBS = KDCore.LIBS || {}; | |
KDCore.register = function(library) { | |
return this.LIBS[library.name] = library; | |
}; | |
window.KDCore = KDCore; | |
console.warn("XDev KDCore is loaded " + KDCore.Version); | |
(function() { | |
var BitmapSrc, Color, DevLog, Point, SDK, __TMP_LOGS__, ___Sprite_alias_Move_KDCORE_2, __alias_Bitmap_blt_kdCore, __alias_Bitmap_fillAll, i, l, m, o; | |
// * Array Extension | |
//------------------------------------------------------------------------------ | |
Array.prototype.delete = function() { | |
var L, a, ax, what; | |
what = void 0; | |
a = arguments; | |
L = a.length; | |
ax = void 0; | |
while (L && this.length) { | |
what = a[--L]; | |
while ((ax = this.indexOf(what)) !== -1) { | |
this.splice(ax, 1); | |
} | |
} | |
return this; | |
}; | |
Array.prototype.max = function() { | |
return Math.max.apply(null, this); | |
}; | |
Array.prototype.min = function() { | |
return Math.min.apply(null, this); | |
}; | |
Array.prototype.sample = function() { | |
if (this.length === 0) { | |
return []; | |
} | |
return this[SDK.rand(0, this.length - 1)]; | |
}; | |
Array.prototype.first = function() { | |
return this[0]; | |
}; | |
Array.prototype.last = function() { | |
return this[this.length - 1]; | |
}; | |
Array.prototype.shuffle = function() { | |
var k, n, v; | |
n = this.length; | |
while (n > 1) { | |
n--; | |
k = SDK.rand(0, n + 1); | |
v = this[k]; | |
this[k] = this[n]; | |
this[n] = v; | |
} | |
}; | |
Array.prototype.count = function() { | |
return this.length; | |
}; | |
Array.prototype.isEmpty = function() { | |
return this.length === 0; | |
}; | |
// * Ищет элемент, у которого поле ID == id | |
Array.prototype.getById = function(id) { | |
return this.getByField('id', id); | |
}; | |
// * Ищет элемент, у которого поле FIELD (имя поля) == value | |
Array.prototype.getByField = function(field, value) { | |
var e; | |
try { | |
return this.find(function(item) { | |
return item[field] === value; | |
}); | |
} catch (error1) { | |
e = error1; | |
console.warn(e); | |
return null; | |
} | |
}; | |
// * Number Extension | |
//------------------------------------------------------------------------------ | |
Number.prototype.do = function(method) { | |
return SDK.times(this, method); | |
}; | |
Number.prototype.clamp = function(min, max) { | |
return Math.min(Math.max(this, min), max); | |
}; | |
Number.prototype.any = function(number) { | |
return (number != null) && number > 0; | |
}; | |
// * String Extension | |
//------------------------------------------------------------------------------ | |
String.prototype.toCss = function() { | |
return KDCore.Color.FromHex(this).CSS; | |
}; | |
String.prototype.toCSS = function() { | |
return this.toCss(); | |
}; | |
String.prototype.isEmpty = function() { | |
return this.length === 0 || !this.trim(); | |
}; | |
String.isNullOrEmpty = function(str) { | |
return (str == null) || str.isEmpty(); | |
}; | |
String.any = function(str) { | |
return !String.isNullOrEmpty(str); | |
}; | |
String.prototype.replaceAll = function(search, replacement) { | |
var target; | |
target = this; | |
return target.split(search).join(replacement); | |
}; | |
// * Sprite Extension | |
//------------------------------------------------------------------------------ | |
Sprite.prototype.moveToCenter = function(dx = 0, dy = 0) { | |
return this.move(-this.bitmap.width / 2 + dx, -this.bitmap.height / 2 + dy); | |
}; | |
Sprite.prototype.setStaticAnchor = function(floatX = 1, floatY = 1) { | |
this.x -= Math.round(this.width * floatX); | |
this.y -= Math.round(this.height * floatY); | |
}; | |
Sprite.prototype.moveToParentCenter = function() { | |
if (!this.parent) { | |
return; | |
} | |
return this.move(this.parent.width / 2, this.parent.height / 2); | |
}; | |
___Sprite_alias_Move_KDCORE_2 = Sprite.prototype.move; | |
Sprite.prototype.move = function(x, y) { | |
if (x instanceof Array) { | |
return ___Sprite_alias_Move_KDCORE_2.call(this, x[0], x[1]); | |
} else if (x instanceof KDCore.Point || ((x != null ? x.x : void 0) != null)) { | |
return ___Sprite_alias_Move_KDCORE_2.call(this, x.x, x.y); | |
} else if ((x != null) && (x._x != null)) { | |
return ___Sprite_alias_Move_KDCORE_2.call(this, x._x, x._y); | |
} else { | |
return ___Sprite_alias_Move_KDCORE_2.call(this, x, y); | |
} | |
}; | |
Sprite.prototype.isContainsPoint = function(point) { | |
var rect, rx, ry; | |
if (this.width === 0 || this.height === 0) { | |
return false; | |
} | |
rx = KDCore.SDK.toGlobalCoord(this, 'x'); | |
ry = KDCore.SDK.toGlobalCoord(this, 'y'); | |
rect = this._getProperFullRect(rx, ry); | |
return rect.contains(point.x, point.y); | |
}; | |
// * Возвращает Rect с учётом Scale и Anchor спрайта | |
Sprite.prototype._getProperFullRect = function(rx, ry) { | |
var height, width, x, y; | |
width = this.width * Math.abs(this.scale.x); | |
height = this.height * Math.abs(this.scale.y); | |
x = rx - this.anchor.x * width; | |
y = ry - this.anchor.y * height; | |
if (this.anchor.x === 0 && this.scale.x < 0) { | |
x += this.width * this.scale.x; | |
} | |
if (this.anchor.y === 0 && this.scale.y < 0) { | |
y += this.height * this.scale.y; | |
} | |
return new PIXI.Rectangle(x, y, width, height); | |
}; | |
Sprite.prototype.fillAll = function(color) { | |
if (color != null) { | |
return this.bitmap.fillAll(color); | |
} else { | |
return this.fillAll(KDCore.Color.WHITE); | |
} | |
}; | |
Sprite.prototype.removeFromParent = function() { | |
if (this.parent != null) { | |
return this.parent.removeChild(this); | |
} | |
}; | |
// * Bitmap Extension | |
//------------------------------------------------------------------------------ | |
__alias_Bitmap_fillAll = Bitmap.prototype.fillAll; | |
Bitmap.prototype.fillAll = function(color) { | |
if (color instanceof KDCore.Color) { | |
return this.fillRect(0, 0, this.width, this.height, color.CSS); | |
} else { | |
return __alias_Bitmap_fillAll.call(this, color); | |
} | |
}; | |
__alias_Bitmap_blt_kdCore = Bitmap.prototype.blt; | |
Bitmap.prototype.blt = function(source, sx, sy, sw, sh, dx, dy, dw, dh) { | |
if (this._needModBltDWH > 0) { | |
dh = dw = this._needModBltDWH; | |
__alias_Bitmap_blt_kdCore.call(this, source, sx, sy, sw, sh, dx, dy, dw, dh); | |
this._needModBltDWH = null; | |
} else { | |
__alias_Bitmap_blt_kdCore.call(this, ...arguments); | |
} | |
}; | |
Bitmap.prototype.drawIcon = function(x, y, icon, size = 32) { | |
var bitmap; | |
bitmap = null; | |
if (icon instanceof Bitmap) { | |
bitmap = icon; | |
} else { | |
bitmap = BitmapSrc.LoadFromIconIndex(icon).bitmap; | |
} | |
return this.drawOnMe(bitmap, x, y, size, size); | |
}; | |
Bitmap.prototype.drawOnMe = function(bitmap, x = 0, y = 0, sw = 0, sh = 0) { | |
if (sw <= 0) { | |
sw = bitmap.width; | |
} | |
if (sh <= 0) { | |
sh = bitmap.height; | |
} | |
this.blt(bitmap, 0, 0, bitmap.width, bitmap.height, x, y, sw, sh); | |
}; | |
Bitmap.prototype.drawInMe = function(bitmap) { | |
return Bitmap.prototype.drawOnMe(bitmap, 0, 0, this.width, this.height); | |
}; | |
Bitmap.prototype.drawTextFull = function(text, position = 'center') { | |
return this.drawText(text, 0, 0, this.width, this.height, position); | |
}; | |
// * Input Extension | |
//------------------------------------------------------------------------------ | |
Input.KeyMapperPKD = {}; | |
//Numbers | |
for (i = l = 48; l <= 57; i = ++l) { | |
Input.KeyMapperPKD[i] = String.fromCharCode(i); | |
} | |
//Letters Upper | |
for (i = m = 65; m <= 90; i = ++m) { | |
Input.KeyMapperPKD[i] = String.fromCharCode(i).toLowerCase(); | |
} | |
//Letters Lower (for key code events) | |
for (i = o = 97; o <= 122; i = ++o) { | |
Input.KeyMapperPKD[i] = String.fromCharCode(i).toLowerCase(); | |
} | |
(function() { | |
var _input_onKeyDown, _input_onKeyUp; | |
//@[ALIAS] | |
_input_onKeyDown = Input._onKeyDown; | |
Input._onKeyDown = function(event) { | |
_input_onKeyDown.call(this, event); | |
if (Input.keyMapper[event.keyCode]) { | |
return; | |
} | |
Input._setStateWithMapperPKD(event.keyCode); | |
}; | |
//@[ALIAS] | |
_input_onKeyUp = Input._onKeyUp; | |
Input._onKeyUp = function(event) { | |
_input_onKeyUp.call(this, event); | |
if (Input.keyMapper[event.keyCode]) { | |
return; | |
} | |
Input._setStateWithMapperPKD(event.keyCode, false); | |
}; | |
//?NEW | |
Input._setStateWithMapperPKD = function(keyCode, state = true) { | |
var symbol; | |
symbol = Input.KeyMapperPKD[keyCode]; | |
if (symbol != null) { | |
return this._currentState[symbol] = state; | |
} | |
}; | |
//?NEW | |
Input.isCancel = function() { | |
return Input.isTriggered('cancel') || TouchInput.isCancelled(); | |
}; | |
//?NEW | |
TouchInput.toPoint = function() { | |
return new KDCore.Point(TouchInput.x, TouchInput.y); | |
}; | |
})(); | |
(function() { // * Input Extension: KDGamepad | |
//------------------------------------------------------------------------------ | |
// * Поддержка расширенного управления через геймпад (свой модуль) | |
var ALIAS___updateGamepadState, _; | |
//@[DEFINES] | |
_ = Input; | |
// * Активировать работу модуля KDGamepad | |
_.activateExtendedKDGamepad = function() { | |
return _._kdIsGamepadExtended = true; | |
}; | |
//@[ALIAS] | |
ALIAS___updateGamepadState = _._updateGamepadState; | |
_._updateGamepadState = function(gamepad) { | |
if (Input._kdIsGamepadExtended === true) { | |
KDGamepad.update(); | |
} | |
if ((typeof $gameTemp !== "undefined" && $gameTemp !== null ? $gameTemp.__kdgpStopDefaultGamepad : void 0) === true) { | |
return; | |
} | |
// * Режим перемещения без DPad | |
// * В оригинале игрок также ходит по DPad клавишам, что может быть не удобно | |
// * например при работе с инвентарём | |
if (KDGamepad.isNoDPadMoving()) { | |
if (KDGamepad.isDPadAny()) { | |
Input.clear(); | |
return; | |
} | |
} | |
ALIAS___updateGamepadState.call(this, gamepad); | |
}; | |
window.KDGamepad = function() { | |
return new Error("This is static class"); | |
}; | |
window.addEventListener("gamepadconnected", function(event) { | |
var e; | |
try { | |
return KDGamepad.refresh(); | |
} catch (error1) { | |
// * Можно напрямую | |
//unless KDGamepad.isExists() | |
// if event.gamepad? and event.gamepad.mapping == 'standard' | |
// KDGamepad.init(event.gamepad) | |
e = error1; | |
KDCore.warning(e); | |
return KDGamepad.stop(); | |
} | |
}); | |
window.addEventListener("gamepaddisconnected", function(event) { | |
var e; | |
if (!KDGamepad.isExists()) { | |
return; | |
} | |
try { | |
if ((event.gamepad != null) && event.gamepad === KDGamepad.gamepad) { | |
return KDGamepad.stop(); | |
} | |
} catch (error1) { | |
e = error1; | |
KDCore.warning(e); | |
return KDGamepad.stop(); | |
} | |
}); | |
KDGamepad.stopDefaultGamepad = function() { | |
$gameTemp.__kdgpStopDefaultGamepad = true; | |
}; | |
KDGamepad.resumeDefaultGamepad = function() { | |
$gameTemp.__kdgpStopDefaultGamepad = null; | |
}; | |
// * Ссылка на геймпад | |
KDGamepad.gamepad = null; | |
// * Подключён ли Gamepad ? | |
KDGamepad.isExists = function() { | |
return KDGamepad.gamepad != null; | |
}; | |
// * Инициализация состояния кнопок | |
// * Этот метод вызывается автоматически из Refresh или при подключении Gamepad | |
KDGamepad.init = function(gamepad) { | |
KDGamepad.gamepad = gamepad; | |
this._isActive = true; | |
this.buttonNames = [ | |
'A', // 0 | |
'B', // 1 | |
'X', // 2 | |
'Y', // 3 | |
'LB', // 4 | |
'RB', // 5 | |
'LTrigger', // 6 | |
'RTrigger', // 7 | |
'Back', // 8 | |
'Start', // 9 | |
'LStick', // 10 | |
'RStick', // 11 | |
'dUp', // 12 | |
'dDown', // 13 | |
'dLeft', // 14 | |
'dRight' // 15 | |
]; | |
this.reset(); | |
}; | |
// * Аналог Input.clear | |
KDGamepad.clear = function() { | |
return KDGamepad.reset(); | |
}; | |
// * Сбросить состояние кнопок | |
KDGamepad.reset = function() { | |
this.leftStick = { | |
x: 0, | |
y: 0 | |
}; | |
this.rightStick = { | |
x: 0, | |
y: 0 | |
}; | |
this.buttons = {}; | |
this.buttonsPressed = {}; | |
this.prevButtons = {}; | |
}; | |
// * Остановить учёт геймпада | |
KDGamepad.stop = function() { | |
KDGamepad.reset(); | |
KDGamepad.gamepad = null; | |
}; | |
// * Функция проверки что нажата кнопка на геймпаде | |
KDGamepad._buttonPressed = function(gamepad, index) { | |
var b, e; | |
try { | |
if (!gamepad || !gamepad.buttons || index >= gamepad.buttons.length) { | |
return false; | |
} | |
b = gamepad.buttons[index]; | |
if (b == null) { | |
return false; | |
} | |
if (typeof b === 'object') { | |
// * Можно упростить | |
return b.pressed; | |
} | |
return b === 1.0; | |
} catch (error1) { | |
e = error1; | |
KDCore.warning(e); | |
return false; | |
} | |
}; | |
// * Каждый кадр (обновление состояний) | |
KDGamepad.update = function() { | |
var e, gp, isDown, len, name, q, ref; | |
if (!KDGamepad.isActive()) { | |
return; | |
} | |
KDGamepad.refresh(); | |
if (!KDGamepad.isExists()) { | |
return; | |
} | |
try { | |
gp = KDGamepad.gamepad; | |
ref = this.buttonNames; | |
// * Проверка состояний кнопок | |
for (i = q = 0, len = ref.length; q < len; i = ++q) { | |
name = ref[i]; | |
this.buttons[name] = false; | |
isDown = KDGamepad._buttonPressed(gp, i); | |
if (isDown === true) { | |
this.prevButtons[name] = true; | |
} else { | |
// * Срабатываение только при нажал - отпустил | |
if (this.prevButtons[name] === true) { | |
this.buttons[name] = true; | |
this.prevButtons[name] = false; | |
} | |
} | |
} | |
// * Проверка стиков | |
this.leftStick.x = gp.axes[0]; | |
this.leftStick.y = gp.axes[1]; | |
this.rightStick.x = gp.axes[2]; | |
this.rightStick.y = gp.axes[3]; | |
} catch (error1) { | |
e = error1; | |
KDCore.warning(e); | |
KDGamepad.stop(); | |
} | |
}; | |
// * Обновить и проверить состояние Gamepad | |
// * Надо каждый раз это вызывать | |
KDGamepad.refresh = function() { | |
var e, gamepads, gp, isGamepadRefreshed, q, ref; | |
try { | |
isGamepadRefreshed = false; | |
if (navigator.getGamepads) { | |
gamepads = navigator.getGamepads(); | |
} else if (navigator.webkitGetGamepads) { | |
gamepads = navigator.webkitGetGamepads(); | |
} | |
if (gamepads != null) { | |
for (i = q = 0, ref = gamepads.length; (0 <= ref ? q < ref : q > ref); i = 0 <= ref ? ++q : --q) { | |
gp = gamepads[i]; | |
if ((gp != null) && gp.mapping === 'standard') { | |
isGamepadRefreshed = true; | |
if (KDGamepad.buttonNames != null) { | |
KDGamepad.gamepad = gp; | |
} else { | |
KDGamepad.init(gp); | |
} | |
break; | |
} | |
} | |
} | |
if (!isGamepadRefreshed) { | |
// * Если не был найден не один gamepad - отключаем систему | |
KDGamepad.stop(); | |
} | |
} catch (error1) { | |
e = error1; | |
KDCore.warning(e); | |
KDGamepad.stop(); | |
} | |
}; | |
// * Любое нажатие кнопки | |
KDGamepad.isKeyAny = function(name) { | |
return KDGamepad.isKey(name) || KDGamepad.isKeyPressed(name); | |
}; | |
// * Нажата ли кнопка (trigger нажал - отпустил) | |
KDGamepad.isKey = function(name) { | |
if (!KDGamepad.isExists()) { | |
return false; | |
} | |
if (this.buttons == null) { | |
return false; | |
} | |
return this.buttons[name] === true; | |
}; | |
// * Нажата ли кнопка (continues зажата) | |
KDGamepad.isKeyPressed = function(name) { | |
if (!KDGamepad.isExists()) { | |
return false; | |
} | |
if (this.buttons == null) { | |
return false; | |
} | |
return this.prevButtons[name] === true; | |
}; | |
KDGamepad.isDPadAny = function() { | |
return KDGamepad.isKeyAny("dLeft") || KDGamepad.isKeyAny("dRight") || KDGamepad.isKeyAny("dUp") || KDGamepad.isKeyAny("dDown"); | |
}; | |
KDGamepad.isActive = function() { | |
return this._isActive === true; | |
}; | |
// * Временно отключить обработку KDGamepad | |
KDGamepad.setActive = function(_isActive) { | |
this._isActive = _isActive; | |
if (KDGamepad.isActive()) { | |
KDGamepad.refresh(); | |
} else { | |
KDGamepad.stop(); | |
} | |
}; | |
// * Отключить перемещение игрока на DPad | |
KDGamepad.setNoDPadMovingMode = function(_noDpadMoving) { | |
this._noDpadMoving = _noDpadMoving; | |
}; | |
return KDGamepad.isNoDPadMoving = function() { | |
return this._noDpadMoving === true; | |
}; | |
})(); | |
// * Window_Base Extension | |
//------------------------------------------------------------------------------ | |
Window_Base.prototype.drawFaceWithCustomSize = function(faceName, faceIndex, x, y, finalSize) { | |
this.contents._needModBltDWH = finalSize; | |
this.drawFace(faceName, faceIndex, x, y); | |
}; | |
// * SDK | |
//------------------------------------------------------------------------------ | |
SDK = function() { | |
throw new Error('This is a static class'); | |
}; | |
SDK.rand = function(min, max) { | |
return Math.round(Math.random() * (max - min)) + min; | |
}; | |
SDK.setConstantToObject = function(object, constantName, constantValue) { | |
object[constantName] = constantValue; | |
if (typeof object[constantName] === 'object') { | |
Object.freeze(object[constantName]); | |
} | |
Object.defineProperty(object, constantName, { | |
writable: false | |
}); | |
}; | |
SDK.convertBitmapToBase64Data = function(bitmap) { | |
return bitmap._canvas.toDataURL('image/png'); | |
}; | |
SDK.times = function(times, method) { | |
var results; | |
i = 0; | |
results = []; | |
while (i < times) { | |
method(i); | |
results.push(i++); | |
} | |
return results; | |
}; | |
SDK.toGlobalCoord = function(layer, coordSymbol = 'x') { | |
var node, t; | |
t = layer[coordSymbol]; | |
node = layer; | |
while (node) { | |
t -= node[coordSymbol]; | |
node = node.parent; | |
} | |
return (t * -1) + layer[coordSymbol]; | |
}; | |
SDK.canvasToLocalX = function(layer, x) { | |
while (layer) { | |
x -= layer.x; | |
layer = layer.parent; | |
} | |
return x; | |
}; | |
SDK.canvasToLocalY = function(layer, y) { | |
while (layer) { | |
y -= layer.y; | |
layer = layer.parent; | |
} | |
return y; | |
}; | |
SDK.isInt = function(n) { | |
return Number(n) === n && n % 1 === 0; | |
}; | |
SDK.isFloat = function(n) { | |
return Number(n) === n && n % 1 !== 0; | |
}; | |
SDK.checkSwitch = function(switchValue) { | |
if (switchValue === 'A' || switchValue === 'B' || switchValue === 'C' || switchValue === 'D') { | |
return true; | |
} | |
return false; | |
}; | |
SDK.toNumber = function(string, none = 0) { | |
var number; | |
if (string == null) { | |
return none; | |
} | |
number = Number(string); | |
if (isNaN(number)) { | |
return none; | |
} | |
return number; | |
}; | |
// * Color | |
//------------------------------------------------------------------------------ | |
Color = class Color { | |
constructor(r1 = 255, g1 = 255, b1 = 255, a1 = 255) { | |
this.r = r1; | |
this.g = g1; | |
this.b = b1; | |
this.a = a1; | |
} | |
getLightestColor(lightLevel) { | |
var bf, newColor, p; | |
bf = 0.3 * this.R + 0.59 * this.G + 0.11 * this.B; | |
p = 0; | |
newColor = [0, 0, 0, 0]; | |
if (bf - lightLevel >= 0) { | |
if (bf >= 0) { | |
p = Math.abs(bf - lightLevel) / lightLevel; | |
} | |
newColor = this.ARR.map(function(c) { | |
return c - (p * c); | |
}); | |
} else { | |
if (bf >= 0) { | |
p = (lightLevel - bf) / (255 - bf); | |
} | |
newColor = this.ARR.map(function(c) { | |
return [(255 - c) * p + c, 255].min(); | |
}); | |
} | |
return new Color(newColor[0], newColor[1], newColor[2], newColor[3]); | |
} | |
clone() { | |
return this.reAlpha(this.a); | |
} | |
reAlpha(newAlpha) { | |
return new Color(this.r, this.g, this.b, newAlpha || 255); | |
} | |
static AddConstantColor(name, color) { | |
color.toHex(); | |
color.toArray(); | |
color.toCSS(); | |
SDK.setConstantToObject(Color, name, color); | |
} | |
toHex() { | |
var b, g, r; | |
if (this._colorHex != null) { | |
return this._colorHex; | |
} | |
r = Math.floor(this.r).toString(16).padZero(2); | |
g = Math.floor(this.g).toString(16).padZero(2); | |
b = Math.floor(this.b).toString(16).padZero(2); | |
return this._colorHex = '#' + r + g + b; | |
} | |
toArray() { | |
if (this._colorArray != null) { | |
return this._colorArray; | |
} | |
return this._colorArray = [this.r, this.g, this.b, this.a]; | |
} | |
toCSS() { | |
var na, nb, ng, nr; | |
if (this._colorCss != null) { | |
return this._colorCss; | |
} | |
nr = Math.round(this.r); | |
ng = Math.round(this.g); | |
nb = Math.round(this.b); | |
na = this.a / 255; | |
return this._colorCss = `rgba(${nr},${ng},${nb},${na})`; | |
} | |
toNumber() { | |
return Number(this.toHex().replace("#", "0x")); | |
} | |
static Random() { | |
var a, b, c; | |
a = SDK.rand(1, 254); | |
b = SDK.rand(1, 254); | |
c = SDK.rand(1, 254); | |
return new Color(a, b, c, 255); | |
} | |
static FromHex(hexString) { | |
var color, result; | |
result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexString); | |
color = null; | |
if (result != null) { | |
color = { | |
r: parseInt(result[1], 16), | |
g: parseInt(result[2], 16), | |
b: parseInt(result[3], 16) | |
}; | |
} | |
if (color != null) { | |
return new Color(color.r, color.g, color.b, 255); | |
} else { | |
return Color.NONE; | |
} | |
} | |
}; | |
Object.defineProperties(Color.prototype, { | |
R: { | |
get: function() { | |
return this.r; | |
}, | |
configurable: true | |
}, | |
G: { | |
get: function() { | |
return this.g; | |
}, | |
configurable: true | |
}, | |
B: { | |
get: function() { | |
return this.b; | |
}, | |
configurable: true | |
}, | |
A: { | |
get: function() { | |
return this.a; | |
}, | |
configurable: true | |
}, | |
ARR: { | |
get: function() { | |
return this.toArray(); | |
}, | |
configurable: true | |
}, | |
CSS: { | |
get: function() { | |
return this.toCSS(); | |
}, | |
configurable: true | |
}, | |
HEX: { | |
get: function() { | |
return this.toHex(); | |
}, | |
configurable: true | |
}, | |
OX: { | |
get: function() { | |
return this.toNumber(); | |
}, | |
configurable: true | |
} | |
}); | |
Color.AddConstantColor('NONE', new Color(0, 0, 0, 0)); | |
Color.AddConstantColor('BLACK', new Color(0, 0, 0, 255)); | |
Color.AddConstantColor('WHITE', new Color(255, 255, 255, 255)); | |
Color.AddConstantColor('RED', new Color(255, 0, 0, 255)); | |
Color.AddConstantColor('GREEN', new Color(0, 255, 0, 255)); | |
Color.AddConstantColor('BLUE', new Color(0, 0, 255, 255)); | |
Color.AddConstantColor('AQUA', new Color(128, 255, 255, 255)); | |
Color.AddConstantColor('MAGENTA', new Color(128, 0, 128, 255)); | |
Color.AddConstantColor('YELLOW', new Color(255, 255, 0, 255)); | |
Color.AddConstantColor('ORANGE', new Color(255, 128, 0, 255)); | |
BitmapSrc = (function() { | |
//BitmapSrc | |
//------------------------------------------------------------------------------ | |
class BitmapSrc { | |
constructor() { | |
this.bitmap = null; | |
} | |
static LoadFromIconIndex(iconIndex) { | |
var bs, icon_bitmap, iconset, ph, pw, sx, sy; | |
bs = new BitmapSrc(); | |
if (BitmapSrc.CACHE[iconIndex] == null) { | |
iconset = ImageManager.loadSystem('IconSet'); | |
if (KDCore.isMV()) { | |
pw = Window_Base._iconWidth; | |
ph = Window_Base._iconHeight; | |
} else { | |
pw = ImageManager.iconWidth; | |
ph = ImageManager.iconHeight; | |
} | |
sx = iconIndex % 16 * pw; | |
sy = Math.floor(iconIndex / 16) * ph; | |
icon_bitmap = new Bitmap(pw, ph); | |
icon_bitmap.addLoadListener(function() { | |
icon_bitmap.blt(iconset, sx, sy, pw, ph, 0, 0); | |
}); | |
BitmapSrc.CACHE[iconIndex] = icon_bitmap; | |
} | |
bs.bitmap = BitmapSrc.CACHE[iconIndex]; | |
return bs; | |
} | |
static LoadFromImageFolder(filename) { | |
var bs; | |
bs = new BitmapSrc(); | |
bs.bitmap = ImageManager.loadPicture(filename); | |
return bs; | |
} | |
static LoadFromBase64(data, name) { | |
var bs; | |
bs = new BitmapSrc(); | |
if (name != null) { | |
if (BitmapSrc.CACHE[name] != null) { | |
bs.bitmap = BitmapSrc.CACHE[name]; | |
} else { | |
BitmapSrc.CACHE[name] = Bitmap.load(data); | |
bs.bitmap = BitmapSrc.CACHE[name]; | |
} | |
} else { | |
bs.bitmap = Bitmap.load(data); | |
} | |
return bs; | |
} | |
static LoadFromMemory(symbol) { | |
var bs; | |
bs = new BitmapSrc(); | |
if (BitmapSrc.CACHE[symbol] != null) { | |
bs.bitmap = BitmapSrc.CACHE[symbol]; | |
} else { | |
bs.bitmap = ImageManager.loadEmptyBitmap(); | |
} | |
return bs; | |
} | |
}; | |
BitmapSrc.CACHE = {}; | |
return BitmapSrc; | |
}).call(this); | |
// * DevLog | |
//------------------------------------------------------------------------------ | |
__TMP_LOGS__ = []; | |
DevLog = class DevLog { | |
constructor(prefix = "") { | |
this.prefix = prefix; | |
this._isShow = typeof DEV !== 'undefined'; | |
this._color = Color.BLACK; | |
this._backColor = Color.WHITE; | |
__TMP_LOGS__.push(this); | |
} | |
on() { | |
this._isShow = true; | |
return this; | |
} | |
off() { | |
this._isShow = false; | |
return this; | |
} | |
applyRandomColors() { | |
this.applyRandomWithoutBackgroundColors(); | |
this.setBackColor(Color.Random()); | |
return this; | |
} | |
applyRandomWithoutBackgroundColors() { | |
this.setColor(Color.Random()); | |
return this; | |
} | |
setColor(color) { | |
this._color = color; | |
return this; | |
} | |
setBackColor(backColor) { | |
this._backColor = backColor; | |
return this; | |
} | |
applyLibraryColors() { | |
this.setColors(new Color(22, 120, 138, 0), Color.BLACK); | |
return this; | |
} | |
setColors(color, backColor) { | |
this.setColor(color); | |
this.setBackColor(backColor); | |
return this; | |
} | |
applyExtensionColors() { | |
this.setColors(new Color(22, 143, 137, 0), Color.BLACK.getLightestColor(60)); | |
return this; | |
} | |
applyWarningColors() { | |
this.setColors(Color.ORANGE, Color.BLACK.getLightestColor(100)); | |
return this; | |
} | |
p(text) { | |
if (!this._isShow) { | |
return; | |
} | |
if (text == null) { | |
console.log(""); | |
} | |
this._printText(text); | |
} | |
_printText(text) { | |
text = this.prefix + " : " + text; | |
if (this._isUsingColor()) { | |
return this._printTextWithColors(text); | |
} else { | |
return console.log(text); | |
} | |
} | |
_isUsingColor() { | |
return this._color !== Color.BLACK || this._backColor !== Color.WHITE; | |
} | |
_printTextWithColors(text) { | |
var args; | |
args = ['%c' + text, `color: ${this._color.HEX} ; background: ${this._backColor.HEX};`]; | |
return window.console.log.apply(console, args); | |
} | |
static CreateForLib(library) { | |
var dlog; | |
dlog = new DevLog(library.name); | |
dlog.applyLibraryColors(); | |
return dlog; | |
} | |
static EnableAllLogs() { | |
return __TMP_LOGS__.forEach(function(log) { | |
return log.on(); | |
}); | |
} | |
}; | |
// * ParametersManager | |
//------------------------------------------------------------------------------ | |
PluginManager.getPluginParametersByRoot = function(rootName) { | |
var pluginParameters, property; | |
for (property in this._parameters) { | |
if (this._parameters.hasOwnProperty(property)) { | |
pluginParameters = this._parameters[property]; | |
if (PluginManager.isPluginParametersContentKey(pluginParameters, rootName)) { | |
return pluginParameters; | |
} | |
} | |
} | |
return PluginManager.parameters(rootName); | |
}; | |
PluginManager.isPluginParametersContentKey = function(pluginParameters, key) { | |
return pluginParameters[key] != null; | |
}; | |
//@[AUTO EXTEND] | |
//?[DEPRECATED] | |
KDCore.ParametersManager = class ParametersManager { | |
constructor(pluginName) { | |
this.pluginName = pluginName; | |
this._cache = {}; | |
this._parameters = PluginManager.getPluginParametersByRoot(this.pluginName); | |
} | |
isLoaded() { | |
return (this._parameters != null) && this._parameters.hasOwnProperty(this.pluginName); | |
} | |
isHasParameter(name) { | |
return this._parameters[name] != null; | |
} | |
getString(name) { | |
return this._parameters[name]; | |
} | |
convertField(object, fieldName) { | |
var e; | |
try { | |
object[fieldName] = JSON.parse(object[fieldName] || 'false'); | |
} catch (error1) { | |
e = error1; | |
console.error('Error while convert field ' + e.name); | |
object[fieldName] = false; | |
} | |
return object; | |
} | |
convertImage(object, fieldName) { | |
return object[fieldName] = this.loadImage(object[fieldName]); | |
} | |
loadImage(filename, smooth) { | |
var e, path; | |
try { | |
if (filename) { | |
path = filename.split('/'); | |
filename = path.last(); | |
path = path.first() + '/'; | |
return ImageManager.loadBitmap('img/' + path, filename, 0, smooth || true); | |
} else { | |
return ImageManager.loadEmptyBitmap(); | |
} | |
} catch (error1) { | |
e = error1; | |
console.error(e); | |
return ImageManager.loadEmptyBitmap(); | |
} | |
} | |
getFromCacheOrInit(name, func) { | |
var object; | |
if (!this.isInCache(name)) { | |
if (func != null) { | |
object = func.call(this); | |
this.putInCache(name, object); | |
} | |
} | |
return this.getFromCache(name); | |
} | |
isInCache(name) { | |
return this._cache.hasOwnProperty(name); | |
} | |
putInCache(name, object) { | |
return this._cache[name] = object; | |
} | |
getFromCache(name) { | |
return this._cache[name]; | |
} | |
getNumber(name) { | |
var number; | |
number = this.getObject(name); | |
if (SDK.isInt(number)) { | |
return number; | |
} | |
return 0; | |
} | |
getObject(name) { | |
if (this.isHasParameter(name)) { | |
return JSON.parse(this.getString(name) || '{}'); | |
} else { | |
return {}; | |
} | |
} | |
getBoolean(name) { | |
if (this.isHasParameter(name)) { | |
return JSON.parse(this.getString(name) || false); | |
} else { | |
return false; | |
} | |
} | |
getBooleanFromCacheWithDefault(name, defaultValue) { | |
if (this.isHasParameter(name)) { | |
return this.getBooleanFromCache(name); | |
} else { | |
return defaultValue; | |
} | |
} | |
getNumberFromCacheWithDefault(name, defaultValue) { | |
if (this.isHasParameter(name)) { | |
return this.getNumberFromCache(name); | |
} else { | |
return defaultValue; | |
} | |
} | |
getStringFromCacheWithDefault(name, defaultValue) { | |
if (this.isHasParameter(name)) { | |
return this.getStringFromCache(name); | |
} else { | |
return defaultValue; | |
} | |
} | |
getBooleanFromCache(name) { | |
return this.getFromCacheOrInit(name, function() { | |
return this.getBoolean(name); | |
}); | |
} | |
getNumberFromCache(name) { | |
return this.getFromCacheOrInit(name, function() { | |
return this.getNumber(name); | |
}); | |
} | |
getStringFromCache(name) { | |
return this.getFromCacheOrInit(name, function() { | |
return this.getString(name); | |
}); | |
} | |
}; | |
// * ParamLoader (ParametersManager alternative) | |
//@[AUTO EXTEND] | |
KDCore.ParamLoader = class ParamLoader { | |
constructor(pluginName) { | |
this.pluginName = pluginName; | |
this.paramsRaw = PluginManager.getPluginParametersByRoot(this.pluginName); | |
this.params = this.parseParameters(this.paramsRaw); | |
} | |
parseParameters(paramSet) { | |
var clearKey, key, params, typeKey, value; | |
params = {}; | |
for (key in paramSet) { | |
value = paramSet[key]; | |
clearKey = this.parseKey(key); | |
typeKey = this.parseKeyType(key); | |
params[clearKey] = this.parseParamItem(typeKey, value); | |
} | |
return params; | |
} | |
parseKey(keyRaw) { | |
return keyRaw.split(":")[0]; | |
} | |
parseKeyType(keyRaw) { | |
return keyRaw.split(":")[1]; | |
} | |
// * Проверка, загружены ли параметры плагина | |
isLoaded() { | |
return (this.paramsRaw != null) && this.paramsRaw.hasOwnProperty(this.pluginName); | |
} | |
// * Имя параметра без ключа | |
isHasParameter(paramName) { | |
return this.params[paramName] != null; | |
} | |
// * Возвращает значение параметра (def - по умолчанию, если не найден) | |
getParam(paramName, def) { | |
if (this.isHasParameter(paramName)) { | |
return this.params[paramName]; | |
} else { | |
return def; | |
} | |
} | |
// * Данные ключи должны идти после названия параметра через : | |
// * Пример: @param ShowDelay:int, @param TestBool:bool | |
// * Текстовые параметры, которые надо вернуть как есть, можно без типа (text, file, combo, ...) | |
parseParamItem(type, item) { | |
var e; | |
if (type == null) { | |
return item; | |
} | |
try { | |
switch (type) { | |
case "int": | |
case "i": | |
return parseInt(item); | |
case "intA": // * массив чисел | |
if (String.any(item)) { | |
return JsonEx.parse(item).map((e) => { | |
return this.parseParamItem("int", e); | |
}); | |
} else { | |
return []; | |
} | |
break; | |
case "bool": | |
case "b": | |
case "e": | |
return eval(item); | |
case "struct": | |
case "s": | |
if (String.any(item)) { | |
return this.parseParameters(JsonEx.parse(item)); | |
} else { | |
return null; | |
} | |
break; | |
case "structA": // * массив структур | |
return JsonEx.parse(item).map((e) => { | |
return this.parseParameters(JsonEx.parse(e)); | |
}); | |
case "str": | |
return item; | |
case "strA": | |
if (String.any(item)) { | |
return JsonEx.parse(item).map((e) => { | |
return this.parseParamItem("str", e); | |
}); | |
} else { | |
return []; | |
} | |
break; | |
case "note": // * если несколько строк в тексте | |
return JsonEx.parse(item); | |
case "css": | |
return item.toCss(); | |
case "color": | |
return KDCore.Color.FromHex(item); | |
default: | |
return item; | |
} | |
} catch (error1) { | |
e = error1; | |
console.warn(e); | |
return item; | |
} | |
} | |
}; | |
Point = (function() { | |
// * Point | |
//------------------------------------------------------------------------------ | |
class Point { | |
constructor(_x = 0, _y = 0) { | |
this._x = _x; | |
this._y = _y; | |
} | |
clone() { | |
return new Point(this._x, this._y); | |
} | |
toString() { | |
return "[" + this._x + " ; " + this._y + "]"; | |
} | |
isSame(anotherPoint) { | |
return this.x === anotherPoint.x && this.y === anotherPoint.y; | |
} | |
convertToCanvas() { | |
return new Point(Graphics.pageToCanvasX(this._x), Graphics.pageToCanvasY(this._y)); | |
} | |
convertToMap() { | |
return new Point($gameMap.canvasToMapX(this._x), $gameMap.canvasToMapY(this._y)); | |
} | |
convertToScreen() { | |
return new Point(this.screenX(), this.screenY()); | |
} | |
screenX() { | |
var t, tw; | |
t = $gameMap.adjustX(this._x); | |
tw = $gameMap.tileWidth(); | |
return Math.round(t * tw + tw / 2); | |
} | |
screenY() { | |
var t, th; | |
t = $gameMap.adjustY(this._y); | |
th = $gameMap.tileHeight(); | |
return Math.round(t * th + th); | |
} | |
round() { | |
return new Point(Math.round(this._x), Math.round(this._y)); | |
} | |
floor() { | |
return new Point(Math.floor(this._x), Math.floor(this._y)); | |
} | |
mapPointOnScreen() { | |
var nx, ny; | |
nx = (this._x * $gameMap.tileWidth()) - ($gameMap.displayX() * $gameMap.tileWidth()); | |
ny = (this._y * $gameMap.tileHeight()) - ($gameMap.displayY() * $gameMap.tileHeight()); | |
return new Point(nx, ny); | |
} | |
multiplyBy(val) { | |
return new Point(this._x * val, this._y * val); | |
} | |
simple() { | |
return new PIXI.Point(this.x, this.y); | |
} | |
delta(point) { | |
var dx, dy; | |
dx = point.x - this._x; | |
dy = point.y - this._y; | |
return new KDCore.Point(dx, dy); | |
} | |
static _getEmpty() { | |
if (Point._emptyPoint == null) { | |
Point._emptyPoint = new Point(0, 0); | |
} | |
return Point._emptyPoint; | |
} | |
}; | |
Object.defineProperties(Point.prototype, { | |
x: { | |
get: function() { | |
return this._x; | |
}, | |
configurable: true | |
}, | |
y: { | |
get: function() { | |
return this._y; | |
}, | |
configurable: true | |
} | |
}); | |
Object.defineProperties(Point, { | |
Empty: { | |
get: function() { | |
return Point._getEmpty(); | |
}, | |
configurable: false | |
} | |
}); | |
Array.prototype.toPoint = function() { | |
return new Point(this[0], this[1]); | |
}; | |
Sprite.prototype.toPoint = function() { | |
return new Point(this.x, this.y); | |
}; | |
Game_CharacterBase.prototype.toPoint = function() { | |
return new Point(this.x, this.y); | |
}; | |
return Point; | |
}).call(this); | |
// * Utils | |
//------------------------------------------------------------------------------ | |
KDCore.Utils = KDCore.Utils || {}; | |
(function() { | |
var _; | |
_ = KDCore.Utils; | |
_.getJDataById = function(id, source) { | |
var d, len, q; | |
for (q = 0, len = source.length; q < len; q++) { | |
d = source[q]; | |
if (d.id === id) { | |
return d; | |
} | |
} | |
return null; | |
}; | |
_.hasMeta = function(symbol, obj) { | |
return (obj.meta != null) && (obj.meta[symbol] != null); | |
}; | |
_.getValueFromMeta = function(symbol, obj) { | |
if (!_.hasMeta(symbol, obj)) { | |
return null; | |
} | |
return obj.meta[symbol]; | |
}; | |
_.getNumberFromMeta = function(symbol, obj) { | |
var value; | |
if (!_.hasMeta(symbol, obj)) { | |
return null; | |
} | |
if (obj.meta[symbol] === true) { | |
return 0; | |
} else { | |
value = KDCore.SDK.toNumber(obj.meta[symbol], 0); | |
} | |
return value; | |
}; | |
_.isSceneMap = function() { | |
try { | |
return SceneManager._scene instanceof Scene_Map; | |
} catch (error1) { | |
return false; | |
} | |
}; | |
_.isSceneBattle = function() { | |
try { | |
return SceneManager._scene instanceof Scene_Battle; | |
} catch (error1) { | |
return false; | |
} | |
}; | |
_.getEventCommentValue = function(commentCode, list) { | |
var comment, e, item; | |
try { | |
if (list && list.length > 1) { | |
i = 0; | |
while (i < list.length) { | |
item = list[i++]; | |
if (!item) { | |
continue; | |
} | |
if (item.code === 108) { | |
comment = item.parameters[0]; | |
if (comment.contains(commentCode)) { | |
return comment; | |
} | |
} | |
} | |
} | |
} catch (error1) { | |
e = error1; | |
console.warn(e); | |
} | |
return null; | |
}; | |
_.getEventCommentValueArray = function(commentCode, list) { | |
var comment, comments, e, item; | |
try { | |
comments = []; | |
if (list && list.length > 1) { | |
i = 0; | |
while (i < list.length) { | |
item = list[i++]; | |
if (!item) { | |
continue; | |
} | |
if (item.code === 108) { | |
comment = item.parameters[0]; | |
if (comment.contains(commentCode)) { | |
comments.push(comment); | |
} | |
} | |
} | |
} | |
} catch (error1) { | |
e = error1; | |
console.warn(e); | |
} | |
return comments; | |
}; | |
_.getPositionPointFromJSON = function(jsonSettings) { | |
return _.convertPositionPointFromJSON(jsonSettings.position); | |
}; | |
_.convertPositionPointFromJSON = function(position) { | |
var e, x, y; | |
try { | |
x = position[0]; | |
y = position[1]; | |
if (!KDCore.SDK.isInt(x)) { | |
x = eval(x); | |
} | |
if (!KDCore.SDK.isInt(y)) { | |
y = eval(y); | |
} | |
return new KDCore.Point(x, y); | |
} catch (error1) { | |
e = error1; | |
console.warn('Utils.getPositionPointFromJSON', e); | |
return KDCore.Point.Empty; | |
} | |
}; | |
_.jsonPos = function(jsonPosition) { | |
return _.convertPositionPointFromJSON(jsonPosition); | |
}; | |
_.jsonPosXY = function(jsonPosition) { | |
var e, x, y; | |
try { | |
({x, y} = jsonPosition); | |
return new KDCore.Point(eval(x), eval(y)); | |
} catch (error1) { | |
e = error1; | |
console.warn('Utils.jsonPosXY', e); | |
return KDCore.Point.Empty; | |
} | |
}; | |
_.getVar = function(id) { | |
return $gameVariables.value(id); | |
}; | |
_.setVar = function(id, value) { | |
return $gameVariables.setValue(id, value); | |
}; | |
_.addToVar = function(id, value) { | |
var prevVal; | |
prevVal = _.getVar(id); | |
return _.setVar(id, prevVal + value); | |
}; | |
_.playSE = function(seFileName, pitch = 100, volume = 100) { | |
var sound; | |
if (seFileName == null) { | |
return; | |
} | |
if (seFileName === "") { | |
return; | |
} | |
sound = { | |
name: seFileName, | |
pan: 0, | |
pitch: pitch, | |
volume: volume | |
}; | |
AudioManager.playStaticSe(sound); | |
}; | |
_.getItemTypeId = function(item) { | |
if (DataManager.isWeapon(item)) { | |
return 1; | |
} else if (DataManager.isArmor(item)) { | |
return 2; | |
} | |
return 0; | |
}; | |
_.getItemByType = function(itemId, typeId) { | |
var data; | |
data = [$dataItems, $dataWeapons, $dataArmors]; | |
return data[typeId][itemId]; | |
}; | |
_.loadFont = function(name) { | |
if (!KDCore.isMZ()) { | |
return; | |
} | |
if (String.isNullOrEmpty(name)) { | |
return; | |
} | |
if (FontManager._states[name] != null) { | |
return; | |
} | |
FontManager.load(name, name + ".ttf"); | |
}; | |
_.convertTimeShort = function(seconds) { | |
var e; | |
try { | |
if (seconds > 59) { | |
return Math.floor(seconds / 60) + 'm'; | |
} else { | |
return seconds; | |
} | |
} catch (error1) { | |
e = error1; | |
console.warn(e); | |
return seconds; | |
} | |
}; | |
_.isPointInScreen = function(point, margin = 10) { | |
var maxH, maxW, screenMargin, x, y; | |
({x, y} = point); | |
maxW = Graphics.width; | |
maxH = Graphics.height; | |
// * Граница от краёв экрана | |
screenMargin = margin; | |
if (x < screenMargin) { | |
return false; | |
} | |
if (y < screenMargin) { | |
return false; | |
} | |
if (x > (maxW - screenMargin)) { | |
return false; | |
} | |
if (y > (maxH - screenMargin)) { | |
return false; | |
} | |
return true; | |
}; | |
// * Ассинхронная загрузка изображения, возвращает bitmap, когда загружен | |
// * Пример использования loadImageAsync(a, b).then(метод) | |
// в метод будет передан bitmap первым аргументом | |
_.loadImageAsync = async function(folder, filename) { | |
var promise; | |
promise = new Promise(function(resolve, reject) { | |
var b; | |
b = ImageManager.loadBitmap("img/" + folder + "/", filename); | |
return b.addLoadListener(function() { | |
return resolve(b); | |
}); | |
}); | |
return (await promise); | |
}; | |
})(); | |
// * TimedUpdate | |
//------------------------------------------------------------------------------ | |
//@[AUTO EXTEND] | |
KDCore.TimedUpdate = class TimedUpdate { | |
constructor(interval, method1) { | |
this.interval = interval; | |
this.method = method1; | |
this._timer = 0; | |
this._once = false; | |
} | |
update() { | |
if (this.interval == null) { | |
return; | |
} | |
if (this._timer++ >= this.interval) { | |
this.call(); | |
this._timer = 0; | |
if (this._once === true) { | |
return this.stop(); | |
} | |
} | |
} | |
once() { | |
return this._once = true; | |
} | |
onUpdate(method1) { | |
this.method = method1; | |
} | |
stop() { | |
return this.interval = null; | |
} | |
isAlive() { | |
return this.interval != null; | |
} | |
// * Рандомизировать интервал @interval (-min, +max) | |
applyTimeRange(min, max) { | |
var value; | |
if (!this.isAlive()) { | |
return; | |
} | |
value = SDK.rand(min, max); | |
return this.interval += value; | |
} | |
call() { | |
if (this.method != null) { | |
return this.method(); | |
} | |
} | |
}; | |
// * Button (Sprite_XButton) | |
//------------------------------------------------------------------------------ | |
//@[AUTO EXTEND] | |
//?DEPRECATED | |
KDCore.Button = class Button extends Sprite { | |
constructor() { | |
super(); | |
this._mouseIn = false; | |
this._touching = false; | |
this._slowUpdateActive = false; | |
this._localMode = false; | |
this._images = []; | |
this._checkAlpha = false; | |
this._textSprite = null; | |
this._textPosition = 0; | |
this._override = false; // * TouchClick in game messages not work anymore if TRUE | |
this._clickHandlers = []; | |
this._manualHided = false; | |
this._manualDisabled = false; | |
this._condition = null; // * Условие для Visible | |
this._condition2 = null; // * Условие для Enable \ Disable | |
this._disabled = false; | |
this._infoData = null; | |
this._isNeedShowText = false; | |
return; | |
} | |
isMouseInButton() { | |
return this._mouseIn === true; | |
} | |
isActive() { | |
return this.visible === true; | |
} | |
activateSlowUpdate() { | |
return this._slowUpdateActive = true; | |
} | |
setLocalMode() { | |
this._realX = this.x; | |
this._realY = this.y; | |
return this._localMode = true; | |
} | |
setAlphaMode() { | |
return this._checkAlpha = true; | |
} | |
// * above, below | |
setTextPosition(position) { | |
return this._textPosition = position; | |
} | |
setHelpText(text, size) { | |
return this._createText(text, size); | |
} | |
setInfoData(data) { | |
return this._infoData = data; | |
} | |
setOverrideMode() { | |
return this._override = true; | |
} | |
isOverride() { | |
return this._override === true && this.isActive() && this.touchInButton(); | |
} | |
isDisabled() { | |
return this._disabled === true; | |
} | |
isEnabled() { | |
return !this.isDisabled(); | |
} | |
isNeedShowText() { | |
return this._isNeedShowText === true; | |
} | |
addClickHandler(method) { | |
return this._clickHandlers.push(method); | |
} | |
clearClickHandlers() { | |
return this._clickHandlers = []; | |
} | |
isLocalMode() { | |
return this._localMode === true; | |
} | |
setCondition(method) { | |
return this._condition = method; | |
} | |
setConditionForDisable(method) { | |
return this._condition2 = method; | |
} | |
getInfoData() { | |
return this._infoData; | |
} | |
simulateClick() { //?NEW | |
return this.applyClickedState(); | |
} | |
simulateClickManual() { //?NEW | |
this.simulateClick(); | |
return setTimeout((() => { | |
try { | |
return this.applyNormalState(); | |
} catch (error1) { | |
} | |
}), 50); | |
} | |
prepare() { //?NEW | |
return this.slowUpdate(); | |
} | |
realX() { | |
if (this.isLocalMode()) { | |
return this._realX; | |
} else { | |
return this.x; | |
} | |
} | |
realY() { | |
if (this.isLocalMode()) { | |
return this._realY; | |
} else { | |
return this.y; | |
} | |
} | |
show() { | |
this.visible = true; | |
return this._manualHided = false; | |
} | |
hide() { | |
this.visible = false; | |
return this._manualHided = true; | |
} | |
disable() { | |
this._disabled = true; | |
this._manualDisabled = true; | |
this.refreshEnDisState(); | |
return this._mouseIn = false; | |
} | |
enable() { | |
this._disabled = false; | |
this._manualDisabled = false; | |
return this.refreshEnDisState(); | |
} | |
update() { | |
super.update(); | |
if (this._destroyed === true) { | |
return; | |
} | |
this.updateMouseClick(); | |
this.updatePosition(); | |
if (!this._slowUpdateActive) { | |
this.slowUpdate(); | |
} | |
return this.updateComplexTextVisible(); | |
} | |
slowUpdate() { | |
if (this._destroyed === true) { | |
return; | |
} | |
this.updateMouseTracking(); | |
this.updateConditionForVisible(); | |
return this.updateConditionForEnabling(); | |
} | |
updateMouseTracking() { | |
if (!this.isActive()) { | |
return; | |
} | |
if (this.isDisabled()) { | |
return; | |
} | |
if (this.cursorInButton()) { | |
this._onMouseEnter(); | |
return this._mouseIn = true; | |
} else { | |
this._onMouseLeave(); | |
return this._mouseIn = false; | |
} | |
} | |
// * In MZ TouchInput always have X,Y | |
cursorInButton() { | |
return this.touchInButton(); | |
} | |
xyInButton(x, y) { | |
var inRect, rect, rx, ry; | |
rx = KDCore.SDK.toGlobalCoord(this, 'x'); | |
ry = KDCore.SDK.toGlobalCoord(this, 'y'); | |
rect = new PIXI.Rectangle(rx, ry, this._realWidth(), this._realHeight()); | |
inRect = rect.contains(x, y); | |
if (inRect === true && this._checkAlpha === true) { | |
return this._checkAlphaPixel(x - rx, y - ry); | |
} else { | |
return inRect; | |
} | |
} | |
_realWidth() { | |
if (this._hasImage()) { | |
return this._mainImage().width; | |
} else { | |
return this.width; | |
} | |
} | |
_hasImage() { | |
return this._mainImage() != null; | |
} | |
_mainImage() { | |
return this._images[0]; | |
} | |
_realHeight() { | |
if (this._hasImage()) { | |
return this._mainImage().height; | |
} else { | |
return this.height; | |
} | |
} | |
_checkAlphaPixel(x, y) { | |
var pixel; | |
pixel = this._hasImage() ? this._mainImage().bitmap.getAlphaPixel(x, y) : this.bitmap.getAlphaPixel(x, y); | |
return pixel >= 200; | |
} | |
_onMouseEnter() { | |
if (this._mouseIn === true) { | |
return; | |
} | |
if (!this.isDisabled()) { | |
this.applyCoverState(); | |
} | |
this._showText(); | |
if (this.getInfoData() != null) { | |
return this._startComplexTimer(); | |
} | |
} | |
_onMouseLeave() { | |
if (this._mouseIn === false) { | |
return; | |
} | |
if (!this.isDisabled()) { | |
this.applyNormalState(); | |
} | |
this._hideText(); | |
return this._stopComplexTimer(); | |
} | |
_showText() { | |
if (this._textSprite == null) { | |
return; | |
} | |
this._updateTextPosition(); | |
return this._textSprite.visible = true; | |
} | |
_hideText() { | |
if (this._textSprite == null) { | |
return; | |
} | |
return this._textSprite.visible = false; | |
} | |
_startComplexTimer() { | |
this._stopComplexTimer(); | |
return this._cTimer = setTimeout((() => { | |
if (this._mouseIn === true) { | |
return this._isNeedShowText = true; | |
} | |
}), 1000); | |
} | |
_stopComplexTimer() { | |
if (this._cTimer != null) { | |
clearTimeout(this._cTimer); | |
} | |
return this._isNeedShowText = false; | |
} | |
updateMouseClick() { | |
if (!this.isActive()) { | |
this._unTouch(); | |
return; | |
} | |
if (this.isDisabled()) { | |
return; | |
} | |
if (TouchInput.isTriggered() && this.touchInButton()) { | |
this._touching = true; | |
this.applyClickedState(); | |
} | |
if (this._touching === true) { | |
if (TouchInput.isReleased() || !this.touchInButton()) { | |
this._unTouch(); | |
if (TouchInput.isReleased()) { | |
return this.callClickHandler(); | |
} | |
} | |
} | |
} | |
_unTouch() { | |
this._touching = false; | |
if (this.touchInButton()) { | |
return this.applyCoverState(); | |
} else { | |
return this.applyNormalState(); | |
} | |
} | |
touchInButton() { | |
return this.xyInButton(TouchInput.x, TouchInput.y); | |
} | |
callClickHandler() { | |
if (this._clickHandlers.length > 0) { | |
return this._clickHandlers.forEach(function(method) { | |
return method(); | |
}); | |
} | |
} | |
updatePosition() { | |
var p; | |
if (!this._localMode) { | |
return; | |
} | |
p = new KDCore.Point(this._realX, this._realY); | |
return this.move(p.screenX(), p.screenY()); | |
} | |
updateConditionForVisible() { | |
var result; | |
if (this._condition == null) { | |
return; | |
} | |
if (this._manualHided === true) { | |
return; | |
} | |
try { | |
result = this._condition(); | |
return this.visible = !result; | |
} catch (error1) { | |
console.warn('wrong condition in button'); | |
return this.visible = true; | |
} | |
} | |
updateConditionForEnabling() { | |
if (!this._condition2) { | |
return; | |
} | |
if (this._manualDisabled === true) { | |
return; | |
} | |
try { | |
this._disabled = this._condition2(); | |
return this.refreshEnDisState(); | |
} catch (error1) { | |
console.warn('wrong condition in button for enable state'); | |
return this.disable(); | |
} | |
} | |
setButtonImages(img1, img2, img3, img4) { | |
if (this._images != null) { | |
this._images.forEach(function(img) { | |
if (img != null) { | |
return img.parent.removeChild(img); | |
} | |
}); | |
} | |
this._images = [new Sprite(img1), img2 != null ? new Sprite(img2) : void 0, img3 != null ? new Sprite(img3) : void 0, img4 != null ? new Sprite(img4) : void 0]; | |
this._images.forEach((img) => { | |
if (img != null) { | |
return this.addChild(img); | |
} | |
}); | |
return this.applyNormalState(); | |
} | |
applyNormalState() { | |
var ref; | |
this.refreshImages(); | |
return (ref = this._images[0]) != null ? ref.visible = true : void 0; | |
} | |
refreshImages() { | |
return this._images.forEach(function(img) { | |
return img != null ? img.visible = false : void 0; | |
}); | |
} | |
applyCoverState() { | |
this.refreshImages(); | |
if (this._images[1] != null) { | |
return this._images[1].visible = true; | |
} else { | |
return this.applyNormalState(); | |
} | |
} | |
applyClickedState() { | |
this.refreshImages(); | |
if (this._images[2] != null) { | |
return this._images[2].visible = true; | |
} else { | |
return this.applyNormalState(); | |
} | |
} | |
_createText(text, size) { | |
var h, w; | |
if (this._textSprite) { | |
this.removeChild(this._textSprite); | |
} | |
w = Math.round(((size / 10) + 1) * 5 * text.length); | |
h = size + 4; | |
this._textSprite = new Sprite(new Bitmap(w, h)); | |
this._textSprite.bitmap.fontSize = size; | |
this._textSprite.bitmap.drawText(text, 0, h / 2, w, 1, 'center'); | |
this._textSprite.visible = false; | |
return this.addChild(this._textSprite); | |
} | |
_updateTextPosition() { | |
var nx, ny; | |
if (!this._textSprite) { | |
return; | |
} | |
nx = this._realWidth() / 2 - this._textSprite.width / 2; | |
if (this._textPosition === 0) { | |
ny = -this._textSprite.height; | |
} else { | |
ny = this._realHeight() + this._textSprite.height / 2; | |
} | |
return this._textSprite.move(nx, ny); | |
} | |
applyDisableState() { | |
var ref; | |
this.refreshImages(); | |
return (ref = this._images[3]) != null ? ref.visible = true : void 0; | |
} | |
refreshEnDisState() { | |
if (this.isDisabled()) { | |
this.applyDisableState(); | |
return this._hideText(); | |
} else { | |
if (this._mouseIn === false) { | |
return this.applyNormalState(); | |
} | |
} | |
} | |
//else | |
// do @applyCoverState | |
updateComplexTextVisible() {} | |
applyScale(mod) { | |
var img, len, q, ref; | |
ref = this._images; | |
for (q = 0, len = ref.length; q < len; q++) { | |
img = ref[q]; | |
if (img != null) { | |
img.scale.x = mod; | |
img.scale.y = mod; | |
} | |
} | |
} | |
static FromSet(imgName, sourceFolder = null) { | |
var button, getterFunc, img0, img1; | |
getterFunc = function(filename) { | |
return ImageManager.loadPicture(filename); | |
}; | |
if (sourceFolder != null) { | |
getterFunc = function(filename) { | |
return ImageManager.loadBitmap("img/" + sourceFolder + "/", filename); | |
}; | |
} | |
img0 = getterFunc(imgName + "_00"); | |
img1 = getterFunc(imgName + "_01"); | |
button = new KDCore.Button(); | |
button.setButtonImages(img0, img1, img0, img0); | |
return button; | |
} | |
static FromSetFull(imgName, sourceFolder = null) { | |
var button, getterFunc, img0, img1, img2, img3; | |
getterFunc = function(filename) { | |
return ImageManager.loadPicture(filename); | |
}; | |
if (sourceFolder != null) { | |
getterFunc = function(filename) { | |
return ImageManager.loadBitmap("img/" + sourceFolder + "/", filename); | |
}; | |
} | |
img0 = getterFunc(imgName + "_00"); | |
img1 = getterFunc(imgName + "_01"); | |
img2 = getterFunc(imgName + "_02"); | |
img3 = getterFunc(imgName + "_03"); | |
button = new KDCore.Button(); | |
button.setButtonImages(img0, img1, img2, img3); | |
return button; | |
} | |
}; | |
KDCore.Sprite = (function(superClass) { | |
// * Sprite | |
//------------------------------------------------------------------------------ | |
//@[AUTO EXTEND] | |
class Sprite extends superClass { | |
constructor() { | |
super(...arguments); | |
} | |
b() { | |
return this.bitmap; | |
} | |
clear() { | |
return this.bitmap.clear(); | |
} | |
add(child) { | |
return this.addChild(child); | |
} | |
bNew(w, h) { | |
if (h == null) { | |
h = w; | |
} | |
return this.bitmap = new Bitmap(w, h); | |
} | |
bImg(filename, sourceFolder) { | |
var getterFunc; | |
getterFunc = function(filename) { | |
return ImageManager.loadPicture(filename); | |
}; | |
if (sourceFolder != null) { | |
getterFunc = function(filename) { | |
return ImageManager.loadBitmap("img/" + sourceFolder + "/", filename); | |
}; | |
} | |
return this.bitmap = getterFunc(filename); | |
} | |
onReady(method) { | |
if (method != null) { | |
return this.bitmap.addLoadListener(method); | |
} | |
} | |
drawText() { | |
return this.bitmap.drawText(...arguments); | |
} | |
drawTextFull(text, position = "center") { | |
if (this.textSettingsPosition != null) { | |
position = this.textSettingsPosition; | |
} | |
return this.bitmap.drawTextFull(text, position); | |
} | |
//?DEPRECATED | |
drawTextWithSettings(text) { | |
this.clear(); | |
this.drawTextFull(text, this.textSettingsPosition); | |
} | |
//? x, y, icon, size | |
drawIcon() { | |
return this.bitmap.drawIcon(...arguments); | |
} | |
moveByJson(settings) { | |
var pos; | |
pos = KDCore.Utils.getPositionPointFromJSON(settings); | |
return this.move(pos.x, pos.y); | |
} | |
applyTextSettingsByJson(sprite, settings) { | |
this.applyTextSettingsByExtraSettings(sprite, settings.text); | |
} | |
applyTextSettingsByExtraSettings(sprite, s) { | |
sprite.move(s.marginX, s.marginY); | |
sprite.b().fontSize = s.fontSize; | |
sprite.b().textColor = KDCore.Color.FromHex(s.textColor).CSS; | |
sprite.b().outlineWidth = s.outlineWidth; | |
if (s.outlineColor != null) { | |
sprite.b().outlineColor = KDCore.Color.FromHex(s.outlineColor).CSS; | |
} | |
if (s.fontFace != null) { | |
sprite.b().fontFace = s.fontFace; | |
} | |
sprite.b().fontItalic = s.fontItalic; | |
sprite.visible = s.visible; | |
} | |
isReady() { | |
var q, ref; | |
if (this.bitmap != null) { | |
if (!this.bitmap.isReady()) { | |
return false; | |
} | |
} | |
for (i = q = 0, ref = this.children.length; (0 <= ref ? q < ref : q > ref); i = 0 <= ref ? ++q : --q) { | |
if (!this.children[i].bitmap.isReady()) { | |
return false; | |
} | |
} | |
return true; | |
} | |
inPosition(point) { | |
return this.isContainsPoint(point); | |
} | |
isUnderMouse() { | |
return this.inPosition(TouchInput); | |
} | |
// * Из параметров плагина | |
applyFontParam(font) { | |
var b; | |
if (font == null) { | |
return; | |
} | |
b = this.b(); | |
if (font.size != null) { | |
b.fontSize = font.size; | |
} | |
if (!String.isNullOrEmpty(font.face)) { | |
b.fontFace = font.face; | |
} | |
if (font.italic != null) { | |
b.fontItalic = font.italic; | |
} | |
} | |
applyOutlineParam(outline) { | |
var b; | |
if (outline == null) { | |
return; | |
} | |
b = this.b(); | |
if (outline.width != null) { | |
b.outlineWidth = outline.width; | |
} | |
if (!String.isNullOrEmpty(outline.color)) { | |
b.outlineColor = outline.color; | |
} | |
} | |
static FromImg(filename, sourceFolder) { | |
var s; | |
s = new KDCore.Sprite(); | |
s.bImg(filename, sourceFolder); | |
return s; | |
} | |
static FromBitmap(w, h) { | |
var s; | |
s = new KDCore.Sprite(); | |
s.bNew(w, h); | |
return s; | |
} | |
static FromTextSettings(settings) { | |
var s; | |
s = KDCore.Sprite.FromBitmap(settings.textBoxWidth, settings.textBoxHeight); | |
s.applyTextSettingsByExtraSettings(s, settings); | |
s.textSettingsPosition = settings.position; | |
return s; | |
} | |
// * Загрузчик из параметров плагина (безопасный) | |
static FromParams(pluginParams) { | |
var e, margins, s, size; | |
try { | |
size = pluginParams.size; | |
s = KDCore.Sprite.FromBitmap(size.w, size.h); | |
s.textSettingsPosition = pluginParams.alignment; | |
margins = pluginParams.margins; | |
if (margins != null) { | |
s.move(margins.x, margins.y); | |
} | |
s.applyFontParam(pluginParams.font); | |
s.applyOutlineParam(pluginParams.outline); | |
if (!String.isNullOrEmpty(pluginParams.textColor)) { | |
s.b().textColor = pluginParams.textColor; | |
} | |
if (pluginParams.visible != null) { | |
s.visible = pluginParams.visible; | |
} | |
return s; | |
} catch (error1) { | |
e = error1; | |
console.warn('Something wrong with Text Settings!', e); | |
return KDCore.Sprite.FromBitmap(60, 30); | |
} | |
} | |
}; | |
return Sprite; | |
}).call(this, Sprite); | |
// * Button M | |
//------------------------------------------------------------------------------ | |
//@[AUTO EXTEND] | |
// * Button Mini - упрощённый класс Sprite_XButton (KDCore.Button) | |
// * Принимает название файла изображения кнопки без _00 | |
// * Названия изображения должны быть в стандартном формате _00, _01, [_03] | |
// * _02 - не используются в этом классе | |
// * Класс использует глобальную временную переменную для определения находится ли мышь в зоне кнопки | |
// * Если isFull - true, значит нужен _03 | |
KDCore.ButtonM = class ButtonM extends KDCore.Sprite { | |
constructor(filename, isFull = false, sourceFolder = null) { | |
super(); | |
this._bitmaps = []; | |
this._disabled = false; | |
this._isTriggered = false; | |
// * Когда произошло нажатие на кнопку | |
this._handler = null; | |
this._isCanBeClicked = true; | |
this._isManualHoverMode = false; | |
this._isManualSelected = false; | |
this._loadBitmaps(filename, isFull, sourceFolder); | |
this._setImageState(0); | |
this._createThread(); | |
} | |
setManualHover() { | |
return this._isManualHoverMode = true; | |
} | |
disableManualHover() { | |
return this._isManualHoverMode = false; | |
} | |
setManualSelected(_isManualSelected) { | |
this._isManualSelected = _isManualSelected; | |
} | |
enableClick() { | |
return this._isCanBeClicked = true; | |
} | |
disableClick() { | |
return this._isCanBeClicked = false; | |
} | |
desaturate() { | |
this.filters = [new PIXI.filters.ColorMatrixFilter()]; | |
this.filters[0].desaturate(); | |
} | |
isMouseIn() { | |
if (this._isManualHoverMode === true) { | |
return this._isManualSelected; | |
} else { | |
return this.inPosition(TouchInput); | |
} | |
} | |
isActive() { | |
if (this._isCanBeClicked === false) { | |
return false; | |
} | |
if (this.parent != null) { | |
return this.parent.visible === true && this.visible === true; | |
} else { | |
return this.visible === true; | |
} | |
} | |
isDisabled() { | |
return this._disabled === true; | |
} | |
addClickHandler(_handler) { | |
this._handler = _handler; | |
} | |
clearClickHandler() { | |
return this._handler = null; | |
} | |
// * Воспроизводит визуальный эффект нажатия | |
simulateClick() { | |
if (!this.isActive()) { | |
return; | |
} | |
if (this.isDisabled()) { | |
return; | |
} | |
if (this.isMouseIn()) { | |
return; | |
} | |
this._startSimulation(); | |
} | |
isEnabled() { | |
return !this.isDisabled(); | |
} | |
refreshState(isEnable = true) { | |
if (isEnable === true) { | |
if (this.isDisabled()) { | |
this.enable(); | |
} | |
} else { | |
if (this.isEnabled()) { | |
this.disable(); | |
} | |
} | |
} | |
disable() { | |
this._disabled = true; | |
return this._setImageState(2); | |
} | |
enable() { | |
this._disabled = false; | |
return this._setImageState(0); | |
} | |
click() { | |
if (this._handler != null) { | |
return this._handler(); | |
} | |
} | |
update() { | |
super.update(); | |
return this._updateMain(); | |
} | |
}; | |
(function() { | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ ButtonM Implementation | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
var _, alias_SM_isAnyButtonPressed, alias_SM_onMapLoaded; | |
//@[DEFINES] | |
_ = KDCore.ButtonM.prototype; | |
_._loadBitmaps = function(filename, isFull = false, sourceFolder = null) { | |
var getterFunc; | |
getterFunc = this._getGetter(sourceFolder); | |
this._bitmaps.push(getterFunc(filename + '_00')); | |
this._bitmaps.push(getterFunc(filename + '_01')); | |
if (isFull) { | |
this._bitmaps.push(getterFunc(filename + '_03')); | |
} | |
}; | |
_._getGetter = function(sourceFolder = null) { | |
var getterFunc; | |
getterFunc = function(filename) { | |
return ImageManager.loadPicture(filename); | |
}; | |
if (sourceFolder !== null) { | |
getterFunc = function(filename) { | |
return ImageManager.loadBitmap('img/' + sourceFolder + '/', filename); | |
}; | |
} | |
return getterFunc; | |
}; | |
_._setImageState = function(index = 0) { | |
if (this._bitmaps[index] == null) { | |
index = 0; | |
} | |
this.bitmap = this._bitmaps[index]; | |
this._lastState = index; | |
}; | |
_._createThread = function() { | |
this.hoverThread = new KDCore.TimedUpdate(3, this._updateHover.bind(this)); | |
this.hoverThread.applyTimeRange(-1, 1); | |
this.hoverThread.call(); | |
}; | |
//?[DYNAMIC] | |
_._updateMain = function() { | |
this._updateMouseLogic(); | |
if (!this.isActive()) { | |
if (($gameTemp.kdButtonUnderMouse != null) && $gameTemp.kdButtonUnderMouse === this) { | |
return $gameTemp.kdButtonUnderMouse = null; | |
} | |
} | |
}; | |
_._updateMouseLogic = function() { | |
this.hoverThread.update(); | |
return this._updateMouseClick(); | |
}; | |
_._updateHover = function() { | |
if (!this.isActive()) { | |
return; | |
} | |
// * чтобы эффект нажатия не прекратить | |
if (this._isTriggered === true) { | |
return; | |
} | |
if (this.isMouseIn()) { | |
if (this._lastState !== 1) { | |
if (!this.isDisabled()) { | |
this._setImageState(1); | |
} | |
$gameTemp.kdButtonUnderMouse = this; | |
} | |
} else { | |
if (this._lastState !== 0) { | |
if (!this.isDisabled()) { | |
this._setImageState(0); | |
} | |
if ($gameTemp.kdButtonUnderMouse === this) { | |
$gameTemp.kdButtonUnderMouse = null; | |
} | |
} else if ($gameTemp.kdButtonUnderMouse === this) { | |
$gameTemp.kdButtonUnderMouse = null; | |
} | |
} | |
}; | |
_._updateMouseClick = function() { | |
if (!this.isActive()) { | |
return; | |
} | |
if (this.isDisabled()) { | |
return; | |
} | |
if (TouchInput.isTriggered() && this.isMouseIn()) { | |
this._isTriggered = true; | |
this._setImageState(0); | |
} | |
if (this._isTriggered === true) { | |
if (TouchInput.isReleased()) { | |
this._isTriggered = false; | |
if (this.isMouseIn()) { | |
this.click(); | |
} | |
} | |
} | |
}; | |
_._startSimulation = function() { | |
this._setImageState(1); | |
this._simulateThread = new KDCore.TimedUpdate(10, () => { | |
return this._setImageState(0); | |
}); | |
this._simulateThread.once(); | |
return this._updateMain = this._updateMouseClickSimulated; | |
}; | |
_._updateMouseClickSimulated = function() { | |
this._simulateThread.update(); | |
if (!this._simulateThread.isAlive()) { | |
this._simulateThread = null; | |
this._updateMain = this._updateMouseLogic; | |
} | |
}; | |
// * Теперь при нажатии на любую кнопку, игрок не будет ходить по карте | |
//@[ALIAS] | |
alias_SM_isAnyButtonPressed = Scene_Map.prototype.isAnyButtonPressed; | |
Scene_Map.prototype.isAnyButtonPressed = function() { | |
if ($gameTemp.kdButtonUnderMouse != null) { | |
return true; | |
} else { | |
return alias_SM_isAnyButtonPressed.call(this); | |
} | |
}; | |
//@[ALIAS] | |
alias_SM_onMapLoaded = Scene_Map.prototype.onMapLoaded; | |
Scene_Map.prototype.onMapLoaded = function() { | |
$gameTemp.kdButtonUnderMouse = null; | |
return alias_SM_onMapLoaded.call(this); | |
}; | |
})(); | |
// ■ END ButtonM Implementation | |
//--------------------------------------------------------------------------- | |
// * Button Mini User - класс с определением файла каждого состояния отдельно | |
// * Принимает теже аргументы, только заместо имени файла, три изображения (имени) | |
// ? states = { main, hover, disabled } | |
KDCore.ButtonMU = class ButtonMU extends KDCore.ButtonM { | |
constructor() { | |
super(...arguments); | |
} | |
//$[OVER] | |
_loadBitmaps(states, isFull = true, sourceFolder = null) { | |
var getterFunc; | |
getterFunc = this._getGetter(sourceFolder); | |
this._bitmaps.push(getterFunc(states.main)); | |
this._bitmaps.push(getterFunc(states.hover)); | |
// * Optional 03 | |
if (String.any(states.disabled)) { | |
this._bitmaps.push(getterFunc(states.disabled)); | |
} | |
} | |
}; | |
//@[EXTENSION TO GLOBAL] | |
//------------------------------------------------------------------------------ | |
KDCore.SDK = SDK; | |
KDCore.Color = Color; | |
KDCore.DevLog = DevLog; | |
KDCore.Point = Point; | |
KDCore.BitmapSrc = BitmapSrc; | |
//? SOME KDCORE METHODS | |
//-------------------------------------------------------------------------------- | |
KDCore.isMV = function() { | |
return Utils.RPGMAKER_NAME.contains("MV"); | |
}; | |
KDCore.isMZ = function() { | |
return !KDCore.isMV(); | |
}; | |
KDCore.warning = function(msg, error) { | |
if (msg != null) { | |
console.warn(msg); | |
} | |
if (error != null) { | |
console.warn(error); | |
} | |
}; | |
(function() { //-------------------------------------------------------------------------------- | |
// Word Wrapping ================================================================= | |
//-------------------------------------------------------------------------------- | |
//?NEW | |
Window_Base.prototype.drawTextExWithWordWrap = function(text, x, y, width, maxLines) { | |
var maxWidth, wrappedText; | |
maxWidth = this.contentsWidth(); | |
wrappedText = Window_Message.prototype.pWordWrap.call(this, text, width || maxWidth, maxLines); | |
this.drawTextEx(wrappedText, x, y); | |
}; | |
//?NEW | |
Window_Message.prototype.pWordWrap = function(text, maxWidth, maxLines) { | |
var j, line, lines, newLines, q, ref, ref1, result, spaceLeft, spaceWidth, u, wordWidth, wordWidthWithSpace, words; | |
lines = text.split('\n'); | |
maxWidth = maxWidth; | |
spaceWidth = this.contents.measureTextWidth(' '); | |
result = ''; | |
newLines = 1; | |
for (i = q = 0, ref = lines.length; (0 <= ref ? q < ref : q > ref); i = 0 <= ref ? ++q : --q) { | |
spaceLeft = maxWidth; | |
line = lines[i]; | |
words = line.split(' '); | |
for (j = u = 0, ref1 = words.length; (0 <= ref1 ? u < ref1 : u > ref1); j = 0 <= ref1 ? ++u : --u) { | |
wordWidth = this.contents.measureTextWidth(words[j]); | |
wordWidthWithSpace = wordWidth + spaceWidth; | |
if (j === 0 || wordWidthWithSpace > spaceLeft) { | |
if (j > 0) { | |
if (maxLines === newLines) { | |
return result; | |
} | |
result += '\n'; | |
newLines++; | |
} | |
result += words[j]; | |
spaceLeft = maxWidth - wordWidth; | |
if (j === 0 && line.match(/\\n\w*\s*<\s*\\n\[\w*\s*\]\s*>*/gi)) { | |
spaceLeft += 200; | |
} | |
} else { | |
spaceLeft -= wordWidthWithSpace; | |
result += ' ' + words[j]; | |
} | |
} | |
if (i < lines.length - 1) { | |
result += '\n'; | |
} | |
} | |
return result; | |
}; | |
})(); | |
//-------------------------------------------------------------------------------- | |
// MV TouchInput Extension ======================================================= | |
//-------------------------------------------------------------------------------- | |
// * Для совместимости MV и MZ | |
//TouchInput.getMousePosition = -> new KDCore.Point(TouchInput.x, TouchInput.y) | |
TouchInput.toMapPoint = function() { | |
return this.toPoint().convertToMap(); | |
}; | |
//?SMouse better alternative | |
(function() { | |
var alias_SM_processMapTouch, alias_TIOMM; | |
if (KDCore.isMZ()) { | |
return; | |
} | |
// * Для ButtonM | |
//@[ALIAS] | |
alias_SM_processMapTouch = Scene_Map.prototype.processMapTouch; | |
Scene_Map.prototype.processMapTouch = function() { | |
if ($gameTemp.kdButtonUnderMouse != null) { | |
} else { | |
return alias_SM_processMapTouch.call(this); | |
} | |
}; | |
//@[ALIAS] | |
alias_TIOMM = TouchInput._onMouseMove; | |
TouchInput._onMouseMove = function(event) { | |
var x, y; | |
alias_TIOMM.call(this, event); | |
x = Graphics.pageToCanvasX(event.pageX); | |
y = Graphics.pageToCanvasY(event.pageY); | |
if (Graphics.isInsideCanvas(x, y)) { | |
return this._onHover(x, y); | |
} | |
}; | |
//?NEW, from MZ | |
TouchInput._onHover = function(_x, _y) { | |
this._x = _x; | |
this._y = _y; | |
}; | |
})(); | |
(function() { // * VirtualInput для RPG Maker MV | |
//$[OVER] | |
//TouchInput.getMousePosition = -> | |
// new KDCore.Point(TouchInput._x, TouchInput._y) | |
var ALIAS__clear, ALIAS__update, _; | |
if (KDCore.isMZ()) { | |
return; | |
} | |
//@[DEFINES] | |
_ = Input; | |
//@[ALIAS] | |
ALIAS__clear = _.clear; | |
_.clear = function() { | |
ALIAS__clear.call(this); | |
return this._virtualButton = null; | |
}; | |
//@[ALIAS] | |
ALIAS__update = _.update; | |
_.update = function() { | |
ALIAS__update.call(this); | |
if (this._virtualButton == null) { | |
return; | |
} | |
this._latestButton = this._virtualButton; | |
this._pressedTime = 0; | |
return this._virtualButton = null; | |
}; | |
_.virtualClick = function(buttonName) { | |
return this._virtualButton = buttonName; | |
}; | |
})(); | |
(function() { // * Right mouse pressed | |
// * Определение когда правая (вторая) кнопка мыши зажата и удерживается | |
var ALIAS___onMouseUp, ALIAS___onRightButtonDown, ALIAS__clear, ALIAS__update, _; | |
//@[DEFINES] | |
_ = TouchInput; | |
//@[ALIAS] | |
ALIAS__clear = _.clear; | |
_.clear = function() { | |
ALIAS__clear.call(this); | |
this._kdMousePressed2 = false; | |
this._kdPressedTime2 = 0; | |
}; | |
//@[ALIAS] | |
ALIAS___onRightButtonDown = _._onRightButtonDown; | |
_._onRightButtonDown = function(event) { | |
var check; | |
ALIAS___onRightButtonDown.call(this, event); | |
// * Это значит что ALIAS метод прошёл (верные X и Y в Canvas) | |
if (KDCore.isMZ()) { | |
check = this._newState.cancelled === true; | |
} else { | |
check = this._events.cancelled === true; | |
} | |
if (check === true) { | |
this._kdMousePressed2 = true; | |
this._kdPressedTime2 = 0; | |
} | |
}; | |
//@[ALIAS] | |
ALIAS___onMouseUp = _._onMouseUp; | |
_._onMouseUp = function(event) { | |
ALIAS___onMouseUp.call(this, event); | |
if (event.button === 2) { | |
this._kdMousePressed2 = false; | |
} | |
}; | |
//@[ALIAS] | |
ALIAS__update = _.update; | |
_.update = function() { | |
ALIAS__update.call(this); | |
if (this.kdIsPressed2()) { | |
return this._kdPressedTime2++; | |
} | |
}; | |
//?[NEW] | |
_.kdIsPressed2 = function() { | |
return this._kdMousePressed2 === true; | |
}; | |
})(); | |
(function() { //-------------------------------------------------------------------------------- | |
// MV MZ Methods Extension ======================================================= | |
//-------------------------------------------------------------------------------- | |
if (KDCore.isMZ()) { | |
return; | |
} | |
(function() { //╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ Window_Base.coffee | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
var ALIAS__initialize, _; | |
//@[DEFINES] | |
_ = Window_Base.prototype; | |
// * Чтоб можно было Rectangle принимать в конструктор | |
//@[ALIAS] | |
ALIAS__initialize = _.initialize; | |
_.initialize = function(x, y, w, h) { | |
if (x instanceof PIXI.Rectangle) { | |
return ALIAS__initialize.call(this, x.x, x.y, x.width, x.height); | |
} else { | |
return ALIAS__initialize.call(this, ...arguments); | |
} | |
}; | |
})(); | |
(function() { // ■ END Window_Base.coffee | |
//--------------------------------------------------------------------------- | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ Spriteset_Map.coffee | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
var _; | |
//@[DEFINES] | |
_ = Spriteset_Map.prototype; | |
_.findTargetSprite = function(target) { | |
return this._characterSprites.find(function(sprite) { | |
return sprite.checkCharacter(target); | |
}); | |
}; | |
})(); | |
(function() { // ■ END Spriteset_Map.coffee | |
//--------------------------------------------------------------------------- | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ Sprite_Character.coffee | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
var _; | |
//@[DEFINES] | |
_ = Sprite_Character.prototype; | |
_.checkCharacter = function(character) { | |
return this._character === character; | |
}; | |
})(); | |
})(); | |
})(); | |
} | |
// ■ END KDCore.coffee | |
//--------------------------------------------------------------------------- | |
//? КОНЕЦ KDCORE | |
// ■ END Sprite_Character.coffee | |
//--------------------------------------------------------------------------- | |
// Generated by CoffeeScript 2.5.1 | |
//? Взято из Alpha CORE | |
(function() {})(); | |
(function() { // * Класс который может плавно изменять какой-либо параметр | |
// * Работает в стиле chain методов | |
// * ------------------ ПРИМЕР ---------------------------------- | |
// * Меняем прозрачность 4 раза, туда-сюда, затем выводим done в консоль | |
//@changer = new Changer(someSprite) | |
//@changer.change('opacity').from(255) | |
// .to(0).step(5).speed(1).delay(30).repeat(4).reverse() | |
// .start().done(() -> console.log('done')) | |
//@changer.update() | |
// * ------------------------------------------------------------- | |
var Changer; | |
Changer = class Changer { | |
constructor(obj) { | |
this.obj = obj; | |
// * Количество кадров, в которые будет обновление | |
this._field = null; // * название поля | |
this._speed = 1; // * frames | |
this._step = 1; // * шаг изменения значения | |
this._from = 0; // * Начальное значение | |
this._to = 0; // * Конечное значение | |
this._thread = null; | |
this._orienation = true; // * Направление + или - step (true = +) | |
this._delay = 0; // * Задержка старта | |
this._changer = null; // * Ссылка на следующий changer | |
this._isRepeat = false; // * Надо ли поторить себя снова | |
this._onDoneMethod = null; // * Метод будет выполнен в конце (при завершении) | |
this._isPrepared = false; // * Элемента был подготовлен (установлено значение from) | |
} | |
start() { | |
if (this._field == null) { | |
return; | |
} | |
if (this._from === this._to) { | |
return; | |
} | |
if (this._delay > 0) { | |
this._delayThread = new KDCore.TimedUpdate(this._delay, this._startThread.bind(this)); | |
this._delayThread.once(); | |
} else { | |
this._startThread(); | |
} | |
return this; | |
} | |
isStarted() { | |
return (this._thread != null) || (this._delayThread != null); | |
} | |
from(_from) { | |
this._from = _from; | |
return this; | |
} | |
to(_to) { | |
this._to = _to; | |
return this; | |
} | |
step(_step) { | |
this._step = _step; | |
return this; | |
} | |
speed(_speed) { | |
this._speed = _speed; | |
return this; | |
} | |
change(_field) { | |
this._field = _field; | |
return this; | |
} | |
// * Снова повторить (не совместим с then) | |
// * Если ничего не указать, или <= 0 -> то бескончно | |
repeat(_repeatCount = 0) { | |
this._repeatCount = _repeatCount; | |
if (this._repeatCount <= 0) { | |
this._repeatCount = null; | |
} | |
this._isRepeat = true; | |
this._changer = null; | |
return this; | |
} | |
// * Снова повторить, но поменять местами to и from (работает только с repeat >= 2) | |
reverse() { | |
this._isReverse = true; | |
return this; | |
} | |
isDone() { | |
if (!this._isPrepared) { | |
// * Чтобы не было выхода пока ждёт Delay | |
return false; | |
} | |
// * Если от 255 до 0 (например) | |
if (this._orienation === false) { | |
// * То может быть меньше нуля (т.к. @step динамический) | |
return this.value() <= this._to; | |
} else { | |
return this.value() >= this._to; | |
} | |
} | |
value() { | |
return this.obj[this._field]; | |
} | |
stop() { | |
this._thread = null; | |
this._delayThread = null; | |
if (this._changer == null) { | |
// * Если есть связанный Changer, то не выполняем метод завршения | |
return this._callDoneMethod(); | |
} | |
} | |
// * При ожидании, значения устанавливаются не сразу | |
delay(_delay) { | |
this._delay = _delay; | |
return this; | |
} | |
// * Выполнить другой Changer после этого | |
// * Не совместим с Repeat | |
// * НЕЛЬЗЯ зацикливать, не будет работать | |
// * Соединённый не надо обновлять вне, он обновляется в этом | |
then(_changer) { | |
this._changer = _changer; | |
this._isRepeat = false; | |
return this; | |
} | |
// * Этот метод будт выполнене в конце | |
done(_onDoneMethod) { | |
this._onDoneMethod = _onDoneMethod; | |
return this; | |
} | |
// * Шаг можно выполнить и в ручную | |
makeStep() { | |
if (!this.isStarted()) { | |
this._prepare(); | |
} | |
this._makeStep(); | |
return this; | |
} | |
update() { | |
var ref; | |
if (this.isStarted()) { | |
if (this._delay > 0) { | |
if ((ref = this._delayThread) != null) { | |
ref.update(); | |
} | |
} | |
if (this._thread != null) { | |
this._updateMainThread(); | |
} | |
} else { | |
// * Если хоть раз был запущен | |
if (this._isBeenStarted === true) { | |
if (this._changer != null) { | |
this._updateChainedChanger(); | |
} | |
} | |
} | |
} | |
}; | |
PKD_FOG.Changer = Changer; | |
})(); | |
(function() { //╒═════════════════════════════════════════════════════════════════════════╛ | |
// ■ Changer.coffee | |
//╒═════════════════════════════════════════════════════════════════════════╛ | |
//--------------------------------------------------------------------------- | |
var _; | |
//@[DEFINES] | |
_ = PKD_FOG.Changer.prototype; | |
_._prepare = function() { | |
if (this._field == null) { | |
return; | |
} | |
this._orienation = this._from < this._to; | |
if (!this._orienation) { | |
this._step *= -1; | |
} | |
// * Устанавливаем начальное значение | |
this.obj[this._field] = this._from; | |
this._isPrepared = true; | |
}; | |
_._makeStep = function() { | |
var value; | |
if (this.isDone()) { | |
return; | |
} | |
value = this.value(); | |
value += this._step; | |
this.obj[this._field] = value; | |
}; | |
_._startThread = function() { | |
this._prepare(); | |
if (this.isDone()) { | |
return; | |
} | |
this._thread = new KDCore.TimedUpdate(this._speed, this._makeStep.bind(this)); | |
return this._isBeenStarted = true; | |
}; | |
_._updateChainedChanger = function() { | |
if (this._changer.isStarted()) { | |
this._changer.update(); | |
if (this._changer.isDone()) { | |
this._callDoneMethod(); | |
this._changer.stop(); | |
return this._changer = null; | |
} | |
} else { | |
return this._changer.start(); | |
} | |
}; | |
_._restart = function() { | |
if (!this._isCanRepeatMore()) { | |
return; | |
} | |
if (this._repeatCount == null) { | |
// * Если указано! число повторений, то onDone метод не вызываем | |
this._callDoneMethod(); | |
} | |
if (this._isReverse === true) { | |
this._swapFromTo(); | |
} | |
this._prepare(); | |
return this.start(); | |
}; | |
_._swapFromTo = function() { | |
var t; | |
t = this._from; | |
this._from = this._to; | |
this._to = t; | |
// * Инвентируем число step | |
this._step *= -1; | |
}; | |
_._callDoneMethod = function() { | |
if (this._onDoneMethod != null) { | |
return this._onDoneMethod(); | |
} | |
}; | |
_._isCanRepeatMore = function() { | |
if (this._repeatCount == null) { | |
return true; | |
} | |
this._repeatCount--; | |
if (this._repeatCount <= 0) { | |
this.stop(); | |
return false; | |
} | |
return true; | |
}; | |
_._updateMainThread = function() { | |
this._thread.update(); | |