/* * License: Creative Commons 4.0 Attribution, Share Alike, Commercial * * Copyright (c) 2022 Vladimir Skrypnikov (Pheonix KageDesu) * * */ /*: * @plugindesc (v.1.4)[PRO] Allow you spawn Events during game with placement select * @author Pheonix KageDesu * @target MZ MV * @url https://kdworkshop.net/plugins/pocket-events/ * * * @help * * This plugin allows player placing events from a specified 'template' map * with placement selecting for them in the current map. * This template map is designated with the "Templates Map" plugin setting. * * For create rules and setup placement events, see plugin parameter * 'Placement Items' * * ======================================================================= * * For place and removing events, use plugin commands. * RPG Maker MZ plugin commands you can found in Plugin Command Menu * RPG Maker MV plugin commands list: * - PlacePocketEvent PlacementItemID RemoveItemID * Where: PlacementItemID - Placement Item Index from Placement Items plugin parameter * RemoveItemID - Item that's will be deleting from inventory when * item is placed [optional]Item that's will be deleting from * inventory when item is placed [optional] * * - PickUpPocketEvent PlacementItemID GainItemID * Where: PlacementItemID - Placement Item Index from Placement Items plugin parameter * GainItemID - Item that's will be added to inventory when item is removed from map [optional] * * - PickUpThisPocketEvent GainItemID * PickUp (remove) current Pocket Event (event should have been placed as Pocket Event) * GainItemID - Item that's will be added to inventory when item is removed from map [optional] * * ======================================================================= * * Since update 1.1. you can create draggable events. * Player can dragging those events by mouse to another place on map. * Set plugin parameter "Event Drag Drop?" to true for activate dragging. * Setup dragging event rules in "Draggable Templates" plugin parameter. * * Add comment "draggable:X" (without quotes) on event page * where X - number of dragging template from plugin parameters * * ======================================================================= * Since update 1.4 available Script calls: * * - PE_Place(PlacementItemID, RemoveItemID); * - PE_PickUpByItem(PlacementItemID, GainItemID); * - PE_PickUpByEvent(GainItemID); * * - PE_LastEventId(); - return last placed pocket event or placed draggable event ID * - PE_LastEventRegion(); - return Region of last placed event * - PE_LastEventTerrain(); - return Terrain Tag of last placed event * - PE_LastEvent(); - return last placed event Game_Event object * * - PE_ForceStopTimer(eventID, mapID); - force stop timer for placed Pocket Event * - PE_PE_ForceCompleteTimer(eventID, mapID); - force complete timer action for * placed Pocket Event * * Where: mapID - optional, if you not specify will be uses current map ID * * ======================================================================= * * * * * Visit plugin web page for more information, also you can find Demo project. * * 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, Commercial * * * @param TemplatesMap * @text Templates Map * @type number * @min 1 * @default 1 * @desc Map ID with Placement Events templates * * @param GlobalExceptRegions * @text Forbidden Regions * @type number[] * @min 1 * @max 255 * @desc Region ID's where placement items cannot be placed * @default [] * * @param PlacementsList * @text Placement Items * @type struct[] * @desc Placement Items List * @default [] * * @param AllowArrowMove * @text Keyboard Moving? * @type boolean * @default false * @desc Allow moving placement item when place by arrow keys? (if false - only by mouse) * * @param AllowEventDragging * @text Event Drag Drop? * @type boolean * @default true * @desc Allow player dragging draggable (must have special comment) events? * * @param DraggableList * @text Draggable Templates * @type struct[] * @desc Draggable Events Settings Templates List * @default [] * * @param spacer|endHolder @text‏‏‎ ‎@desc =============================================== * * @command PlacePocketEvent * @text Place Pocket Event * @desc Placing pocket event on map with placement select * * @arg placementItemId * @text Placement Item * @desc Placement Item Index from Placement Items plugin parameter * @type number * @min 1 * @default 1 * * @arg gameItemId * @text Consume Item * @desc Item that's will be deleting from inventory when item is placed [optional] * @type item * @default 0 * * @command RemovePocketEvent * @text PickUp By Place Item * @desc PickUp (removing) pocket event from map * * @arg placementItemId * @text Placement Item * @desc Placement Item Index from Placement Items plugin parameter * @type number * @min 1 * @default 1 * * @arg gameItemId * @text Gain Item * @desc Item that's will be added to inventory when item is removed from map [optional] * @type item * @default 0 * * @command RemovePocketEvent2 * @text PickUp By Event * @desc PickUp (removing) current pocket event from map * * @arg gameItemId * @text Gain Item * @desc Item that's will be added to inventory when item is removed from map [optional] * @type item * @default 0 * * @command EMPTY_HOLDER * @text ‏ * @desc * @default */ /*:ru * @plugindesc (v.1.4)[PRO] Позволяет спавнить предметы как события на карту * @author Pheonix KageDesu * @target MZ MV * @url https://kdworkshop.net/plugins/pocket-events/ * * * @help * Этот плагин позволяет игроку размещать события с указанной "шаблонной" карты * с выбором места размещения для них на текущей карте. * * Карта шаблонов указывается в параметре плагина "Карта-шаблон". * * Для создания правил и настройки событий для размещения см. Параметр плагина * "События" * * ======================================================================= * * Для размещения и удаления событий исп. след. команды плагина: * * RPG Maker MZ plugin - найдёте в меню команд плагина * RPG Maker MV plugin - команды: * - PlacePocketEvent PlacementItemID RemoveItemID * Где: PlacementItemID - Индекс события из Параметров плагина (События) * RemoveItemID - (Опционально) Номер предмета, который будет удалён из инвентаря * * - PickUpPocketEvent PlacementItemID GainItemID * Где: PlacementItemID - Индекс события из Параметров плагина (События) * GainItemID - (Опционально) Предмет который будет добавлен в инвентарь * * - PickUpThisPocketEvent GainItemID * Удалить (поднять) текущее событие (оно должно было быть ранее размещено) * GainItemID - (Опционально) Предмет который будет добавлен в инвентарь * * ======================================================================= * * После обновления 1.1 плагин позволяет создавать перемещаемые события * Игрок может перетаскивать такое событие при помощи мышки * Для активации, установите параметр: Перемещение? -> ВКЛ * Настройте правила для перемещения, параметр Шаблоны перемещения * * Добавить комментарий на страницу события draggable:X * Где X - номер шаблона перемещения * * ======================================================================= * После обновления 1.4 доступны вызовы скриптов: * * - PE_Place(PlacementItemID, RemoveItemID); * - PE_PickUpByItem(PlacementItemID, GainItemID); * - PE_PickUpByEvent(GainItemID); * * - PE_LastEventId(); - возвращает ID последнего размещённого (перенесённого) события * - PE_LastEventRegion(); - возвращает номер региона последнего события * - PE_LastEventTerrain(); - возвращает номер территории последнего события * - PE_LastEvent(); - возвращает последнее события как объект Game_Event * * - PE_ForceStopTimer(eventID, mapID); - завершить таймер для событий * - PE_PE_ForceCompleteTimer(eventID, mapID); - завершить таймер и выполнить * действие таймера * * Где: mapID - номер карты (опционально), если не указать, будет исп. текущая карта * eventID - номер события с таймером (размещённое ранее) * * ======================================================================= * * * * --------------------------------------------------------------------------- * Поддержите меня на Boosty и получите доступ к PRO версии данного плагина * и многим другим моим плагинам * * https://boosty.to/kagedesu * * YouTube: * https://www.youtube.com/channel/UCA3R61ojF5vp5tGwJ1YqdgQ? * * * Лицензия: Creative Commons 4.0 Attribution, Share Alike, Commercial * Вы можете использовать плагин в коммерческих проектах на единственном * условие, что этот плагин был приобретен на законных основаниях * (через покупку на сайте https://boosty.to/kagedesu). * * @param TemplatesMap * @text Карта-шаблон * @type number * @min 1 * @default 1 * @desc Номер карты на которой будут хранится события-шаблоны * * @param GlobalExceptRegions * @text Запрещённые регионы * @type number[] * @min 1 * @max 255 * @desc Глобальные запрещённые регионы на которых нельзя поместить событие * @default [] * * @param PlacementsList * @text События * @type struct[] * @desc * @default [] * * @param AllowArrowMove * @text Клавиатура? * @type boolean * @default false * @desc Разрешить двигать событие при помощи стрелок на клавиатуре? (если ВЫКЛ - то только мышкой) * * @param AllowEventDragging * @text Перемещение? * @type boolean * @default true * @desc Включить систему перемещения событий? (событие должно иметь спец. комментарий) * * @param DraggableList * @text Шаблоны перемещения * @type struct[] * @desc Шаблоны настроек перемещаемых событий * @default [] * * @param spacer|endHolder @text‏‏‎ ‎@desc =============================================== * * @command PlacePocketEvent * @text Поместить событие * @desc Поместить предмет как событие на карту * * @arg placementItemId * @text Событие * @desc Номер события из параметра плагина События * @type number * @min 1 * @default 1 * * @arg gameItemId * @text Игровой предмет * @desc Опционально. Предмет который будет удалён из инвентаря при размещении данного события на крате. * @type item * @default 0 * * @command RemovePocketEvent * @text Поднять событие * @desc Удалить расположенное ранее событие с карты * * @arg placementItemId * @text Событие * @desc Номер события из параметра плагина События! НЕ номер события на карте! * @type number * @min 1 * @default 1 * * @arg gameItemId * @text Игровой предмет * @desc Опционально. Предмет который будет добавлен в инвентарь. * @type item * @default 0 * * @command RemovePocketEvent2 * @text Поднять ЭТО событие * @desc Удалить данное! (расположенное ранее) событие с карты * * @arg gameItemId * @text Gain Item * @desc Опционально. Предмет который будет добавлен в инвентарь. * @type item * @default 0 * * @command EMPTY_HOLDER * @text ‏ * @desc * @default */ /*~struct~PlacementItem: @param eventId @text Event ID @type number @default 1 @min 1 @desc Event ID on Placements Templates Map @param animationId @text Place Animation @type animation @default 0 @desc Animation that will be playing after item placed @param gridVisiblity @text Grid @type boolean @default true @desc Show map grid when this item placing? @param sSwitch @text Self Switch @type combo @option None @option A @option B @option C @option D @default None @desc Select which Self Switch will be turned ON when item been placed @param exceptRegions @text Forbidden Regions @type number[] @min 1 @max 255 @desc Region ID's where this item cannot be placed @default [] @param onlyRegions @text Allowed Only Regions @type number[] @min 1 @max 255 @desc Only Region ID's where this item can be placed @default [] @param exceptTT @text Forbidden Terrain Tags @type number[] @min 1 @max 7 @desc The terrains tags (1-7) where this event cannot be placed @default [] @param onlyTT @text Allowed Terrain Tags @type number[] @min 1 @max 7 @desc The terrains tags (1-7) where this item can be placed @default [] @param ceSpawnGood @text On Placed CE @type common_event @default 0 @desc Common event called after item been placed @param canSpawnOverEvents @text Place On Events? @type boolean @default false @desc Can be this item placed on (above) other map events? @param ceSpawnCancel @text On Cancel CE @type common_event @default 0 @desc Common event called if player not placed item, just cancel placement (ESC or right mouse click) @param isShouldPauseMap @text Pause Game? @type boolean @default false @desc Pause game map when player placing this item? @param maxDistance @text Distance @type number @default 0 @min 0 @desc Maximum allowed distance (from player) to place this item. 0 - unlimited @param allowMargin @text Allow Y Offset? @type boolean @default false @desc If true, you can change object height offset by mouse scroll (when placing) @param marginStep @parent allowMargin @text Step @type number @default 1 @min 1 @desc Y coordinate changing step (in px) @param marginMin @parent allowMargin @text Min Offset @type number @default -20 @min -100 @max -1 @desc Lower allowed height offset value @param marginMax @parent allowMargin @text Max Offset @type number @default 20 @min 1 @max 100 @desc Upper allowed height offset value @param timer @text Timer @type struct @default {"time":"0","isLocal":"true","specialAction":"Start","sSwitch":"None","ceEvent":"0"} @desc Timer for spawned event. Start, execute action or remove event after certain time. */ /*~struct~PlacementItem:ru @param eventId @text Event ID @type number @default 1 @min 1 @desc ID События на Карта-шаблон @param animationId @text Place Animation @type animation @default 0 @desc Анимация когда событие будет установлено на карту @param gridVisiblity @text Grid @type boolean @default true @desc Показывать сетку? @param sSwitch @text Self Switch @type combo @option None @option A @option B @option C @option D @default None @desc Локальный переключательно, который будет ВКЛ, когда событие будет установлено на карту @param exceptRegions @text Forbidden Regions @type number[] @min 1 @max 255 @desc Номера регионов (ТОЛЬКО) на которых НЕЛЬЗЯ разместить событие @default [] @param onlyRegions @text Allowed Only Regions @type number[] @min 1 @max 255 @desc Номера регионов (ТОЛЬКО) на которых МОЖНО разместить событие @default [] @param exceptTT @text Forbidden Terrain Tags @type number[] @min 1 @max 7 @desc Номера территории (ТОЛЬКО) (terrain tag 1-7) на которых НЕЛЬЗЯ разместить событие @default [] @param onlyTT @text Allowed Terrain Tags @type number[] @min 1 @max 7 @desc Номера территории (ТОЛЬКО) (terrain tag 1-7) на которых МОЖНО разместить событие @default [] @param ceSpawnGood @text On Placed CE @type common_event @default 0 @desc Общее событие вызываемое когда предмет установлен на карту @param canSpawnOverEvents @text Place On Events? @type boolean @default false @desc Можно ли поместить \ установить событие поверх других событий? @param ceSpawnCancel @text On Cancel CE @type common_event @default 0 @desc Общее событие вызываемое когда установка события отменена игроком @param isShouldPauseMap @text Pause Game? @type boolean @default false @desc Ставить игру на паузу при процессе размещения данного события? @param maxDistance @text Distance @type number @default 0 @min 0 @desc Максимальная дистанция (от игрока) на которую можно установить данное событие на карту. 0 - нет ограничений @param allowMargin @text Allow Y Offset? @type boolean @default false @desc Если ВКЛ, можно менять высоту предмета на оси Y путём скролла колеса мышки @param marginStep @parent allowMargin @text Step @type number @default 1 @min 1 @desc Шаг изменения координаты Y на один скролл колеса мышки @param marginMin @parent allowMargin @text Min Offset @type number @default -20 @min -100 @max -1 @desc Минимальный сдвиг по оси Y @param marginMax @parent allowMargin @text Max Offset @type number @default 20 @min 1 @max 100 @desc Маскимальный сдвиг по оси Y @param timer @text Timer @type struct @default {"time":"0","isLocal":"true","specialAction":"Start","sSwitch":"None","ceEvent":"0"} @desc Настройки таймера. Запускает действие по окончанию времени. */ /*~struct~ETimer: @param time @text Time @type number @decimals 1 @min 0 @default 0 @desc Time in seconds. 0 - no timer. @param isLocal @text Is Local? @type boolean @on Local @off Global @default true @desc Local timer countdown only when player on same map with this Event. Global always countdown. @param specialAction @text On Complete @type combo @option Start @option Common Event @option Erase @option Self Switch @default Start @desc Action when timer is reach 0 @param sSwitch @parent specialAction @text Self Switch @type combo @option None @option A @option B @option C @option D @default None @desc If you select Self Switch. Select which Ssw will be turned ON when timer is complete @param ceEvent @parent specialAction @text Common Event @type common_event @default 0 @desc If you select Common Event. which will be called when timer is complete */ /*~struct~ETimer:ru @param time @text Time @type number @decimals 1 @min 0 @default 0 @desc Время в секундах. 0 - нет таймера. @param isLocal @text Is Local? @type boolean @on Свой @off Общий @default true @desc Если свой (ВКЛ) - значит таймер будет работать только на карте с этим событием. Если общий - то на всех картах. @param specialAction @text On Complete @type combo @option Start @option Common Event @option Erase @option Self Switch @default Start @desc Действие, когда таймер закончит отсчёт (Запуск, Общее событие, Стереть, Локал. перекл.) @param sSwitch @parent specialAction @text Self Switch @type combo @option None @option A @option B @option C @option D @default None @desc Если выбрано действие - Self Switch. Какой локальный переключаетель будет в положение ВКЛ @param ceEvent @parent specialAction @text Common Event @type common_event @default 0 @desc Если выбрано действие - Common Event. Вызов общего события по завершению таймера */ /*~struct~DraggableItem: @param gridVisiblity @text Grid @type boolean @default true @desc Show map grid when this event dragging? @param exceptRegions @text Forbidden Regions @type number[] @min 1 @max 255 @desc Region ID's where this event cannot be placed after dragging @default [] @param onlyRegions @text Allowed Only Regions @type number[] @min 1 @max 255 @desc Only Region ID's where this item can be placed after dragging @default [] @param exceptTT @text Forbidden Terrain Tags @type number[] @min 1 @max 7 @desc The terrains tags (1-7) where this event cannot be placed after dragging @default [] @param onlyTT @text Allowed Terrain Tags @type number[] @min 1 @max 7 @desc The terrains tags (1-7) where this item can be placed after dragging @default [] @param ceDragStart @text On Start CE @type common_event @default 0 @desc Common event called when event start dragging. Works only if Pause Game is Off @param ceSpawnGood @text On Placed CE @type common_event @default 0 @desc Common event called after event been placed (after dragging) @param ceDradBad @text On Returned CE @type common_event @default 0 @desc Common event called when dragging is failed @param canSpawnOverEvents @text Place On Events? @type boolean @default false @desc Can be this event placed on (above) other map events? @param isShouldPauseMap @text Pause Game? @type boolean @default false @desc Pause game map when player dragging this event? @param image @text Drag Image @type struct @default @desc Change event graphic to this image when event is dragging, optional */ /*~struct~DraggableItem:ru @param gridVisiblity @text Grid @type boolean @default true @desc Показывать сетку при перемещении? @param exceptRegions @text Forbidden Regions @type number[] @min 1 @max 255 @desc Номера регионов (ТОЛЬКО) на которых НЕЛЬЗЯ разместить событие @default [] @param onlyRegions @text Allowed Only Regions @type number[] @min 1 @max 255 @desc Номера регионов (ТОЛЬКО) на которых МОЖНО разместить событие @default [] @param exceptTT @text Forbidden Terrain Tags @type number[] @min 1 @max 7 @desc Номера территории (ТОЛЬКО) (terrain tag 1-7) на которых НЕЛЬЗЯ разместить событие @default [] @param onlyTT @text Allowed Terrain Tags @type number[] @min 1 @max 7 @desc Номера территории (ТОЛЬКО) (terrain tag 1-7) на которых МОЖНО разместить событие @default [] @param ceDragStart @text On Start CE @type common_event @default 0 @desc Общее событие, когда перемещение только началось. Работает только если параметр Pause Game выключен @param ceSpawnGood @text On Placed CE @type common_event @default 0 @desc Общее событие когда перемещение закончено успешно @param ceDradBad @text On Returned CE @type common_event @default 0 @desc Общее событие когда перемещение НЕ законченно (возврат) @param canSpawnOverEvents @text Place On Events? @type boolean @default false @desc Можно ли разместить поверх других событий? @param isShouldPauseMap @text Pause Game? @type boolean @default false @desc Ставить игру на паузу при перемещении данного события? @param image @text Drag Image @type struct @default @desc (Опционально) Изменять графику события на данную при перещемении? */ /*~struct~DraggableItemImage: @param characterName @text Graphic @type file @dir img/characters/ @require 1 @default @desc Character graphic file @param characterIndex @text Index @type number @min 0 @desc Charcter Index on character graphics @default 0 */ /*~struct~DraggableItemImage:ru @param characterName @text Graphic @type file @dir img/characters/ @require 1 @default @desc Файл с графикой персонажа @param characterIndex @text Index @type number @min 0 @desc Номер персонажа (индекс) @default 0 */ var Imported = Imported || {}; Imported.PKD_EasyPlacement = true; Imported.PKD_PocketEvents = true; var PKD_EasyPlacement = {}; PKD_EasyPlacement.LIBS = {}; PKD_EasyPlacement.register = function (library) { this.LIBS[library.name] = library; }; var PKD_PocketEvents = PKD_EasyPlacement; var KDCoreMini = {}; window.KDCoreMini = KDCoreMini; KDCoreMini.Utils = {}; KDCoreMini.makeid = function (length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for (var i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; }; KDCoreMini.checkSwitch = function (switchValue) { try { if(!switchValue) return false; switchValue = switchValue.toUpperCase(); if (switchValue === 'A' || switchValue === 'B' || switchValue === 'C' || switchValue === 'D') { return true; } return false; } catch (error) { console.warn(error); return false; } }; (function () { 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; }; KDCoreMini.TimedUpdate = class TimedUpdate { constructor(interval, method1) { this.interval = interval; this.method = method1; this._timer = 0; this._once = false; } update() { if (this.interval == null) { return; } this._timer++; if (this._timer >= this.interval) { if (this.method != null) { this.method(); } 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; } }; KDCoreMini.Utils.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; }; KDCoreMini.isMZ = function () { return Utils.RPGMAKER_NAME.contains("MZ"); }; })(); (function(){ PKD_EasyPlacement.pluginName = "PKD_PocketEvents"; PKD_EasyPlacement.LoadPluginSettings = () => { const params = PluginManager.parameters(PKD_EasyPlacement.pluginName); //console.info(params); PKD_EasyPlacement.ITEMS_MAP = parseInt(params.TemplatesMap) || 0; PKD_EasyPlacement.PARAMS = {}; PKD_EasyPlacement.PARAMS.BAD_REGIONS = ParsePluginRegionArray(params.GlobalExceptRegions); PKD_EasyPlacement.PARAMS.ITEMS = ParsePluginItemsList(params.PlacementsList); PKD_EasyPlacement.PARAMS.ALLOW_ARROW_MOVE = JsonEx.parse(params.AllowArrowMove || "false"); PKD_EasyPlacement.PARAMS.ALLOW_DRAG = JsonEx.parse(params.AllowEventDragging || "true"); PKD_EasyPlacement.PARAMS.DRAG_ITEMS = ParsePluginDraggableList(params.DraggableList); //console.info(PKD_EasyPlacement.PARAMS); if(KDCoreMini.isMZ()) RegisterPluginCommnads(); ConfigurateClasses(); }; ParsePluginRegionArray = (arrayList) => { let list = JsonEx.parse(arrayList); list = list.map((e) => parseInt(e)); return list; }; ParsePluginItemsList = (arrayList) => { let lines = JsonEx.parse(arrayList); let parsed = lines.map((l) => JsonEx.parse(l)); parsed.forEach(element => { element.gridVisiblity = JsonEx.parse(element.gridVisiblity); element.animationId = parseInt(element.animationId); element.eventId = parseInt(element.eventId); element.exceptRegions = ParsePluginRegionArray(element.exceptRegions); element.onlyRegions = ParsePluginRegionArray(element.onlyRegions); // * Проверка, так как параметры были добавлены в обновлениях if(element.ceSpawnGood) { element.ceSpawnGood = parseInt(element.ceSpawnGood); } else { element.ceSpawnGood = 0; } if(element.ceSpawnCancel) { element.ceSpawnCancel = parseInt(element.ceSpawnCancel); } else { element.ceSpawnCancel = 0; } if(element.canSpawnOverEvents) { element.canSpawnOverEvents = JsonEx.parse(element.canSpawnOverEvents); } else { element.canSpawnOverEvents = false; } if(element.isShouldPauseMap) { element.isShouldPauseMap = JsonEx.parse(element.isShouldPauseMap); } else { element.isShouldPauseMap = false; } if(element.maxDistance) { element.maxDistance = parseInt(element.maxDistance); } else { element.maxDistance = 0; } // * MARGINS if(element.allowMargin) { element.allowMargin = JsonEx.parse(element.allowMargin); } else { element.allowMargin = false; } if(element.marginStep) { element.marginStep = parseInt(element.marginStep); } else { element.marginStep = 1; } if(element.marginMix) { element.marginMix = parseInt(element.marginMix); } else { element.marginMin = -20; } if(element.marginMax) { element.marginMax = parseInt(element.marginMax); } else { element.marginMax = 20; } // * NOT USED (DEPRECATED) if(element.selfSwitchOn) { try { if(KDCoreMini.checkSwitch(element.selfSwitchOn)) { element.selfSwitchOn = element.selfSwitchOn.toUpperCase(); } else { element.selfSwitchOn = null; } } catch (e) { console.warn(e); element.selfSwitchOn = null; } } // * TERRAIN TAGS if(element.exceptTT) { element.exceptTT = ParsePluginRegionArray(element.exceptTT); } else { element.exceptTT = []; } if(element.onlyTT) { element.onlyTT = ParsePluginRegionArray(element.onlyTT); } else { element.onlyTT = []; } // * TIMER if(element.timer) { element.timer = JsonEx.parse(element.timer); try { element.timer.time = Number(element.timer.time); if(element.timer.time > 0) { element.timer.ceEvent = parseInt(element.timer.ceEvent); element.timer.isLocal = eval(element.timer.isLocal); } } catch (e) { console.warn(e); } } else { element.timer = { time: 0 }; } }); parsed = [null].concat(parsed); return parsed; }; ParsePluginDraggableList = (arrayList) => { if(!arrayList) return []; let lines = JsonEx.parse(arrayList); let parsed = lines.map((l) => JsonEx.parse(l)); parsed.forEach(element => { element.gridVisiblity = JsonEx.parse(element.gridVisiblity); element.exceptRegions = ParsePluginRegionArray(element.exceptRegions); if(element.onlyRegions) element.onlyRegions = ParsePluginRegionArray(element.onlyRegions); else element.onlyRegions = []; element.ceSpawnGood = parseInt(element.ceSpawnGood); element.canSpawnOverEvents = JsonEx.parse(element.canSpawnOverEvents); element.isShouldPauseMap = JsonEx.parse(element.isShouldPauseMap); if(element.image) { element.image = JsonEx.parse(element.image); } else { element.image = null; } if(element.ceDragStart) { element.ceDragStart = parseInt(element.ceDragStart); } else { element.ceDragStart = 0; } if(element.ceDradBad) { element.ceDradBad = parseInt(element.ceDradBad); } else { element.ceDradBad = 0; } if(element.selfSwitchOn) { try { if(KDCoreMini.checkSwitch(element.selfSwitchOn)) { element.selfSwitchOn = element.selfSwitchOn.toUpperCase(); } else { element.selfSwitchOn = null; } } catch (e) { console.warn(e); element.selfSwitchOn = null; } } // * TERRAIN TAGS if(element.exceptTT) { element.exceptTT = ParsePluginRegionArray(element.exceptTT); } else { element.exceptTT = []; } if(element.onlyTT) { element.onlyTT = ParsePluginRegionArray(element.onlyTT); } else { element.onlyTT = []; } }); parsed = [null].concat(parsed); return parsed; }; RegisterPluginCommnads = () => { PluginManager.registerCommand(PKD_EasyPlacement.pluginName, 'PlacePocketEvent', args => { try { let pItemId = parseInt(args.placementItemId); let gItemId = parseInt(args.gameItemId); if(pItemId >= 0) PKD_EPManager.Start(pItemId, gItemId); } catch (e) { console.warn(e); } }); PluginManager.registerCommand(PKD_EasyPlacement.pluginName, 'RemovePocketEvent', args => { try { let pItemId = parseInt(args.placementItemId); let gItemId = parseInt(args.gameItemId); if (pItemId >= 0) PKD_EPManager.PickUpPlacedItem(pItemId, gItemId); } catch (e) { console.warn(e); } }); PluginManager.registerCommand(PKD_EasyPlacement.pluginName, 'RemovePocketEvent2', args => { try { let gItemId = parseInt(args.gameItemId); let pEventId = $gameMap._interpreter.eventId(); if (pEventId >= 0) PKD_EPManager.PickUpPlacedItemByEvent(pEventId, gItemId); } catch (e) { console.warn(e); } }); }; ConfigurateClasses = () => { if(PKD_EasyPlacement.PARAMS.ALLOW_DRAG == false) { Scene_Map.prototype.pProcessMapEventDragging = () => {}; } // * Совместимость с MapInventory (исправляет некоторые косячки) if(Imported.PKD_MapInventory == true) { PKD_EasyPlacement.applyMIPatch(); } // * Совместимость с Alpha NET Z if(Imported.Alpha_NETZ == true) { PKD_EasyPlacement.applyNETZPatch(); } }; })(); // * Общая библиотека для методов которых нет в MV (function(){ if(!KDCoreMini.isMZ()) { Spriteset_Map.prototype.findTargetSprite = function(target) { return this._characterSprites.find(sprite => sprite.checkCharacter(target)); }; Sprite_Character.prototype.checkCharacter = function(character) { return this._character === character; }; //@[ALIAS] var 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; }; Game_Temp.prototype.requestAnimation = function(targets, animationId) { if(animationId > 0) { if ($dataAnimations[animationId]) { targets.forEach(t => t.requestAnimation(animationId)) } } }; //@[ALIAS] var _Game_Interpreter_pluginCommand_3434 = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function (command, args) { _Game_Interpreter_pluginCommand_3434.call(this, command, args); if (command === 'PlacePocketEvent') { try { var pocketItemId = parseInt(args[0]); var gameItemId = 0; if(args[1]) { gameItemId = parseInt(args[1]); } if(pocketItemId >= 0) { PKD_EPManager.Start(pocketItemId, gameItemId); } } catch (e) { console.warn(e); } } else if (command === 'PickUpPocketEvent') { try { var pocketItemId = parseInt(args[0]); var gameItemId = 0; if(args[1]) { gameItemId = parseInt(args[1]); } if(pocketItemId >= 0) { PKD_EPManager.PickUpPlacedItem(pocketItemId, gameItemId); } } catch (e) { console.warn(e); } } else if (command === 'PickUpThisPocketEvent') { try { let eventId = this.eventId(); let gameItemId = 0; if(args[0]) { gameItemId = parseInt(args[0]); } if(eventId > 0) { PKD_EPManager.PickUpPlacedItemByEvent(eventId, gameItemId); } } catch (e) { console.warn(e); } } }; } })(); function Game_EPEvent() { this.initialize.apply(this, arguments); } Game_EPEvent.prototype = Object.create(Game_Event.prototype); Game_EPEvent.prototype.constructor = Game_EPEvent; Game_EPEvent.prototype.initialize = function (templateEventId, eventId, epItemId) { this._templateEventId = templateEventId; this._epItemId = epItemId; Game_Event.prototype.initialize.call(this, $gameMap.mapId(), eventId); DataManager.extractMetadata(this.event()); this.setPosition(-1, -1); }; Game_EPEvent.prototype.event = function () { return $dataEPEventsMap.events[this._templateEventId]; }; Game_EPEvent.prototype.pGetEPDynamicObjId = function () { return 1; // * JUST FOR CONDITIONS }; // * Only once, after spawning (not after load) Game_EPEvent.prototype.epStartTimer = function () { if (PKD_PocketEvents.IsNetworkGame() == true) { console.warn("In current version of Pocket Events Timers not works with Alpha NET Z"); return; } let timer = this.epGetTimerData(); if (timer) { $gameMap.peAddTimer(timer, this.eventId()); } }; Game_EPEvent.prototype.epGetTimerData = function () { try { let itemData = PKD_EPManager.ItemData(this._epItemId); if (itemData.timer && itemData.timer.time > 0) { return itemData.timer; } return null; } catch (error) { console.warn(error); return null; } }; Game_EPEvent.prototype.epDoneTimer = function () { let timer = this.epGetTimerData(); if (timer) { try { let actionType = timer.specialAction; switch (actionType) { case "Start": this.start(); break; case "Erase": this.erase(); let evId = this.eventId(); setTimeout(() => { PE_PickUpByEvent(evId, 0); }, 10); break; case "Self Switch": if(KDCoreMini.checkSwitch(timer.sSwitch)) { let key = [$gameMap.mapId(), this.eventId(), timer.sSwitch]; $gameSelfSwitches.setValue(key, true); } break; case "Common Event": if(timer.ceEvent > 0) this.peStartCommonEventLocal(timer.ceEvent); break; default: console.warn("Unknown timer complete action: " + actionType); break; } } catch (error) { console.warn(error); } } }; (function(){ DataManager.pLoadEPEventData = function () { var mapId = PKD_EasyPlacement.ITEMS_MAP; if (mapId > 0) { var filename = 'Map%1.json'.format(mapId.padZero(3)); this.loadDataFile('$dataEPEventsMap', filename); } else { console.warn("EasyPlacement.js: You didn't set a map ID for placement events!"); window.alert("EasyPlacement.js: You didn't set a map ID for placement events!"); } }; //@[ALIAS] var _alias_DataManager_loadDatabase = DataManager.loadDatabase; DataManager.loadDatabase = function () { PKD_EasyPlacement.LoadPluginSettings(); DataManager.pLoadEPEventData(); _alias_DataManager_loadDatabase.call(this); }; })(); // Generated by CoffeeScript 2.5.1 // * MAIN Array.prototype.last = function() { return this[this.length - 1]; }; TouchInput.mapPoint = function() { var x, y; x = $gameMap.canvasToMapX(TouchInput.x); y = $gameMap.canvasToMapY(TouchInput.y); return {x, y}; }; TouchInput.mapScreenPoint = function() { var t, th, tw, x, y; ({x, y} = TouchInput.mapPoint()); t = $gameMap.adjustX(x); tw = $gameMap.tileWidth(); x = Math.round(t * tw + tw / 2); t = $gameMap.adjustY(y); th = $gameMap.tileHeight(); y = Math.round(t * th + th); return {x, y}; }; // Generated by CoffeeScript 2.6.1 var PKD_EPManager; PKD_EPManager = function() {}; (function() { var _; _ = PKD_EPManager; _.Scene = function() { return SceneManager._scene; }; _.OnMapLoaded = function() { this.isActive = false; this.SetGridVisibility(false); if (this.isShouldLoadEvents()) { this.CreateEPEventsOnMap(); $gameSystem.pRestoreDraggableEventsPositions(); this.RestoreMargins(); this.isNextMapLoaded = false; } $gameMap.peCheckCompleteTimers(); }; _.OnNextMapLoaded = function() { return this.isNextMapLoaded = true; }; _.isShouldLoadEvents = function() { return this.isNextMapLoaded === true; }; _.IsGridVisible = function() { return this.isGridVisible; }; _.IsActive = function() { return this.isActive === true; }; _.IsPointIsGood = function() { if (this.IsActive()) { return this.IsPointIsGoodForPlacement(); } else if (this.IsEventDragStart()) { return this.IsPointIsGoodForDrag(); } else { return true; } }; _.IsPointIsGoodForPlacement = function() { var x, y; // * Потому что добавил движение стрелками if ($gameTemp._epSpawned != null) { ({x, y} = $gameTemp._epSpawned); } else { ({x, y} = TouchInput.mapPoint()); } // * Только если нельзя спавнить на другие события (по умолчанию) if (!$gameTemp._epSpawnModeOverEvents) { // * > 1 because self under mouse if ($gameMap.eventsXy(x, y).length > 1) { return false; } } if ($gamePlayer.pos(x, y)) { return false; } if (Game_CharacterBase.prototype.isCollidedWithVehicles(x, y)) { return false; } if (!this.CheckRegions(x, y)) { return false; } return this.CheckDistance(x, y); }; _.CheckRegions = function(x, y) { var item, region, regionSet, terrain; regionSet = PKD_EasyPlacement.PARAMS.BAD_REGIONS; region = $gameMap.regionId(x, y); if (regionSet.contains(region)) { return false; } item = this.CurrentPlacementItemData(); if (item == null) { return true; } if (item.onlyRegions.length > 0) { if (!item.onlyRegions.contains(region)) { return false; } } else if (item.exceptRegions.length > 0) { if (item.exceptRegions.contains(region)) { return false; } } terrain = $gameMap.terrainTag(x, y); if (item.onlyTT.length > 0) { if (!item.onlyTT.contains(terrain)) { return false; } } else if (item.exceptTT.length > 0) { if (item.exceptTT.contains(terrain)) { return false; } } return true; }; _.CheckDistance = function(x, y) { var allowedDist, dist, item; item = this.CurrentPlacementItemData(); if (item == null) { return true; } allowedDist = item.maxDistance; if (allowedDist > 0) { dist = $gameMap.distance($gamePlayer.x, $gamePlayer.y, x, y); return dist <= allowedDist; } else { return true; } }; _.SetGridVisibility = function(isGridVisible) { this.isGridVisible = isGridVisible; }; _.ItemData = function(pItemIndex) { return PKD_EasyPlacement.PARAMS.ITEMS[pItemIndex]; }; _.CurrentPlacementItemData = function() { var itemData; if (!$gameTemp._epPlacementItemId) { return null; } itemData = this.ItemData($gameTemp._epPlacementItemId); return itemData; }; //?VERSION _.Start = function(pItemIndex, gItemId = 0) {}; // * Сохраняем текущий предмет для дальнейшей работы с ним _.RegisterPlacementItem = function(pItemIndex, gItemId) { $gameTemp._epPlacementPartyItemId = gItemId; $gameTemp._epPlacementItemId = pItemIndex; }; _.Stop = function() { //"STOP".p() this.Scene().pEndEPMode(); this.SetGridVisibility(false); this.isActive = false; this.ClearRegisteredPlacementItem(); }; _.ClearRegisteredPlacementItem = function() { $gameTemp._epPlacementPartyItemId = null; $gameTemp._epPlacementItemId = null; }; _.PlaceItemOn = function(x, y) { var commonEventId, dbItem, evId, itemId, marginY, uniqueId; evId = $gameTemp._epSpawned.eventId(); itemId = $gameTemp._epPlacementItemId; dbItem = $gameSystem.pRegisterEPItem($gameMap.mapId(), itemId, x, y, evId); this.ActivatePlacedItem($gameMap.mapId(), itemId, evId); this.ChangePlacementItem(-1); this.CallPlacementAnimation($gameTemp._epSpawned, itemId); if (PKD_PocketEvents.IsNetworkGame()) { uniqueId = PKD_EPManager.GenerateUniqueId(); dbItem.push(uniqueId); marginY = $gameTemp._epSpawned.epMY; PKD_EPManager.SendItemPlacedToServer(x, y, uniqueId, marginY); } commonEventId = this.ItemData(itemId).ceSpawnGood; if (commonEventId > 0) { $gameTemp.reserveCommonEvent(commonEventId); } $gameTemp.peLastEventId = evId; $gameTemp._epSpawned.epStartTimer(); }; _.CallPlacementAnimation = function(event, itemId) { var animationId; animationId = this.ItemData(itemId).animationId; if (animationId > 0) { $gameTemp.requestAnimation([event], animationId); } }; _.CallCancelCommonEvent = function() { var commonEventId, itemId; if ($gameTemp._epPlacementItemId == null) { return; } itemId = $gameTemp._epPlacementItemId; commonEventId = this.ItemData(itemId).ceSpawnCancel; if (commonEventId > 0) { $gameTemp.reserveCommonEvent(commonEventId); } }; _.ChangePlacementItem = function(count) { var itemId; itemId = $gameTemp._epPlacementPartyItemId; if (itemId == null) { return; } if ($dataItems[itemId] == null) { return; } return $gameParty.gainItem($dataItems[itemId], count); }; _.ActivatePlacedItem = function(mapId, itemId, eventId) { var key, sSwitch; sSwitch = this.ItemData(itemId).sSwitch; if (sSwitch === "None" || sSwitch === "") { return; } key = [mapId, eventId, sSwitch]; $gameSelfSwitches.setValue(key, true); return $gameMap.requestRefresh(); }; _.ClearSelfSwitches = function(mapId, eventId) { var j, key, len, ref, s; ref = ['A', 'B', 'C', 'D']; for (j = 0, len = ref.length; j < len; j++) { s = ref[j]; key = [mapId, eventId, s]; $gameSelfSwitches.setValue(key, false); } if (mapId === $gameMap.mapId()) { $gameMap.requestRefresh(); } }; // * Удаляет по событию _.PickUpPlacedItemByEvent = function(eventId, gItemId = 0) { var ev, uniqueId; ev = $gameMap.event(eventId); if (ev == null) { return; } if (ev.pGetEPDynamicObjId() < 0) { return; } $gameSystem.pRemoveEPItem($gameMap.mapId(), eventId); this.Scene().pUnSpawnEPEvent(eventId); PKD_EPManager.ClearSelfSwitches($gameMap.mapId(), eventId); if (PKD_PocketEvents.IsNetworkGame()) { uniqueId = PKD_EPManager.GetUniqueIdBySpawnedEvent(eventId); PKD_EPManager.SendItemRemovedToServer(eventId, uniqueId); } if (gItemId <= 0) { return; } $gameTemp._epPlacementPartyItemId = gItemId; this.ChangePlacementItem(1); $gameTemp._epPlacementPartyItemId = null; }; // * Удаляет по предмету, событие сам находит _.PickUpPlacedItem = function(pItemIndex, gItemId) { var db, item; db = $gameSystem.pGetEPDB()[$gameMap.mapId()]; if (db == null) { return; } item = db.find(function(i) { return i[0] === pItemIndex; }); if (item == null) { return; } return this.PickUpPlacedItemByEvent(item[3], gItemId); }; //?VERSION _.CreateEPEventsOnMap = function() {}; (function() { // * EVENT DRAGGING SYSTEM // * ================================================================== _.IsEventDragStart = function() { return $gameTemp.pLastDraggableEvent != null; }; _.OnEventDragEnd = function() { if ($gameTemp.pLastDraggableEvent == null) { return; } this.Scene().pOnDragEnd(); $gameTemp.pLastDraggableEvent = null; }; _.GetDraggableEventUnderMouse = function() { var event; event = null; // * Поиск по событию event = $gameMap.pGetDraggableEventInTouchPoint(); // * Если не найдено, поиск по спрайту события if (event == null) { event = this.Scene().pGetDraggableEventInTouchPoint(); } return event; }; _.StartEventDrag = function() { $gameTemp.pPauseMap = false; $gameTemp.pLastDraggableEvent = this.GetDraggableEventUnderMouse(); if ($gameTemp.pLastDraggableEvent == null) { return; } this.Scene().pOnDragStart(); }; _.OnEventDragProcess = function() {}; // * EMPTY _.IsPointIsGoodForDrag = function() { var x, y; ({x, y} = TouchInput.mapPoint()); // * Только если нельзя спавнить на другие события (по умолчанию) if (!$gameTemp._epSpawnModeOverEvents) { // * Можно вернуть на своё место, поэтому доп. проверка на свою позицию if ($gameMap.eventsXy(x, y).length > 0 && !$gameTemp.pLastDraggableEvent.pos(x, y)) { return false; } } if ($gamePlayer.pos(x, y)) { return false; } if (Game_CharacterBase.prototype.isCollidedWithVehicles(x, y)) { return false; } if (!$gameTemp.pLastDraggableEvent.pOnDragCheckRegion(x, y)) { return false; } if (!$gameTemp.pLastDraggableEvent.pOnDragCheckTerrainTag(x, y)) { return false; } return true; }; //?VERSION return _.ExtractDraggableEventComment = function(list) {}; })(); })(); // Generated by CoffeeScript 2.5.1 (function() { var Sprite_GridCell; Sprite_GridCell = class Sprite_GridCell extends Sprite { constructor() { super(new Bitmap($gameMap.tileWidth(), $gameMap.tileHeight())); this.anchor.x = 0.5; this.anchor.y = 1; this.z = 1; this.maxOpacity = 80; this.minOpacity = 40; this.opacity = this.maxOpacity; this.setNormalColor(); this.updateOpacityChange = this.updateOpacityDown; this.colorChangeThread = new KDCoreMini.TimedUpdate(2, this._colorChange.bind(this)); this._colorChange(); } setNormalColor() { return this.bitmap.fillAll('rgba(255, 255, 255, 1)'); } setForbiddenColor() { return this.bitmap.fillAll('rgba(255, 0, 0, 1)'); } update() { super.update(); if (this.visible === false) { return; } this.updateOpacityChange(); return this.colorChangeThread.update(); } _colorChange() { if (!this.visible) { return; } if (PKD_EPManager.IsPointIsGood()) { return this.setNormalColor(); } else { return this.setForbiddenColor(); } } updateOpacityChange() {} // * EMPTPY updateOpacityDown() { this.opacity -= 3; if (this.opacity <= this.minOpacity) { return this.updateOpacityChange = this.updateOpacityUp; } } updateOpacityUp() { this.opacity += 3; if (this.opacity >= this.maxOpacity) { return this.updateOpacityChange = this.updateOpacityDown; } } }; PKD_EasyPlacement.register(Sprite_GridCell); })(); // Generated by CoffeeScript 2.5.1 (function() { PKD_EasyPlacement.applyMIPatch = function() { var __moveCell, __onCellClick, __onHotCellClick; if (window.PKD_MI == null) { return; } __onCellClick = PKD_MI.onInvCellClick; PKD_MI.onInvCellClick = function() { if (PKD_EPManager.IsEventDragStart() || PKD_EPManager.IsActive()) { return; } return __onCellClick.call(this, ...arguments); }; __onHotCellClick = PKD_MI.onMapHotCellClick; PKD_MI.onMapHotCellClick = function() { if (PKD_EPManager.IsEventDragStart() || PKD_EPManager.IsActive()) { return; } return __onHotCellClick.call(this, ...arguments); }; __moveCell = PKD_MI.startMoveCell; PKD_MI.startMoveCell = function() { if (PKD_EPManager.IsEventDragStart() || PKD_EPManager.IsActive()) { return; } return __moveCell.call(this, ...arguments); }; }; })(); // Generated by CoffeeScript 2.5.1 (function() { PKD_PocketEvents.IsNetworkGame = function() { return Imported.Alpha_NETZ === true && ANNetwork.isConnected(); }; // * Создать (поместить) событие от другого игрока (внешнее) PKD_EPManager.PlaceOuterItem = function({pItemIndex, x, y, mapId, spawnedEventId, uniqueId, marginY}) { var e, item; try { item = this.ItemData(pItemIndex); return this._SpawnEventOuter({ mapId: mapId, x: x, y: y, pItemIndex: pItemIndex, eventId: item.eventId, spawnedEventId: spawnedEventId, // * Нужен чтобы была возможность добавлять события даже если // * у клиентов разный размер $gameMap._events uniqueId: uniqueId, marginY: marginY }); } catch (error) { e = error; return KDCore.warning(e); } }; PKD_EPManager.GenerateUniqueId = function() { var eventId, uniqueId; uniqueId = $gameParty.leader().actorId() + "_" + KDCoreMini.makeid(8) + "_" + $gameMap.mapId(); // * Защита от копий eventId = this.FindSpawnedEventId($gameMap.mapId(), uniqueId); if (eventId < 0) { return uniqueId; } else { return PKD_EPManager.GenerateUniqueId(); } }; // * Создать (поместить) событие на карте (если карта таже) и зарегестрировать //?VERSION PKD_EPManager._SpawnEventOuter = function(eventData) {}; // * VERSION // * Сохранить состояние помещённого от другого игрока события // * Альтернатива PlaceItemOn //?VERSION PKD_EPManager._RegisterOuterItem = function(eventData) {}; // * VERSION // * Удалить внешнее (от другого игрока) событие // * Аналог PickUpPlacedItemByEvent //?VERSION PKD_EPManager.RemoveOuterItem = function() {}; // * VERSION // * Найти событие по уникальному ID PKD_EPManager.FindSpawnedEventId = function(mapId, uniqueId) { var db, eventData, i, len, mapData; db = $gameSystem.pGetEPDB(); mapData = db[mapId]; if (mapData == null) { return -1; } for (i = 0, len = mapData.length; i < len; i++) { eventData = mapData[i]; if (eventData.last() === uniqueId) { return eventData[3]; } } return -1; }; // * Получить уникальный ID события PKD_EPManager.GetUniqueIdBySpawnedEvent = function(mapId, spawnedEventId) { var db, eventData, i, len, mapData; db = $gameSystem.pGetEPDB(); mapData = db[mapId]; if (mapData == null) { return null; } for (i = 0, len = mapData.length; i < len; i++) { eventData = mapData[i]; if (eventData[3] === spawnedEventId && eventData.length > 3) { return eventData.last(); } } return null; }; // * Спавн (удаление) событий, которые были созданы (удалены) когда текущий игрок был в меню PKD_EPManager.OnMapLoadedFromMenu = function() { var db, evId, i, item, itemData, j, len, len1, mapId, ref, ref1; // * Если новая карта, то пропускаем if (this.isShouldLoadEvents()) { return; } if (!$gameTemp._requireNetEventsRefresh) { return; } db = $gameSystem.pGetEPDB(); mapId = $gameMap.mapId(); if (db[mapId] == null) { return; } ref = db[mapId]; for (i = 0, len = ref.length; i < len; i++) { item = ref[i]; if (item == null) { continue; } if ($gameMap.event(item[3]) == null) { itemData = this.ItemData(item[0]); this.Scene().pSpawnEPEvent(itemData.eventId, item[1], item[2], item[3]); } } if ($gameTemp._peNetEventsToRemove != null) { ref1 = $gameTemp._peNetEventsToRemove; for (j = 0, len1 = ref1.length; j < len1; j++) { evId = ref1[j]; this.Scene().pUnSpawnEPEvent(evId); } $gameTemp._peNetEventsToRemove = []; } this.RestoreMargins(); $gameTemp._requireNetEventsRefresh = false; }; // * Сетевые методы (API) // * =========================================== PKD_EPManager.SendItemPlacedToServer = function(x, y, uniqueId, marginY) { var data, e; if (!PKD_PocketEvents.IsNetworkGame()) { return; } try { data = { actorId: ANGameManager.myActorId(), pItemIndex: $gameTemp._epPlacementItemId, x, y, mapId: $gameMap.mapId(), spawnedEventId: $gameTemp._epSpawned.eventId(), uniqueId, marginY }; nAPI.sendCustomCommand("pkdPE:PlaceOuterItem", data); } catch (error) { e = error; KDCore.warning(e); } }; PKD_EPManager.SendItemRemovedToServer = function(spawnedEventId, uniqueId) { var data; if (!PKD_PocketEvents.IsNetworkGame()) { return; } data = { actorId: ANGameManager.myActorId(), mapId: $gameMap.mapId(), uniqueId, spawnedEventId }; return nAPI.sendCustomCommand("pkdPE:RemoveOuterItem", data); }; //@[OUTER] PKD_EPManager.PlaceOuterItemFromServer = function(data) { var e; if (data == null) { return; } try { if (data.actorId === ANGameManager.myActorId()) { return; } return PKD_EPManager.PlaceOuterItem(data); } catch (error) { e = error; return KDCore.warning(e); } }; //@[OUTER] PKD_EPManager.RemoveOuterItemFromServer = function(data) { var e; if (data == null) { return; } try { if (data.actorId === ANGameManager.myActorId()) { return; } return PKD_EPManager.RemoveOuterItem(data); } catch (error) { e = error; return KDCore.warning(e); } }; // * Расширение методов // * ------------------------------------------- PKD_EasyPlacement.applyNETZPatch = function() { var __aliasFixNET06, _alias_nAPI_onCustomCommand_PE4444; __aliasFixNET06 = ANMapManager.sendEventMove; ANMapManager.sendEventMove = function(eventId) { var event; event = $gameMap.event(eventId); if (event == null) { return; } __aliasFixNET06.call(this, eventId); }; _alias_nAPI_onCustomCommand_PE4444 = nAPI.onCustomCommand; nAPI.onCustomCommand = function(name, data) { _alias_nAPI_onCustomCommand_PE4444.call(this, ...arguments); if (name === "pkdPE:PlaceOuterItem") { return PKD_EPManager.PlaceOuterItemFromServer(data); } else if (name === "pkdPE:RemoveOuterItem") { return PKD_EPManager.RemoveOuterItemFromServer(data); } }; }; })(); // Generated by CoffeeScript 2.5.1 (function() { // * Создать (поместить) событие на карте (если карта таже) и зарегестрировать PKD_EPManager._SpawnEventOuter = function(eventData) { var e, eventId, mapId, marginY, pItemIndex, spawnedEvent, spawnedEventId, x, y; try { ({mapId, x, y, pItemIndex, eventId, spawnedEventId, marginY} = eventData); $gameTemp._requireNetEventsRefresh = false; $gameSystem.pSaveEPMargins(mapId, spawnedEventId, 0, marginY); if ($gameMap.mapId() === mapId) { if (KDCore.Utils.isSceneMap()) { spawnedEvent = this.Scene().pSpawnEPEvent(eventId, x, y, spawnedEventId); this.CallPlacementAnimation(spawnedEvent, pItemIndex); PKD_EPManager.RestoreMargins(); } else { $gameTemp._requireNetEventsRefresh = true; } } return this._RegisterOuterItem(eventData); } catch (error) { e = error; return KDCore.warning(e); } }; // * Сохранить состояние помещённого от другого игрока события // * Альтернатива PlaceItemOn PKD_EPManager._RegisterOuterItem = function(eventData) { var eventId, mapId, pItemIndex, registred, spawnedEventId, uniqueId, x, y; ({mapId, x, y, pItemIndex, eventId, uniqueId, spawnedEventId} = eventData); registred = $gameSystem.pRegisterEPItem(mapId, pItemIndex, x, y, spawnedEventId); registred.push(uniqueId); this.ActivatePlacedItem(mapId, pItemIndex, spawnedEventId); }; // * Удалить внешнее (от другого игрока) событие // * Аналог PickUpPlacedItemByEvent // * Общее событие тут не вызывается, только у того кто устанавливает PKD_EPManager.RemoveOuterItem = function({mapId, spawnedEventId, uniqueId}) { var e; try { //"REMOVE OUTER ITEM START".p() if ($gameMap.mapId() === mapId) { if (KDCore.Utils.isSceneMap()) { //"ON SCENE MAP - YES".p() // * Поиск по уникальному ID для надёжности //eventId = @FindSpawnedEventId(mapId, uniqueId) //"SPAWNED EVENT ID _ YES".p() if eventId > 0 // * Но может и не найти //spawnedEventId = eventId if eventId > 0 this.Scene().pUnSpawnEPEvent(spawnedEventId); } else { //"UNSPAWN _ GOOD".p() $gameTemp._requireNetEventsRefresh = true; if ($gameTemp._peNetEventsToRemove == null) { $gameTemp._peNetEventsToRemove = [spawnedEventId]; } else { $gameTemp._peNetEventsToRemove.push(spawnedEventId); } } } $gameSystem.pRemoveEPItem(mapId, spawnedEventId); //"GAME SYSTEM REMOVED".p() return PKD_EPManager.ClearSelfSwitches(mapId, spawnedEventId); } catch (error) { //"SWITCHES CLEARED".p() e = error; return KDCore.warning(e); } }; })(); // Generated by CoffeeScript 2.6.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ SCRIPT CALLS.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { window.PE_Place = function(pItemId, removeItemId) { var e; try { if (pItemId >= 0) { return PKD_EPManager.Start(pItemId, removeItemId); } } catch (error) { e = error; return console.warn(e); } }; window.PE_PickUpByItem = function(pItemId, gItemId) { var e; try { if (pItemId >= 0) { return PKD_EPManager.PickUpPlacedItem(pItemId, gItemId); } } catch (error) { e = error; return console.warn(e); } }; window.PE_PickUpByEvent = function(eventId, gItemId) { var e; try { if (eventId <= 0) { eventId = $gameMap._interpreter.eventId(); } if (eventId <= 0) { return; } return PKD_EPManager.PickUpPlacedItemByEvent(eventId, gItemId); } catch (error) { e = error; return console.warn(e); } }; window.PE_LastEventId = function() { var e; try { return $gameTemp.peLastEventId; } catch (error) { e = error; return console.warn(e); } }; window.PE_LastEventRegion = function() { var e, event, x, y; try { event = PE_LastEvent(); if (event == null) { return -1; } ({x, y} = event); return $gameMap.regionId(x, y); } catch (error) { e = error; return console.warn(e); } }; window.PE_LastEventTerrain = function() { var e, event, x, y; try { event = PE_LastEvent(); if (event == null) { return -1; } ({x, y} = event); return $gameMap.terrainTag(x, y); } catch (error) { e = error; return console.warn(e); } }; window.PE_LastEvent = function() { var e, id; try { id = PE_LastEventId(); if ((id != null) && id >= 1) { return $gameMap.event(id); } } catch (error) { e = error; console.warn(e); } return null; }; window.PE_ForceStopTimer = function(eventId, mapId) { var e; try { if (mapId == null) { mapId = $gameMap.mapId(); } $gameMap.peForceStopTimer(eventId, mapId); } catch (error) { e = error; return console.warn(e); } }; window.PE_ForceCompleteTimer = function(eventId, mapId) { var e; try { if (mapId == null) { mapId = $gameMap.mapId(); } if ($gameMap.mapId() === mapId) { $gameMap.peExecuteEventTimerAction(eventId); } else { $gameMap.peRegisterPostTimerAction(eventId, mapId); } $gameMap.peForceStopTimer(eventId, mapId); } catch (error) { e = error; return console.warn(e); } }; })(); // ■ END SCRIPT CALLS.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_CharacterBase.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var _; //@[DEFINES] _ = Game_CharacterBase.prototype; // * DUMMY _.pGetEPDynamicObjId = function() { return -1; }; // * DUMMY _.epIsDraggable = function() { return false; }; })(); // ■ END Game_CharacterBase.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.6.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_Event.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__list, _; //@[DEFINES] _ = Game_Event.prototype; //@[ALIAS] ALIAS__list = _.list; _.list = function() { var e, t; try { // * Вызов общего события, которое было bind к этому событию if (this._peExtraEventList != null) { t = this._peExtraEventList; // * Один раз, поэтому зануляем this._peExtraEventList = null; return [ { // * Команда "Вызов Общего события" внутри этого события // * (Так можно использовать this. и есть _eventId) code: 117, indent: 0, parameters: [t] } ]; } } catch (error) { e = error; console.warn(e); } return ALIAS__list.call(this, ...arguments); }; // * Запускает общее события внутри данного события (т.е. внутри себя вызов общего) _.peStartCommonEventLocal = function(ceId) { var commonEvent, e; try { this._peExtraEventList = null; if (ceId <= 0) { return; } commonEvent = $dataCommonEvents[ceId]; if (commonEvent == null) { return; } this._peExtraEventList = ceId; // * Переключаем напрямую, без метода start(), так как не нужен Lock this._starting = true; } catch (error) { e = error; console.warn(e); } }; })(); // ■ END Game_Event.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.6.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_Event.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__clearPageSettings, ALIAS__setupPageSettings, _; //@[DEFINES] _ = Game_Event.prototype; //@[ALIAS] ALIAS__setupPageSettings = _.setupPageSettings; _.setupPageSettings = function() { var e; ALIAS__setupPageSettings.call(this); try { // * В версии 1.3. в сетевой игре Draggable отключён (временно) if (PKD_EasyPlacement.PARAMS.ALLOW_DRAG === true && !PKD_PocketEvents.IsNetworkGame()) { this._epDragDataId = PKD_EPManager.ExtractDraggableEventComment(this.list()); this._epIsDraggableEvent = (this._epDragDataId != null) && this._epDragDataId > 0; if (this._epIsDraggableEvent === true) { return this.epSetupDragEvent(); } } else { return this._epIsDraggableEvent = false; } } catch (error) { e = error; this._epIsDraggableEvent = false; return console.warn(e); } }; //@[ALIAS] ALIAS__clearPageSettings = _.clearPageSettings; _.clearPageSettings = function() { ALIAS__clearPageSettings.call(this); return this._epIsDraggableEvent = false; }; // * Прочие настройки перемещения из параметров плагина _.epSetupDragEvent = function() { var e; try { this._epDragData = PKD_EasyPlacement.PARAMS.DRAG_ITEMS[this._epDragDataId]; this._epIsDraggableEvent = this._epDragData != null; } catch (error) { e = error; console.warn(e); } }; _.epIsDraggable = function() { return this._epIsDraggableEvent === true; }; // * Параметры перемещения (сетка, регион, смена картинки, перемещение на другие события) _.epGetDragSettings = function() { return {}; }; // * Когда игрок начал двигать событие _.pOnDragStart = function() { var e; $gameTemp.peLastEventId = -1; $gameTemp._epSpawnModeOverEvents = this._epDragData.canSpawnOverEvents === true; PKD_EPManager.SetGridVisibility(this._epDragData.gridVisiblity); // * В сетевой игре пауза игры недоступна $gameTemp.pPauseMap = this._epDragData.isShouldPauseMap && !PKD_PocketEvents.IsNetworkGame(); this._opacity = 200; if (this._epDragData.ceDragStart > 0 && !$gameTemp.pPauseMap) { this.peStartCommonEventLocal(this._epDragData.ceDragStart); } try { //dragStartCE = @_epDragData.ceDragStart //setTimeout (-> // $gameTemp.reserveCommonEvent dragStartCE // ), 10 if (this._epDragData.image == null) { return; } this._pStoredImageData = {}; this._pStoredImageData.characterIndex = this._characterIndex; this._pStoredImageData.characterName = this._characterName; this.pOnDragImageChange(this._epDragData.image); } catch (error) { e = error; console.warn(e); } }; _.pOnDragImageChange = function(imageData) { if (imageData == null) { return; } if (imageData.characterName == null) { return; } if (imageData.characterName === "") { return; } return this.setImage(imageData.characterName, imageData.characterIndex); }; // * Когда игрок отпустил мышку (закончить перемещение) _.pOnDragEnd = function() { var x, y; $gameTemp.peLastEventId = this.eventId(); PKD_EPManager.SetGridVisibility(false); this._opacity = 255; this.pOnDragImageChange(this._pStoredImageData); this._pStoredImageData = null; if (PKD_EPManager.IsPointIsGoodForDrag()) { ({x, y} = TouchInput.mapPoint()); this.locate(x, y); $gameSystem.pSaveDraggableEventPosition(this.eventId(), this.x, this.y); if (this._epDragData.ceSpawnGood > 0) { //$gameTemp.reserveCommonEvent @_epDragData.ceSpawnGood this.peStartCommonEventLocal(this._epDragData.ceSpawnGood); } } else { /*if @_epDragData.selfSwitchOn? try key = [$gameMap.mapId(), @eventId(), @_epDragData.selfSwitchOn] setTimeout (-> $gameSelfSwitches.setValue(key, true) ), 10 catch e console.warn e*/ SoundManager.playBuzzer(); // * just return to own place if (this._epDragData.ceDradBad > 0) { this.peStartCommonEventLocal(this._epDragData.ceDradBad); } } $gameTemp._epSpawnModeOverEvents = false; }; _.pOnDragCheckRegion = function(x, y) { var region; region = $gameMap.regionId(x, y); if (this._epDragData.onlyRegions.length > 0) { if (!this._epDragData.onlyRegions.contains(region)) { return false; } } else if (this._epDragData.exceptRegions.length > 0) { if (this._epDragData.exceptRegions.contains(region)) { return false; } } return true; }; _.pOnDragCheckTerrainTag = function(x, y) { var terrain; terrain = $gameMap.terrainTag(x, y); if (this._epDragData.onlyTT.length > 0) { if (!this._epDragData.onlyTT.contains(terrain)) { return false; } } else if (this._epDragData.exceptTT.length > 0) { if (this._epDragData.exceptTT.contains(terrain)) { return false; } } return true; }; _.pIsFacingPlayer = function() { var dir, x, y; ({x, y} = $gamePlayer); dir = $gamePlayer.direction(); switch (dir) { case 8: y -= 1; break; case 6: x += 1; break; case 4: x -= 1; break; default: y += 1; } return this.pos(x, y); }; _.setEPMargins = function(epMX, epMY) { this.epMX = epMX; this.epMY = epMY; }; // * X пока не учитывается _.pOnMargin = function(x, y) { var _prevMY, itemSettings, step; itemSettings = PKD_EPManager.CurrentPlacementItemData(); if (itemSettings == null) { return; } if (!itemSettings.allowMargin) { return; } if (this.epMY == null) { this.epMY = 0; } step = itemSettings.marginStep; _prevMY = this.epMY; this.epMY += y * step; if (this.epMY <= itemSettings.marginMin || this.epMY >= itemSettings.marginMax) { this.epMY = _prevMY; } else { $gameSystem.pSaveEPMargins($gameMap.mapId(), this.eventId(), 0, this.epMY); } }; })(); // ■ END Game_Event.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.6.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_Map.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__update, _; //@[DEFINES] _ = Game_Map.prototype; //@[ALIAS] ALIAS__update = _.update; _.update = function(sceneActive) { ALIAS__update.call(this, ...arguments); if (sceneActive) { this.peUpdateTimers(); } }; _.peInitTimers = function() { if (this._peTimers != null) { return; } this._peTimers = {}; this._peToExecuteActions = {}; }; _.peCheckCompleteTimers = function() { var e, eventId, i, len, timersSet; this.peInitTimers(); try { timersSet = this._peToExecuteActions[this.mapId()]; if (timersSet != null) { for (i = 0, len = timersSet.length; i < len; i++) { eventId = timersSet[i]; this.peExecuteEventTimerAction(eventId); this._peToExecuteActions[this.mapId()].delete(eventId); } } } catch (error) { e = error; console.warn(e); } }; _.peAddTimer = function(timerData, eventId) { var e, id; if (timerData == null) { return; } if (!(timerData.time > 0)) { return; } this.peInitTimers(); try { if (timerData.isLocal === true) { id = this.mapId(); } else { id = 0; // * Global } if (this._peTimers[id] == null) { this._peTimers[id] = []; } return this._peTimers[id].push([timerData.time, eventId, this.mapId()]); } catch (error) { e = error; return console.warn(e(e)); } }; _.peUpdateTimers = function() { var i, j, key, len, len1, mapId, ref, ref1, t; if (this._peTimers == null) { return; } mapId = this.mapId(); ref = Object.keys(this._peTimers); for (i = 0, len = ref.length; i < len; i++) { key = ref[i]; if (key !== "0") { if (parseInt(key) !== mapId) { continue; } } ref1 = this._peTimers[key]; for (j = 0, len1 = ref1.length; j < len1; j++) { t = ref1[j]; if (t[0] > 0) { t[0] -= 0.016; if (t[0] <= 0) { this.peCompleteTimer(key, t); } } } } }; _.peCompleteTimer = function(id, timerState) { var e; try { this.peInitTimers(); if (this._peTimers[id] != null) { this._peTimers[id].delete(timerState); } if (this.mapId() === timerState[2]) { this.peExecuteEventTimerAction(timerState[1]); } else { this.peRegisterPostTimerAction(timerState[1], timerState[2]); } } catch (error) { e = error; console.warn(e); } }; _.peExecuteEventTimerAction = function(eventId) { var e, event; try { event = this.event(eventId); if ((event != null) && event instanceof Game_EPEvent) { return event.epDoneTimer(); } } catch (error) { e = error; return console.warn(e); } }; _.peRegisterPostTimerAction = function(eventId, mapId) { if (this._peToExecuteActions[mapId] == null) { this._peToExecuteActions[mapId] = []; } this._peToExecuteActions[mapId].push(eventId); }; // * Данный метод используется только для Script Call PE_ForceStopTimer _.peForceStopTimer = function(eventId, mapId) { var e, i, j, key, len, len1, ref, ref1, t, timerToStop; try { this.peInitTimers(); timerToStop = null; if (mapId == null) { mapId = this.mapId(); } ref = Object.keys(this._peTimers); for (i = 0, len = ref.length; i < len; i++) { key = ref[i]; ref1 = this._peTimers[key]; for (j = 0, len1 = ref1.length; j < len1; j++) { t = ref1[j]; if (t[1] === eventId && t[2] === mapId) { timerToStop = [key, t]; break; } } } if (timerToStop != null) { return this._peTimers[timerToStop[0]].delete(timerToStop[1]); } } catch (error) { e = error; return console.warn(e); } }; })(); // ■ END Game_Map.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_Map.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__setup, ALIAS__update, _; //@[DEFINES] _ = Game_Map.prototype; //@[ALIAS] ALIAS__setup = _.setup; _.setup = function(mapId) { ALIAS__setup.call(this, mapId); return PKD_EPManager.OnNextMapLoaded(); }; _.pGetDraggableEventInTouchPoint = function() { var events, x, y; events = this.pGetAllDraggableEvents(); if (events.length > 0) { ({x, y} = TouchInput.mapPoint()); return events.find(function(e) { return e.pos(x, y); }); } //return @eventsXy(x, y).find (e) -> e.epIsDraggable() return null; }; _.pGetAllDraggableEvents = function() { return this.events().filter(function(e) { return e.epIsDraggable(); }); }; //@[ALIAS] ALIAS__update = _.update; _.update = function(sceneActive) { if ((PKD_EPManager.IsEventDragStart() || PKD_EPManager.IsActive()) && $gameTemp.pPauseMap === true) { } else { return ALIAS__update.call(this, sceneActive); } }; })(); // ■ END Game_Map.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_Player.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__canMove, _; //@[DEFINES] _ = Game_Player.prototype; //@[ALIAS] ALIAS__canMove = _.canMove; _.canMove = function() { if (PKD_EasyPlacement.PARAMS.ALLOW_ARROW_MOVE === true && PKD_EPManager.IsActive()) { return false; } else if (PKD_EPManager.IsEventDragStart()) { return false; } else { return ALIAS__canMove.call(this, ...arguments); } }; })(); // ■ END Game_Player.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Game_System.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__initialize, _; //@[DEFINES] _ = Game_System.prototype; //@[ALIAS] ALIAS__initialize = _.initialize; _.initialize = function() { ALIAS__initialize.call(this); this.pGetEPDB(); // * Pocket Events storage this.pGetEPDB2(); // * Draggable positions return this.pGetEPDB3(); // * Смещение }; _.pGetEPDB = function() { if (this.pEPDB == null) { this.pEPDB = {}; } return this.pEPDB; }; _.pGetEPDB2 = function() { if (this.pEPDB2 == null) { this.pEPDB2 = {}; } return this.pEPDB2; }; _.pGetEPDB3 = function() { if (this.pEPDB3 == null) { this.pEPDB3 = {}; } return this.pEPDB3; }; _.pRegisterEPItem = function(mapId, itemId, x, y, eventId) { var db; // * Регестрирует созданный db = this.pGetEPDB(); if (db[mapId] == null) { db[mapId] = []; } db[mapId].push([itemId, x, y, eventId]); //"REGISTER".p(itemId) return db[mapId].last(); }; _.pRemoveEPItem = function(mapId, eventId) { var db, i, item, itemToDelete, len, ref; // * Удаляет созданные db = this.pGetEPDB(); if (db[mapId] == null) { return; } itemToDelete = null; ref = db[mapId]; for (i = 0, len = ref.length; i < len; i++) { item = ref[i]; //if item[1] is x && item[2] is y // itemToDelete = item if (item[3] === eventId) { itemToDelete = item; } } if (itemToDelete == null) { return; } db[mapId].delete(itemToDelete); this.pRemoveEPMargins(mapId, eventId); }; _.pSaveDraggableEventPosition = function(eventId, x, y) { var db, mapId; // * Сохраняет позицию db = this.pGetEPDB2(); mapId = $gameMap.mapId(); if (db[mapId] == null) { db[mapId] = []; } db[mapId].push([eventId, x, y]); }; _.pRestoreDraggableEventsPositions = function() { var db, i, len, mapId, position, ref; // * Возвращает позицию db = this.pGetEPDB2(); mapId = $gameMap.mapId(); if (db[mapId] == null) { return; } ref = db[mapId]; for (i = 0, len = ref.length; i < len; i++) { position = ref[i]; if (position == null) { continue; } $gameMap.event(position[0]).setPosition(position[1], position[2]); } }; _.pSaveEPMargins = function(mapId, eventId, x, y) { var db; db = this.pGetEPDB3(); if (db[mapId] == null) { db[mapId] = []; } db[mapId].push([eventId, x, y]); }; _.pRemoveEPMargins = function(mapId, eventId) { var db, eventToDelete; db = this.pGetEPDB3(); if (db[mapId] == null) { return; } eventToDelete = db[mapId].find(function(item) { return item[3] === eventId; }); if (eventToDelete == null) { return; } db[mapId].delete(eventToDelete); }; _.pRestoreEPMargins = function() { var db, event, i, len, mapId, margin, ref; db = this.pGetEPDB3(); mapId = $gameMap.mapId(); if (db[mapId] == null) { return null; } ref = db[mapId]; for (i = 0, len = ref.length; i < len; i++) { margin = ref[i]; if (margin == null) { continue; } event = $gameMap.event(margin[0]); if (event == null) { continue; } event.setEPMargins(margin[1], margin[2]); } }; })(); // ■ END Game_System.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.6.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Scene_Map.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__isMenuEnabled, ALIAS__onMapLoaded, ALIAS__processMapTouch, ALIAS__update, ALIAS__updateDestination, _; //@[DEFINES] _ = Scene_Map.prototype; // * evId - event to spawn and move _.pActivateEPMode = function(evId) { this._pInEPMode = true; this._pIsSetupOk = false; // * User place Event? $gameTemp._epSpawned = this.pSpawnEPEvent(evId, 0, 0, $gameMap._events.length); }; _.pEndEPMode = function() { if (this._pIsSetupOk === false) { PKD_EPManager.CallCancelCommonEvent(); this.pUnSpawnEPEvent($gameTemp._epSpawned._eventId); } $gameTemp._epSpawned = null; return this._pInEPMode = false; }; _.pIsEPMode = function() { return this._pInEPMode === true; }; _.pSpawnEPEvent = function(evId, x, y, newEvId) { var ev, ref; if (newEvId == null) { newEvId = $gameMap._events.length; } ev = new Game_EPEvent(evId, newEvId, $gameTemp._epPlacementItemId); $gameMap._events[newEvId] = ev; if (Imported.VisuMZ_1_EventsMoveCore === true) { if ((ref = $gameMap._eventCache) != null) { ref.push(ev); } } this._spriteset.pAddNewPlacementEvent(ev._eventId); ev.setPosition(x, y); return ev; }; _.pUnSpawnEPEvent = function(evId) { var event, ref; event = $gameMap.event(evId); if (event == null) { return; } this._spriteset.pRemovePlacementEvent(evId); PKD_EPManager.ClearSelfSwitches($gameMap.mapId(), evId); $gameMap._events[evId] = null; if (Imported.VisuMZ_1_EventsMoveCore === true) { if ((ref = $gameMap._eventCache) != null) { ref.delete(event); } } $gameMap.requestRefresh(); }; //@[ALIAS] ALIAS__onMapLoaded = _.onMapLoaded; _.onMapLoaded = function() { ALIAS__onMapLoaded.call(this); // * Если были созданы события, пока игрок был на другой сцене (меню) if (PKD_PocketEvents.IsNetworkGame()) { PKD_EPManager.OnMapLoadedFromMenu(); } PKD_EPManager.OnMapLoaded(); }; //@[ALIAS] ALIAS__updateDestination = _.updateDestination; _.updateDestination = function() { if (this.pIsEPMode()) { if (!$gamePlayer.isMoving()) { $gamePlayer.turnTowardCharacter(TouchInput.mapPoint()); } } else { return ALIAS__updateDestination.call(this); } }; //@[ALIAS] ALIAS__isMenuEnabled = _.isMenuEnabled; _.isMenuEnabled = function() { if (this.pIsEPMode() || PKD_EPManager.IsEventDragStart()) { return false; } else { return ALIAS__isMenuEnabled.call(this); } }; //@[ALIAS] ALIAS__update = _.update; _.update = function() { ALIAS__update.call(this); if (this.pIsEPMode()) { this.pUpdateEPArrowMove(); this.pUpdateEPCommon(); this.pUpdateMarginsScroll(); } else { if (PKD_EPManager.IsEventDragStart()) { this.pCheckDragStop(); } } }; //@[ALIAS] ALIAS__processMapTouch = _.processMapTouch; _.processMapTouch = function() { if (this.pIsEPMode()) { // * В режиме placement нельзя draggable events movement! return ALIAS__processMapTouch.call(this); } else { this.pProcessMapEventDragging(); if (!PKD_EPManager.IsEventDragStart()) { return ALIAS__processMapTouch.call(this); } } }; //?DYNAMIC _.pProcessMapEventDragging = function() { var draggable; if ($gameMessage.isBusy()) { return; } draggable = PKD_EPManager.GetDraggableEventUnderMouse(); if (draggable == null) { return; } if (draggable.pIsFacingPlayer()) { if (TouchInput.isLongPressed()) { this.pCheckDraggableEventUnderMouse(); } } else { if (TouchInput.isPressed()) { this.pCheckDraggableEventUnderMouse(); } } }; _.pCheckDraggableEventUnderMouse = function() { if (!PKD_EPManager.IsEventDragStart()) { PKD_EPManager.StartEventDrag(); // * Может не выполниться, если нет под курсором события } }; _.pCheckDragStop = function() { if (TouchInput.isReleased()) { PKD_EPManager.OnEventDragEnd(); } }; _.pGetDraggableEventInTouchPoint = function() { return this._spriteset.pGetDraggableEventInTouchPoint(); }; _.pOnDragStart = function() { if ($gameTemp.pLastDraggableEvent == null) { return; } $gameTemp.clearDestination(); this._spriteset.pSetDraggableEventState($gameTemp.pLastDraggableEvent, true); $gameTemp.pLastDraggableEvent.pOnDragStart(); }; _.pOnDragEnd = function() { if ($gameTemp.pLastDraggableEvent == null) { return; } $gameTemp.pLastDraggableEvent.pOnDragEnd(); this._spriteset.pSetDraggableEventState($gameTemp.pLastDraggableEvent, false); }; _.pUpdateEPCommon = function() { var x, y; if (this.isMenuCalled()) { return PKD_EPManager.Stop(); } else { if (!this.__pLTIX || (this.__pLTIX !== TouchInput.x || this.__pLTIY !== TouchInput.y)) { ({x, y} = TouchInput.mapPoint()); $gameTemp._epSpawned.setPosition(x, y); this.__pLTIX = null; // * Достаточно сбросить X } else { } // * NO MOVING BY MOUSE (arrow key moving before) if (TouchInput.isTriggered() || Input.isTriggered('ok')) { if (PKD_EPManager.IsPointIsGood()) { this.pPlaceEPItemOnSpot(x, y); return PKD_EPManager.Stop(); } else { return SoundManager.playBuzzer(); } } } }; _.pUpdateMarginsScroll = function() { var threshold; threshold = 20; if (TouchInput.wheelY >= threshold) { $gameTemp._epSpawned.pOnMargin(0, -1); } else if (TouchInput.wheelY <= -threshold) { $gameTemp._epSpawned.pOnMargin(0, +1); } }; _.pUpdateEPArrowMove = function() { if (!PKD_EasyPlacement.PARAMS.ALLOW_ARROW_MOVE) { return; } if ($gameTemp._epSpawned == null) { return; } if (Input.isRepeated('left')) { this.pMoveSpawnedByArrowKey(-1, 0); } if (Input.isRepeated('right')) { this.pMoveSpawnedByArrowKey(1, 0); } if (Input.isRepeated('down')) { this.pMoveSpawnedByArrowKey(0, 1); } if (Input.isRepeated('up')) { this.pMoveSpawnedByArrowKey(0, -1); } }; _.pSetMouseLockWhenArrowMove = function() { var x, y; ({x, y} = TouchInput); this.__pLTIX = x; return this.__pLTIY = y; }; _.pMoveSpawnedByArrowKey = function(dx, dy) { var x, y; this.pSetMouseLockWhenArrowMove(); ({x, y} = $gameTemp._epSpawned); $gameTemp._epSpawned.setPosition(x + dx, y + dy); }; _.pPlaceEPItemOnSpot = function(x, y) { PKD_EPManager.PlaceItemOn(x, y); return this._pIsSetupOk = true; }; })(); // ■ END Scene_Map.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Sprite_Character.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__initMembers, ALIAS__updatePosition, _; //@[DEFINES] _ = Sprite_Character.prototype; //@[ALIAS] ALIAS__initMembers = _.initMembers; _.initMembers = function() { ALIAS__initMembers.call(this); return this.p_dragMode = false; }; _.pSetDragMode = function(p_dragMode) { this.p_dragMode = p_dragMode; }; //@[ALIAS] ALIAS__updatePosition = _.updatePosition; _.updatePosition = function() { if (this.p_dragMode === true) { this.x = TouchInput.x; this.y = TouchInput.y; this.z = this._character.screenZ(); } else { ALIAS__updatePosition.call(this); } // * Смещение по Y, по X не учитываем пока что if (this._character.epMY != null) { this.y += this._character.epMY; } }; })(); // ■ END Sprite_Character.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.5.1 //╒═════════════════════════════════════════════════════════════════════════╛ // ■ Spriteset_Map.coffee //╒═════════════════════════════════════════════════════════════════════════╛ //--------------------------------------------------------------------------- (function() { var ALIAS__createTilemap, ALIAS__update, _; //@[DEFINES] _ = Spriteset_Map.prototype; //@[ALIAS] ALIAS__createTilemap = _.createTilemap; _.createTilemap = function() { ALIAS__createTilemap.call(this); return this.pCreateEPGrid(); }; //@[ALIAS] ALIAS__update = _.update; _.update = function() { ALIAS__update.call(this); return this.pUpdateEPGridLayer(); }; _.pCreateEPGrid = function() { var bitmap; this._pEPGridLayer = new Sprite(); this._pEPGridLayer.opacity = 50; bitmap = new Bitmap($gameMap.width() * $gameMap.tileWidth(), $gameMap.height() * $gameMap.tileHeight()); this._pEPGridLayer.bitmap = bitmap; bitmap.addLoadListener(this.pDrawEPGrid.bind(this)); this._pEPGridLayer.z = 1; this._tilemap.addChild(this._pEPGridLayer); return this.pCreateEPHoverCell(); }; _.pCreateEPHoverCell = function() { this._pEPCell = new PKD_EasyPlacement.LIBS.Sprite_GridCell(); return this._tilemap.addChild(this._pEPCell); }; _.pDrawEPGrid = function() { var drawLineHor, drawLineVert, i, j, k, l, ref, ref1, results; drawLineVert = function(b, i) { return b.fillRect(0, i * $gameMap.tileWidth(), b.width, 1, 'rgba(0, 0, 0, 1)'); }; drawLineHor = function(b, i) { return b.fillRect(i * $gameMap.tileHeight(), 0, 1, b.height, 'rgba(0, 0, 0, 1)'); }; for (i = k = 0, ref = $gameMap.height(); (0 <= ref ? k < ref : k > ref); i = 0 <= ref ? ++k : --k) { drawLineVert(this._pEPGridLayer.bitmap, i); } results = []; for (j = l = 0, ref1 = $gameMap.width(); (0 <= ref1 ? l < ref1 : l > ref1); j = 0 <= ref1 ? ++l : --l) { results.push(drawLineHor(this._pEPGridLayer.bitmap, j)); } return results; }; _.pUpdateEPGridLayer = function() { var screenTouchPoint, screenX, screenY, th, tw, tw2; this._pEPGridLayer.visible = PKD_EPManager.IsGridVisible(); this._pEPCell.visible = PKD_EPManager.IsGridVisible(); if (!this._pEPGridLayer.visible) { return; } if (this._pEPGridLayer == null) { return; } tw = $gameMap.tileWidth(); tw2 = tw / 2; th = $gameMap.tileHeight(); screenX = Math.round($gameMap.adjustX(-0.5) * tw + tw2); screenY = Math.round($gameMap.adjustY(-1) * th + th); this._pEPGridLayer.move(screenX, screenY); // * Так как добавлена возможность двигать стрелами, то берём координаты $gameTemp._epSpawned if (PKD_EPManager.IsActive()) { screenTouchPoint = $gameTemp._epSpawned; if (screenTouchPoint == null) { return; } this._pEPCell.move(screenTouchPoint.screenX(), screenTouchPoint.screenY()); } else { screenTouchPoint = TouchInput.mapScreenPoint(); this._pEPCell.move(screenTouchPoint.x, screenTouchPoint.y); } }; _.pAddNewPlacementEvent = function(id) { var event, spr; event = $gameMap._events[id]; spr = new Sprite_Character(event); this._characterSprites.push(spr); this._tilemap.addChild(spr); spr.update(); }; _.pRemovePlacementEvent = function(id) { var spr; spr = this._characterSprites.find(function(i) { return (i._character != null) && i._character.pGetEPDynamicObjId() >= 0 && i._character._eventId === id; }); if (spr == null) { return; } spr.visible = false; this._characterSprites.delete(spr); //for animSpr in spr._animationSprites // @_tilemap.removeChild animSpr this._tilemap.removeChild(spr); }; _.pGetDraggableEventInTouchPoint = function() { var events, k, len, s, sprites; events = $gameMap.pGetAllDraggableEvents(); if (events.length > 0) { sprites = events.map((e) => { return this.findTargetSprite(e); }); for (k = 0, len = sprites.length; k < len; k++) { s = sprites[k]; if (this.pTouchInEvDragRect(s)) { return s._character; } } } return null; }; _.pTouchInEvDragRect = function(item) { var bRealX, bRealY, x, y; ({x, y} = TouchInput); bRealX = item.x - item._frame.width / 2; bRealY = item.y - item._frame.height; return x >= bRealX && y >= bRealY && x < bRealX + item.width && y < item.height + bRealY; }; _.pSetDraggableEventState = function(event, state) { var sprite; sprite = this.findTargetSprite(event); sprite.pSetDragMode(state); }; })(); // ■ END Spriteset_Map.coffee //--------------------------------------------------------------------------- // Generated by CoffeeScript 2.6.1 PKD_EPManager.CreateEPEventsOnMap = function() { var db, ev, i, item, itemData, len, mapId, ref; db = $gameSystem.pGetEPDB(); mapId = $gameMap.mapId(); if (!db[mapId]) { return; } ref = db[mapId]; for (i = 0, len = ref.length; i < len; i++) { item = ref[i]; itemData = this.ItemData(item[0]); ev = this.Scene().pSpawnEPEvent(itemData.eventId, item[1], item[2], item[3]); } }; PKD_EPManager.Start = function(pItemIndex, gItemId = 0) { var item; //"START".p(pItemIndex) if (pItemIndex == null) { return; } if (pItemIndex < 0) { return; } item = this.ItemData(pItemIndex); if (item == null) { return; } if (item.eventId <= 0) { return; } this.RegisterPlacementItem(pItemIndex, gItemId); $gameTemp._epSpawnModeOverEvents = item.canSpawnOverEvents === true; // * В сетевой игре пауза игры недоступна $gameTemp.pPauseMap = item.isShouldPauseMap === true && !PKD_PocketEvents.IsNetworkGame(); this.Scene().pActivateEPMode(item.eventId); this.SetGridVisibility(item.gridVisiblity); this.isActive = true; $gameTemp.peLastEventId = -1; }; PKD_EPManager.ExtractDraggableEventComment = function(list) { var comment, data, e; if (list == null) { return null; } try { comment = KDCoreMini.Utils.getEventCommentValue('draggable', list); if (comment != null) { data = parseInt(comment.split(':')[1]); return data; } } catch (error) { e = error; console.warn(e); return null; } return null; }; PKD_EPManager.RestoreMargins = function() { $gameSystem.pRestoreEPMargins(); }; //Plugin PKD_PocketEvents builded by PKD PluginBuilder 2.1 - 07.06.2022