Войти на сайт
×
ТЕМА: Утилиты разработчика
Утилиты разработчика 4 года 9 мес. назад #115845
|
Информация:
Название: AScripts Автор: Alexandr_7 Тип: утилита Версия: 1.3 Версия RPG maker: MV Дата выхода: 2020 Условия использования/лицензия: Вы можете: -Бесплатно использовать данный плагин в некоммерческих и коммерческих проектах -Переводить на другие языки или полностью поменять текст плагина (сообщите мне, если Вы это сделали) -Изменять код плагина, но Вы обязаны указать ссылку на оригинальный плагин Вы не можете: -Убирать или изменять любую информацию о плагине (Название, авторство, контактная информация, версия и дата релиза) Исключением является вот эти вот поля: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] SPProject.authorGame = "Движок: RPG Maker MV (JS, HTML5)!\nРазработчик: Alexandr_7!\nПомощь в создании графики: Sando\nСоздания диалогов: Plagiumll!"; SPProject.gameName = "Снежная царевна. Другая история (Demo)."; SPProject.gameVersion = "Альфа 4"; SPProject.gameNameVersion = SPProject.gameName + " Версия: " + SPProject.gameVersion; SPProject.versionPlugin = "1.0"; Описание: Данный плагин создаю исключительно для своего проекта. В нем функционал который может быть полезен для разработчиков. Так например это скрипт переключения локальных переключателей. Скрипт для получения рандомного числа (Ибо в MV данный функционал багнутый) Скрипт для броска монетки так сказать. Вернет рандомно true или false Скрипт для получения массива с рандомными числами но на 1 меньше. Это иногда полезно если вы хотите заполнить все клетки кроме одной. Скрипты для Крестиков Ноликов. (Описание их работы также присутствует) Но рано радуетесь. Чтоб использовать плагин вам нужны хотябы минимальные знания JS так как всеже это скрипты и работать будет в скриптах. Не знаю зачем выкладываю но пускай будет. Установка: Справка: скопировать код в блокнот, назвать AL7_SnowPrincessPlugin.js Скачать: (нет) Демо: (нет) Зависимости: (нет) Дополнительно: Требуемая версия движка: 1.5.0 и выше (Тестировано только на 1.6.2 но проблем с версией 1.5.0 быть не должно) Требуемый язык: Только Русский Требуемые знания: Основы Java Script Код: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] //=============================================================================
// AL7_SnowPrincessPlugin.js
//=============================================================================
/*:ru
* @plugindesc AL7_SnowPrincessPlugin v1.3 Плагин для игры Snow_Princess
* @author Alexandr_7
* @help
### Информация о плагине ###
Название: AL7_SnowPrincessPlugin
Автор: Alexandr_7
Сайт: https://vk.com/borisov_alexandr_5
Версия: 1.3
Поддерживаемые языки: Русский
### Лицензия и правила использования плагина ###
Плагин разработан чисто для игры и не предусматривает использования в других проектах!
Если вам он нужен то действуют следующие правило:
Вы можете:
-Бесплатно использовать данный плагин в некоммерческих и коммерческих проектах
-Переводить на другие языки или полностью поменять текст плагина (сообщите мне, если Вы это сделали)
-Изменять код плагина, но Вы обязаны указать ссылку на оригинальный плагин
-Изменять имя, версию и авторов проекта под свой проект.
Вы не можете:
-Убирать или изменять любую информацию о плагине (Название, авторство, контактная информация, версия и дата релиза)
---------------------------------
Скрипты плагина
---------------------------------
//Получить рандомное число
$script.getRandomInRange(1, 100);
//Получить true или false
$script.coinTossBool();
//Включить или отключить локальный переключатель у события
setSelfSwitches(ИД События, 'A-D', true или false (По умолчанию true), (Отключение остальных локальных переключателей. По умолчанию false), ИД Карты (необязательно)); -
Пример:
$script.setSelfSwitches(1, 'A');
или
$script.setSelfSwitches(1, 'A', true, true);
Если нужно указать другую карту то:
$script.setSelfSwitches(1, 'A', true, false, 2);
или
$script.setSelfSwitches(1, 'A', true, true, 2);
Можно также вместо события указать x и y где оно расположено. Методы вызова:
Для 1го события:
$script.setSelfSwitchesXYEvent(x, y, остальное также как и в предыдущих)
Для всех событий в 1 месте:
$script.setSelfSwitchesXYEvents(x, y, остальное также как и в предыдущих)
Внимание. Не перепутайте. На вид одинаковые но отличаются только словом Event и Events на конце.
//Полчить значение локального переключателя у события
isSelfSwitches(ИД События, 'A-D', ИД Карты (необязательно)) -
Пример:
$script.isSelfSwitches(1, 'A')
или
$script.isSelfSwitches(1, 'A', 2)
Можно также вместо события указать x и y где оно расположено. Методы вызова:
$script.isSelfSwitchesXYEvent(x, y, остальное также как и в предыдущих)
//Включить или отключить локальный переключатель у нескольких событий
setArraySelfSwitches(ИД События Start, ИД События End, 'A-D', true или false (По умолчанию true), (Отключение остальных локальных переключателей. По умолчанию false), ИД Карты (необязательно)) -
Пример:
$script.setArraySelfSwitches(1, 5, 'A');
или
$script.setArraySelfSwitches(1, 5, 'A', true, true);
Если нужно указать другую карту то:
$script.setArraySelfSwitches(1, 5, 'A', true, false, 2);
или
$script.setArraySelfSwitches(1, 5, 'A', true, true, 2);
//Проверка включен или выключен ли локальный переключатель у всех событий
isArraySelfSwitches(ИД События Start, ИД События End, 'A-D', true или false (По умолчанию true) ИД Карты (необязательно)) -
Пример:
$script.isArraySelfSwitches(1, 5, 'A', false)
или
$script.isArraySelfSwitches(1, 5, 'A', false, 2)
//Мини игра Крестики нолики:
Мини игра крестики нолики устроена на событиях и локальных переключателях
Всего 9 событий которые должны идти по порядку и 3 локальных переключателей для каждого события
//Начало игры
$script.StartTicTacToe(Стартовый номер события, , Локальный переключатель крестика (по умолчанию B), Локальный переключатель нолика (по умолчанию C), Локальный переключатель дефолта (по умолчанию A));
//Проверка резльтата игры крестики нолики:
$script.ifTicTacToe(Стартовый номер события, Локальный переключатель крестика (по умолчанию B), Локальный переключатель нолика (по умолчанию C), Локальный переключатель дефолта (по умолчанию A));
Вернет:
"x" если победили крестики
"0" если победили нолики
"+" если ничья
"-" если остались ходы
Пример использования:
В проверки условий скрипт
$script.ifTicTacToe(1) === "x"
$script.ifTicTacToe(1) === "0"
$script.ifTicTacToe(1) === "+"
$script.ifTicTacToe(1) === "-"
В скрипте
if ($script.ifTicTacToe(1) === "x"){
//Действие если победили крестики
} else if ($script.ifTicTacToe(1) === "0"){
//Действие если победили нолики
} else if ($script.ifTicTacToe(1) === "0"){
//Действие если ничья
} else {
//Действие если остались ходы
}
//Получения хода для ИИ крестиков ноликов
$script.getCellMoveTicTacToe(Стартовый номер события, Локальный переключатель крестика (по умолчанию B), Локальный переключатель нолика (по умолчанию C), Локальный переключатель дефолта (по умолчанию A));
Вернет:
Номер события на которое нужно будет переместить ИИ
Пример использования
В присвоении переменной
$script.getCellMoveTicTacToe(1);
В скрипте
if ($script.getCellMoveTicTacToe(1) === 1){
//Действие если победили крестики
} else if ($script.getCellMoveTicTacToe(1) === 2){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 3){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 4){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 5){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 6){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 7){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 8){
//Действие если победили нолики
} else if ($script.getCellMoveTicTacToe(1) === 9){
//Действие если победили нолики
}
//Ожидание анимации в кадрах:
$script.waitAnimationFrame(Количество кадров анимации);
Пример использования
$script.waitAnimationFrame(5);
Будет ждать 5 кадров анимации.
$script.runCommonEvent(Номер общего события);
Пример использования
$script.runCommonEvent();
$script.runCommonEvent(1);
$script.runCommonEvent(53); // Прыжок вниз
$script.runCommonEvent(54); // Прыжок влево
$script.runCommonEvent(55); // Прыжок вправо
$script.runCommonEvent(56); // Прыжок вверх
Проверка решена ли мозайка
$script.isPuzzleDone(Количество элементов пазла (Не обязательно), Стартовый номер события (Не обязательнно));
Пример
$script.isPuzzleDone()
или
$script.isPuzzleDone(25)
или
$script.isPuzzleDone(25, 5)
Растановка пазлов в рандомном порядке
$script.setPuzzles(Количество элементов пазла (Не обязательно), Стартовый номер события (Не обязательнно));
$script.setPuzzles();
или
$script.setPuzzles(25);
или
$script.setPuzzles(25, 5);
Получить имя выпавшего рандомного файла
$script.getFileNamePuzzle()
* @param Enable_Debug
* @type boolean
* @on Вкл
* @off Выкл
* @desc Вкл / Выкл дебаг режим
* @text Дебаг режим
* @default false
*
* @param Enable_Switch_Wait_Scroll_Map
* @parent WaitScrollMap
* @type switch
* @desc Вкл / Выкл ожидания завершения прокрутки (номер переключателя)
* @text Ожидание прокрутки карты
* @default 1
*
* @param MiniGameTicTacToe
* @text Мини игра - Крестики нолики
* @default ---------------------------------
*
* @param Enable_Player_Toe_TicTacToe
* @parent MiniGameTicTacToe
* @type switch
* @desc Вкл / Выкл игрок играет за нолика
* @text Вкл / Выкл Игрок играет за нолика
* @default 2
*
* @param Var_TypeLevel
* @parent MiniGameTicTacToe
* @desc Переменная уровня сложности
* @text Переменная уровня сложности
* @type variable
* @default 3
*
* @param Jump2System
* @text Система особых прыжков
* @default ---------------------------------
*
* @param Enable_WindowJump
* @parent Jump2System
* @type switch
* @desc Вкл / Выкл окно для системы прыжков
* @text Окно для системы прыжков
* @default 3
*
* @param WaitAnimationFrame
* @text Переменные для ожидания анимации
* @default ---------------------------------
*
* @param Var_FrameAnimation
* @parent WaitAnimationFrame
* @desc Переменная количества кадров анимации в 1 сек
* @text Переменная количества кадров анимации в 1 сек
* @type variable
* @default 1
*
* @param Var_FrameGame
* @parent WaitAnimationFrame
* @desc Переменная количества кадров игры в 1 сек
* @text Переменная количества кадров игры в 1 сек
* @type variable
* @default 2
*
* @param MiniGamePuzzles
* @text Мини игра мозайка
* @default ---------------------------------
*
* @param VarRndPuzzles
* @parent MiniGamePuzzles
* @desc Переменная Радндомного ID пазлов
* @text Переменная Радндомного ID пазлов
* @type variable
* @default 4
*
* @param RndPuzzles
* @parent MiniGamePuzzles
* @desc Количество рандомных пазлов
* @text Количество рандомных пазлов
* @type struct<StructCountRndPuzzles>
* @default {"minNumberRndPuzzles":"1","maxNumberRndPuzzles":"2","fileNamePuzzles":"[\"!$Puzzle_1_\",\"!$Puzzle_2_\"]"}
*
* @param IDRegionRndPuzzles
* @parent MiniGamePuzzles
* @desc Регион для рандмного спавна пазлов
* @text Регион для рандмного спавна пазлов
* @type number
* @min 1
* @max 255
* @default 50
*/
/*~struct~StructCountRndPuzzles:ru
* @param minNumberRndPuzzles
* @text Минимальное число пазлов
* @desc Минимальное число пазлов
* @type number
* @min 1
* @default 1
*
* @param maxNumberRndPuzzles
* @text Максимальное число пазлов
* @desc Максимальное число пазлов
* @type number
* @min 1
* @default 2
*
* @param fileNamePuzzles
* @desc Имена файлов картинок пазлов
* @text Имена файлов картинок пазлов
* @type string[]
* @default ["!$Puzzle_1_","!$Puzzle_2_"]
*/
//---------------------------------
//Код плагина игры
//---------------------------------
var SPProject = {};
SPProject.JSONParse = function (string) {
try {
if (Number.isFinite(string) || typeof string === "boolean") {
return string;
}
return JSON.parse(string, (key, value) => {
if (Array.isArray(value)) {
return value.map((val) => SPProject.JSONParse(val));
} else {
try {
return SPProject.JSONParse(value);
} catch (e) {
return value;
}
}
});
} catch (e) {
return string;
}
};
SPProject.myParam = true;
SPProject.authorGame = "Движок: RPG Maker MV (JS, HTML5)!\nРазработчик: Alexandr_7!\nПомощь в создании графики: Sando\nСоздания диалогов: Plagiumll!";
SPProject.gameName = "Снежная царевна. Другая история (Demo).";
SPProject.gameVersion = "Альфа 4";
SPProject.gameNameVersion = SPProject.gameName + " Версия: " + SPProject.gameVersion;
SPProject.versionPlugin = "1.0";
SPProject.parameters = PluginManager.parameters("AL7_SnowPrincessPlugin");
SPProject.debugMode = Boolean(SPProject.parameters["Enable_Debug"]);
SPProject.ArrKey = ["left", "up", "right", "down"];
//------------------
// ! Крестики Нолики
//------------------
SPProject.enablePlayerToeTicTacToe = Number(SPProject.parameters["Enable_Player_Toe_TicTacToe"]);
SPProject.varTypeLevel = Number(SPProject.parameters["Var_TypeLevel"]);
//---------------------------
// ! Ожидание кадров анимации
//---------------------------
SPProject.varFrameAnimation = Number(SPProject.parameters["Var_FrameAnimation"]);
SPProject.varFrameGame = Number(SPProject.parameters["Var_FrameGame"]);
//----------
// ! Мозайка
//----------
SPProject.mgPuzzle = {};
SPProject.mgPuzzle.varRndPuzzles = Number(SPProject.parameters["VarRndPuzzles"]);
SPProject.mgPuzzle.rndPuzzles = SPProject.JSONParse(SPProject.parameters["RndPuzzles"]);
SPProject.mgPuzzle.idRegionRndPuzzles = Number(SPProject.parameters["IDRegionRndPuzzles"]);
//
//SPProject.enableSwitchWaitScrollMap = Number(SPProject.parameters['Enable_Switch_Wait_Scroll_Map']);
SPProject.selfSwitches = ["A", "B", "C", "D"];
//#region Класс с дополнительными скриптами
SPProject.scripts = class {
static getAuthorGame() {
return SPProject.authorGame;
}
static getVersionPlugin() {
return SPProject.versionPlugin;
}
static getNameProject() {
return SPProject.gameName;
}
static getVersionProject() {
return SPProject.gameNameVersion;
}
static getRandomInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
static coinTossBool() {
return Math.floor(Math.random() * 2) === 0;
}
static getLengthVarArray(varArr) {
return varArr.length;
}
static getArraySyperAtack(LengthArray, min, max) {
var arr = new Array(LengthArray);
for (var i = min; i <= max; i++) arr.push(i);
var rnd = Math.floor(Math.random() * (max + 1 - min) + min);
arr.splice(arr.indexOf(rnd), 1);
arr.sort(function () {
return Math.random() - 0.5;
});
return arr;
}
static isSetUpperCaseSelfSwitches(selfSwitch) {
selfSwitch = selfSwitch.toUpperCase();
return SPProject.selfSwitches.includes(selfSwitch);
}
//Задать локальный переключатель событию
static setSelfSwitches(idEvent, selfSwitch, onSelfSwitch = true, offOtherSelfSwitch = false, mapID = $gameMap.mapId()) {
if (!this.isSetUpperCaseSelfSwitches(selfSwitch)) return;
var key = [mapID, idEvent, selfSwitch];
$gameSelfSwitches.setValue(key, onSelfSwitch);
if (offOtherSelfSwitch) {
SPProject.selfSwitches.forEach(function (element) {
if (element != selfSwitch) {
let key2 = [mapID, idEvent, element];
$gameSelfSwitches.setValue(key2, false);
}
});
}
}
//Задать локальный переключатель событию по X и Y
static setSelfSwitchesXYEvent(xEvent, yEvent, selfSwitch, onSelfSwitch = true, offOtherSelfSwitch = false, mapID = $gameMap.mapId()) {
var idEvent = $gameMap.eventIdXy(xEvent, yEvent);
if (idEvent === null || idEvent === undefined || idEvent <= 0) return;
this.setSelfSwitches(idEvent, selfSwitch, onSelfSwitch, offOtherSelfSwitch, mapID);
}
//Задать локальный переключатель событиям по X и Y
static setSelfSwitchesXYEvents(xEvent, yEvent, selfSwitch, onSelfSwitch = true, offOtherSelfSwitch = false, mapID = $gameMap.mapId()) {
if (!this.isSetUpperCaseSelfSwitches(selfSwitch)) return;
var events = $gameMap.eventsXy(xEvent, yEvent);
if (events.length <= 0) return;
events.forEach(function (event) {
this.setSelfSwitches(event.eventId(), selfSwitch, onSelfSwitch, offOtherSelfSwitch, mapID);
});
}
//Задать локальный переключатель событиям
static setArraySelfSwitches(idEventStart, idEventStop, selfSwitch, onSelfSwitch = true, offOtherSelfSwitch = false, mapID = $gameMap.mapId()) {
if (!this.isSetUpperCaseSelfSwitches(selfSwitch)) return;
var key;
for (var i = idEventStart; i <= idEventStop; i++) {
this.setSelfSwitches(i, selfSwitch, onSelfSwitch, offOtherSelfSwitch, mapID);
}
}
//Проверка локального переключателя у события
static isSelfSwitches(idEvent, selfSwitch, mapID = $gameMap.mapId()) {
if (!this.isSetUpperCaseSelfSwitches(selfSwitch)) return;
var key = [mapID, idEvent, selfSwitch];
return $gameSelfSwitches.value(key);
}
//Проверка локального переключателя у события по X и Y
static isSelfSwitchesXYEvent(xEvent, yEvent, selfSwitch, mapID = $gameMap.mapId()) {
var idEvent = $gameMap.eventIdXy(xEvent, yEvent);
if (idEvent === null || idEvent === undefined || idEvent <= 0) return undefined;
else this.isSelfSwitches(idEvent, selfSwitch, mapID);
}
//Проверка локального переключателя у событий
static isArraySelfSwitches(idEventStart, idEventStop, selfSwitch, isSelfSwitchs = true, mapID = $gameMap.mapId()) {
if (!this.isSetUpperCaseSelfSwitches(selfSwitch)) return;
var key;
var a = 0,
b = 0;
for (var i = idEventStart; i <= idEventStop; i++) {
key = [mapID, i, selfSwitch];
a++;
if ($gameSelfSwitches.value(key) === isSelfSwitchs) {
b++;
}
}
return a === b;
}
//#region Для стелс режима
static isPlayerRadiusEvent(idEvent, rLeft, rUp, rRight, rDown) {
var evX = $gameMap.event(idEvent).x;
var evY = $gameMap.event(idEvent).y;
var plX = $gamePlayer.x;
var plY = $gamePlayer.y;
if (SPProject.debugMode === true) {
}
return plX >= evX - rLeft && plX <= evX + rRight && plY >= evY - rUp && plY <= evY + rDown;
}
static eventStels(idEvent, selfSwitch = "A") {
if ($gameMap.event(idEvent).direction() === 2) {
if (this.isPlayerRadiusEvent(idEvent, 1, 1, 1, 2)) this.setSelfSwitches(idEvent, selfSwitch);
} else if ($gameMap.event(idEvent).direction() === 4) {
if (this.isPlayerRadiusEvent(idEvent, 2, 1, 1, 1)) this.setSelfSwitches(idEvent, selfSwitch);
} else if ($gameMap.event(idEvent).direction() === 6) {
if (this.isPlayerRadiusEvent(idEvent, 1, 1, 2, 1)) this.setSelfSwitches(idEvent, selfSwitch);
} else {
if (this.isPlayerRadiusEvent(idEvent, 1, 2, 1, 1)) this.setSelfSwitches(idEvent, selfSwitch);
}
}
static eventStels2(idEvent, aRadius = 2, selfSwitch = "A") {
if (this.isPlayerRadiusEvent(idEvent, aRadius, aRadius, aRadius, aRadius)) this.setSelfSwitches(idEvent, selfSwitch);
}
//#endregion
//#region Для игры - Крестики Нолики
static startTicTacToe(idEventStart, selfSwitchCross = "B", selfSwitchToe = "C", selfSwitchDraw = "A") {
this.setArraySelfSwitches(idEventStart, idEventStart + 8, "A", true, true);
}
//Скрипт проверки для игры крестики ноллики
static ifTicTacToe(idEventStart, selfSwitchCross = "B", selfSwitchToe = "C", selfSwitchDraw = "A") {
//Начало ИД Событий 1 линии
var idEventLine1 = idEventStart;
//Начало ИД Событий 2 линии
var idEventLine2 = idEventLine1 + 3;
//Начало ИД Событий 3 линии
var idEventLine3 = idEventLine2 + 3;
//Проверка
//Если победили крестики
if (
this.isArraySelfSwitches(idEventLine1, idEventLine1 + 2, selfSwitchCross, true) ||
this.isArraySelfSwitches(idEventLine2, idEventLine2 + 2, selfSwitchCross, true) ||
this.isArraySelfSwitches(idEventLine3, idEventLine3 + 2, selfSwitchCross, true) ||
(this.isSelfSwitches(idEventLine1, selfSwitchCross) && this.isSelfSwitches(idEventLine2, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross)) ||
(this.isSelfSwitches(idEventLine1 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchCross)) ||
(this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross)) ||
(this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross)) ||
(this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) && this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross))
)
return "x";
//Если победили нолики
else if (
this.isArraySelfSwitches(idEventLine1, idEventLine1 + 2, selfSwitchToe, true) ||
this.isArraySelfSwitches(idEventLine2, idEventLine2 + 2, selfSwitchToe, true) ||
this.isArraySelfSwitches(idEventLine3, idEventLine3 + 2, selfSwitchToe, true) ||
(this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine2, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe)) ||
(this.isSelfSwitches(idEventLine1 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchToe)) ||
(this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe)) ||
(this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) && this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe)) ||
(this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) && this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe))
)
return "0";
//Если ничья
else if (this.isArraySelfSwitches(idEventStart, idEventStart + 8, selfSwitchDraw, false)) return "+";
//В остальных случаях (если остались ходы)
else return "-";
}
static getCellMoveTicTacToe_Easy(idEventStart, selfSwitchDraw = "A") {
var _id = 0;
do {
_id = this.getRandomInRange(idEventStart, idEventStart + 8);
} while (this.isSelfSwitches(_id, selfSwitchDraw) === false);
return _id;
}
//Получения хода для нолика с проверкой на ход врага
static getCellMoveTicTacToe_Hard(idEventStart, selfSwitchCross = "B", selfSwitchToe = "C", selfSwitchDraw = "A") {
//Начало ИД Событий 1 линии
var idEventLine1 = idEventStart;
//Начало ИД Событий 2 линии
var idEventLine2 = idEventLine1 + 3;
//Начало ИД Событий 3 линии
var idEventLine3 = idEventLine2 + 3;
//Проверка на ходы крестика
//По горизонтали
//1 Линия
//Если игрок играет за нолики
if ($gameSwitches.value(SPProject.enablePlayerToeTicTacToe) === true) {
//Проверка на победный ход соперника
//По горизонтали
//1 Линия
if (this.isArraySelfSwitches(idEventLine1, idEventLine1 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)) return idEventLine1 + 2;
else if (this.isArraySelfSwitches(idEventLine1 + 1, idEventLine1 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine1, selfSwitchDraw)) return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
//2 Линия
else if (this.isArraySelfSwitches(idEventLine2, idEventLine2 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw))
return idEventLine2 + 2;
else if (this.isArraySelfSwitches(idEventLine2 + 1, idEventLine2 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine2, selfSwitchDraw)) return idEventLine2;
else if (
this.isSelfSwitches(idEventLine2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Линия
else if (this.isArraySelfSwitches(idEventLine3, idEventLine3 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw))
return idEventLine3 + 2;
else if (this.isArraySelfSwitches(idEventLine3 + 1, idEventLine3 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine3, selfSwitchDraw)) return idEventLine3;
else if (
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
//По вертикали
//1 Строка
else if (this.isSelfSwitches(idEventLine1, selfSwitchCross) && this.isSelfSwitches(idEventLine2, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchDraw))
return idEventLine3;
else if (this.isSelfSwitches(idEventLine2, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross) && this.isSelfSwitches(idEventLine1, selfSwitchDraw))
return idEventLine1;
else if (this.isSelfSwitches(idEventLine1, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross) && this.isSelfSwitches(idEventLine2, selfSwitchDraw))
return idEventLine2;
//2 Строка
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Строка
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw)
)
return idEventLine2 + 2;
//По диагонали
//1 Диагональ
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1, selfSwitchDraw)
)
return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//2 Диагональ
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchDraw)
)
return idEventLine3;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//Проверка на победный ход игрока
//По горизонтали
//1 Линия
else if (this.isArraySelfSwitches(idEventLine1, idEventLine1 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw))
return idEventLine1 + 2;
else if (this.isArraySelfSwitches(idEventLine1 + 1, idEventLine1 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine1, selfSwitchDraw)) return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
//2 Линия
else if (this.isArraySelfSwitches(idEventLine2, idEventLine2 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw))
return idEventLine2 + 2;
else if (this.isArraySelfSwitches(idEventLine2 + 1, idEventLine2 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine2, selfSwitchDraw)) return idEventLine2;
else if (
this.isSelfSwitches(idEventLine2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Линия
else if (this.isArraySelfSwitches(idEventLine3, idEventLine3 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw))
return idEventLine3 + 2;
else if (this.isArraySelfSwitches(idEventLine3 + 1, idEventLine3 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine3, selfSwitchDraw)) return idEventLine3;
else if (
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
//По вертикали
//1 Строка
else if (this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine2, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchDraw))
return idEventLine3;
else if (this.isSelfSwitches(idEventLine2, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe) && this.isSelfSwitches(idEventLine1, selfSwitchDraw))
return idEventLine1;
else if (this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe) && this.isSelfSwitches(idEventLine2, selfSwitchDraw))
return idEventLine2;
//2 Строка
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Строка
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw)
)
return idEventLine2 + 2;
//По диагонали
//1 Диагональ
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1, selfSwitchDraw)
)
return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//2 Диагональ
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchDraw)
)
return idEventLine3;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
else return this.getCellMoveTicTacToe_Easy(idEventStart, selfSwitchDraw);
}
//Если игрок играет за крестики
else {
//Проверка куда ходить сопернику
//По горизонтали
//1 Линия
if (this.isArraySelfSwitches(idEventLine1, idEventLine1 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)) return idEventLine1 + 2;
else if (this.isArraySelfSwitches(idEventLine1 + 1, idEventLine1 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine1, selfSwitchDraw)) return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
//2 Линия
else if (this.isArraySelfSwitches(idEventLine2, idEventLine2 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw))
return idEventLine2 + 2;
else if (this.isArraySelfSwitches(idEventLine2 + 1, idEventLine2 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine2, selfSwitchDraw)) return idEventLine2;
else if (
this.isSelfSwitches(idEventLine2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Линия
else if (this.isArraySelfSwitches(idEventLine3, idEventLine3 + 1, selfSwitchToe, true) && this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw))
return idEventLine3 + 2;
else if (this.isArraySelfSwitches(idEventLine3 + 1, idEventLine3 + 2, selfSwitchToe, true) && this.isSelfSwitches(idEventLine3, selfSwitchDraw)) return idEventLine3;
else if (
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
//По вертикали
//1 Строка
else if (this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine2, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchDraw))
return idEventLine3;
else if (this.isSelfSwitches(idEventLine2, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe) && this.isSelfSwitches(idEventLine1, selfSwitchDraw))
return idEventLine1;
else if (this.isSelfSwitches(idEventLine1, selfSwitchToe) && this.isSelfSwitches(idEventLine3, selfSwitchToe) && this.isSelfSwitches(idEventLine2, selfSwitchDraw))
return idEventLine2;
//2 Строка
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Строка
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw)
)
return idEventLine2 + 2;
//По диагонали
//1 Диагональ
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1, selfSwitchDraw)
)
return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//2 Диагональ
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchDraw)
)
return idEventLine3;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchToe) &&
this.isSelfSwitches(idEventLine3, selfSwitchToe) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//Проверка на ходы игрока
//По горизонтали
//1 Линия
else if (this.isArraySelfSwitches(idEventLine1, idEventLine1 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw))
return idEventLine1 + 2;
else if (this.isArraySelfSwitches(idEventLine1 + 1, idEventLine1 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine1, selfSwitchDraw)) return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
//2 Линия
else if (this.isArraySelfSwitches(idEventLine2, idEventLine2 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw))
return idEventLine2 + 2;
else if (this.isArraySelfSwitches(idEventLine2 + 1, idEventLine2 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine2, selfSwitchDraw)) return idEventLine2;
else if (
this.isSelfSwitches(idEventLine2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Линия
else if (this.isArraySelfSwitches(idEventLine3, idEventLine3 + 1, selfSwitchCross, true) && this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw))
return idEventLine3 + 2;
else if (this.isArraySelfSwitches(idEventLine3 + 1, idEventLine3 + 2, selfSwitchCross, true) && this.isSelfSwitches(idEventLine3, selfSwitchDraw)) return idEventLine3;
else if (
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
//По вертикали
//1 Строка
else if (this.isSelfSwitches(idEventLine1, selfSwitchCross) && this.isSelfSwitches(idEventLine2, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchDraw))
return idEventLine3;
else if (this.isSelfSwitches(idEventLine2, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross) && this.isSelfSwitches(idEventLine1, selfSwitchDraw))
return idEventLine1;
else if (this.isSelfSwitches(idEventLine1, selfSwitchCross) && this.isSelfSwitches(idEventLine3, selfSwitchCross) && this.isSelfSwitches(idEventLine2, selfSwitchDraw))
return idEventLine2;
//2 Строка
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchDraw)
)
return idEventLine3 + 1;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 1, selfSwitchDraw)
)
return idEventLine1 + 1;
else if (
this.isSelfSwitches(idEventLine1 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//3 Строка
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 2, selfSwitchDraw)
)
return idEventLine2 + 2;
//По диагонали
//1 Диагональ
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchDraw)
)
return idEventLine3 + 2;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1, selfSwitchDraw)
)
return idEventLine1;
else if (
this.isSelfSwitches(idEventLine1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//2 Диагональ
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchDraw)
)
return idEventLine3;
else if (
this.isSelfSwitches(idEventLine2 + 1, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine1 + 2, selfSwitchDraw)
)
return idEventLine1 + 2;
else if (
this.isSelfSwitches(idEventLine1 + 2, selfSwitchCross) &&
this.isSelfSwitches(idEventLine3, selfSwitchCross) &&
this.isSelfSwitches(idEventLine2 + 1, selfSwitchDraw)
)
return idEventLine2 + 1;
//В остальных случаях
else return this.getCellMoveTicTacToe_Easy(idEventStart, selfSwitchDraw);
}
}
static getCellMoveTicTacToe(idEventStart, selfSwitchCross = "B", selfSwitchToe = "C", selfSwitchDraw = "A") {
switch ($gameVariables.value(SPProject.varTypeLevel)) {
case 0:
return this.getCellMoveTicTacToe_Easy(idEventStart, selfSwitchDraw);
break;
default:
return this.getCellMoveTicTacToe_Hard(idEventStart, selfSwitchCross, selfSwitchToe, selfSwitchDraw);
break;
}
}
//#endregion
//#region Для ожидания кадров анимации
//Функция ожидания кадров анимации
static waitAnimationFrame(_frame = $gameVariables.value(SPProject.varFrameAnimation)) {
$gameMap._interpreter.wait((_frame / $gameVariables.value(SPProject.varFrameAnimation)) * $gameVariables.value(SPProject.varFrameGame));
}
//#endregion
static runCommonEvent(_id) {
if ($gameTemp.isCommonEventReserved(_id)) $gameTemp.clearCommonEvent(id);
$gameTemp.reserveCommonEvent(_id);
}
//#region Мозайка
static isPuzzleDone(idCountElementPuzzle = 9, idEventStart = 1) {
var idcnt = 0;
for (var i = idEventStart; i < idEventStart + idCountElementPuzzle; i++) {
if ($gameMap.regionId($gameMap.event(i).x, $gameMap.event(i).y) === i) idcnt++;
}
if (idcnt === idCountElementPuzzle) {
return true;
} else {
return false;
}
}
static setPuzzles(idCountElementPuzzle = 9, idEventStart = 1) {
$gameVariables.setValue(
SPProject.mgPuzzle.varRndPuzzles,
this.getRandomInRange(SPProject.mgPuzzle.rndPuzzles.minNumberRndPuzzles, SPProject.mgPuzzle.rndPuzzles.maxNumberRndPuzzles)
);
var arrCoordPuzzles = [];
var width = $gameMap.width();
var height = $gameMap.height();
for (var x = 0; x < width; x++) {
for (var y = 0; y < height; y++) {
if ($gameMap.regionId(x, y) === SPProject.mgPuzzle.idRegionRndPuzzles) {
var coordpuzzles = {
x: 0,
y: 0,
};
coordpuzzles.x = x;
coordpuzzles.y = y;
arrCoordPuzzles.push(coordpuzzles);
}
}
}
if (arrCoordPuzzles.length > 0) {
arrCoordPuzzles = arrCoordPuzzles.sort(function () {
return Math.random() - 0.5;
});
for (var i = idEventStart; i < idEventStart + idCountElementPuzzle; i++) {
$gameMap.event(i).setPosition(arrCoordPuzzles[i].x, arrCoordPuzzles[i].y);
}
}
}
//#endregion
//#region Нажатие клавишь за время
//#endregion
};
//#endregion
//---------------------------------
//Уменьшители
//---------------------------------
var $script = SPProject.scripts;
//------------------------------------
//Переназначенные функции RPG Maker MV
//------------------------------------
//#region Для уровня прыжков
//#endregion
/*
Game_Interpreter.prototype.command204 = function() {
if (!$gameParty.inBattle()) {
if ($gameMap.isScrolling()) {
this.setWaitMode('scroll');
return false;
}
$gameMap.startScroll(this._params[0], this._params[1], this._params[2]);
if ($gameSwitches.value(SPProject.enableSwitchWaitScrollMap)) {
this.setWaitMode('scroll');
}
}
return true;
};
*/ |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Последнее редактирование: 4 года 7 мес. назад от Alexandr_7.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Leprikon01
|
Утилиты разработчика 4 года 8 мес. назад #115993
|
Обновлен плагин.
Добавлены парочка новых скриптов. Справка обновлена частично или вообще не обновлена. Так как этот плагин куча борохла в 1 плагине то врядле кому зайдет. Лично там функционал который мне необходим для моего прооекта. Может кому из скриптоделов будет полезен. |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116391
|
Обновлен плагин. Добавлены функции для задания локальных переключателей не по событию а по X и Y где это событие или событии распложены.
Не проверял еще. |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Последнее редактирование: 4 года 7 мес. назад от Alexandr_7.
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116392
|
Alexandr_7 пишет:
Скрипт для получения рандомного числа (Ибо в MV данный функционал багнутый) А в чём заключается багнутость этого функционала в MV? Вроде бы ваш код даст на 100% такой же результат, как и стандартный код из MV.Пояснение [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] В RPG Maker MV код для получения случайного числа хранится в файлах JsExtensions и Game_Interpreter. Вот как определяется функция Math.randomInt в JsExtensions: Math.randomInt = function(max) {
return Math.floor(max * Math.random());
}; Вот как выглядит код обработки команды «Переменные» (Contol Variable), который отвечает за случайные числа: // Control Variables
Game_Interpreter.prototype.command122 = function() {
var value = 0;
switch (this._params[3]) { // Operand
//[тут код, не связанный со случайными числами]
case 2: // Random
value = this._params[5] - this._params[4] + 1;
for (var i = this._params[0]; i <= this._params[1]; i++) {
this.operateVariable(i, this._params[2], this._params[4] + Math.randomInt(value));
}
return true;
break;
//[тут код, не связанный со случайными числами]
}
//[тут код, не связанный со случайными числами]
}; Чтобы сравнивать с функцией из плагина, давайте вынесем стандартный код в отдельную функцию defaultRandom(min, max). Заменим this._params[5] и this._params[4] на min, max, уберём operateVariable (эта функция позволяет присваивать, отнимать, умножать и т.п.) и цикл по диапазону переменных, т.к. это к делу не относится: Math.randomInt = function(max) {
return Math.floor(max * Math.random());
};
function defaultRandom(min, max) {
var value = max - min + 1;
return min + Math.randomInt(value));
} Если вставить код Math.randomInt в саму функцию, то получим: function defaultRandom(min, max) {
var value = max - min + 1;
return min + Math.floor(value * Math.random());
} Если объединить две строки в одну, то получим: function defaultRandom(min, max) {
return min + Math.floor((max - min + 1) * Math.random());
} Учитывая коммутативность сложения и умножения, этот код идентичен этому: function defaultRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} А теперь сравним с кодом из плагина: static getRandomInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} То есть стандартный код из MV работает на 100% так же, как и код из этого плагина. В чём багнутость? Стандартный код на 100% такой же, как и ваш. |
Последнее редактирование: 4 года 7 мес. назад от Dmy.
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116399
|
Dmy пишет:
Alexandr_7 пишет:
Скрипт для получения рандомного числа (Ибо в MV данный функционал багнутый) А в чём заключается багнутость этого функционала в MV? Вроде бы ваш код даст на 100% такой же результат, как и стандартный код из MV.Пояснение [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] В RPG Maker MV код для получения случайного числа хранится в файлах JsExtensions и Game_Interpreter. Вот как определяется функция Math.randomInt в JsExtensions: Math.randomInt = function(max) {
return Math.floor(max * Math.random());
}; Вот как выглядит код обработки команды «Переменные» (Contol Variable), который отвечает за случайные числа: // Control Variables
Game_Interpreter.prototype.command122 = function() {
var value = 0;
switch (this._params[3]) { // Operand
//[тут код, не связанный со случайными числами]
case 2: // Random
value = this._params[5] - this._params[4] + 1;
for (var i = this._params[0]; i <= this._params[1]; i++) {
this.operateVariable(i, this._params[2], this._params[4] + Math.randomInt(value));
}
return true;
break;
//[тут код, не связанный со случайными числами]
}
//[тут код, не связанный со случайными числами]
}; Чтобы сравнивать с функцией из плагина, давайте вынесем стандартный код в отдельную функцию defaultRandom(min, max). Заменим this._params[5] и this._params[4] на min, max, уберём operateVariable (эта функция позволяет присваивать, отнимать, умножать и т.п.) и цикл по диапазону переменных, т.к. это к делу не относится: Math.randomInt = function(max) {
return Math.floor(max * Math.random());
};
function defaultRandom(min, max) {
var value = max - min + 1;
return min + Math.randomInt(value));
} Если вставить код Math.randomInt в саму функцию, то получим: function defaultRandom(min, max) {
var value = max - min + 1;
return min + Math.floor(value * Math.random());
} Если объединить две строки в одну, то получим: function defaultRandom(min, max) {
return min + Math.floor((max - min + 1) * Math.random());
} Учитывая коммутативность сложения и умножения, этот код идентичен этому: function defaultRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} А теперь сравним с кодом из плагина: static getRandomInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} То есть стандартный код из MV работает на 100% так же, как и код из этого плагина. В чём багнутость? Стандартный код на 100% такой же, как и ваш. В том что когдато я сталкнулся с тем что мне на протижении 30 раз (просто я 30 тестов и делал) вылетало одно и тоже число. Вот в чем заключается багнутость функционала MV. Если использовать очень мелкие числа то он тебе 1 и тоже будет выдавать и это баг. Мне толи здесь толи на нейтральной полосе подтверждали. это. С тех пор использую скрипт для рандома ну + данный скрипт и в других скриптах плагина используется. Вроде использовал от 1 до 3 и в итоге постоянно 3 получал. Я согласен. Баг не у всех но точно писал на форум и мне говорили что это баг MV. Возможно на тот момент использовались файлы старой версии движка. Но вроде 1.6.1 были. Но 100 процентов гдето писал такой вопрос бага и точно был ответ багнотостью движка. Скорее всего баг не у всех но как по мне лучше 100 процентов знать что код сработает а не проверять одно и тоже место по 30 раз. И да я вспомнил. Использовал именно от 1 до 3 чтобы рандомно поставить летящуюю пулю так она из одного тогоже место и летело и это было совсем не круто. |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Последнее редактирование: 4 года 7 мес. назад от Alexandr_7.
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116400
|
Alexandr_7 пишет:
В том что когдато я сталкнулся с тем что мне на протижении 30 раз (просто я 30 тестов и делал) вылетало одно и тоже число. Вот в чем заключается багнутость функционала MV. Если использовать очень мелкие числа то он тебе 1 и тоже будет выдавать и это баг. Это не баг, это фича. Math.random() выдаёт математически случайные числа.Математически есть вероятность, что я брошу монетку 100 раз и мне всегда выпадет решка. Вероятность такого мала, но такая вероятностьесть. И Math.random() может выдать такие вещи. И ваш генератор, и генератор MV используют Math.random(), поэтому результат будет одинаковый. То, что вам попалось одно число 30 раз в генераторе MV, и не попалось в вашем коде — это просто случайность. У кого-то, наоборот, 30 раз попадётся одно и то же число в вашем коде, а в генераторе MV не попадётся. Вероятность получить 30 раз одно число при выборе из трёх — (1/3)30, то есть 4.856935749618858 * 10-15. Это маленькая вероятность, но она есть. И когда-то кому-то она может выпасть. Alexandr_7 пишет: Мне толи здесь толи на нейтральной полосе подтверждали. это. Ну, возможно те, кто подтверждал, сами не разбирались в вопросе. Alexandr_7 пишет: Баг не у всех но точно писал на форум и мне говорили что это баг MV. Alexandr_7 пишет:
Но 100 процентов гдето писал такой вопрос бага и точно был ответ багнотостью движка. Скорее всего баг не у всех но как по мне лучше 100 процентов знать что код сработает а не проверять одно и тоже место по 30 раз. И да я вспомнил. Использовал именно от 1 до 3 чтобы рандомно поставить летящуюю пулю так она из одного тогоже место и летело и это было совсем не круто. Работая программистом, я таких «багов» повидал... Однажды клиент отключил галочку «присылать уведомления», а потом написал нам, что у него баг: уведомления не присылаются.Вот так и здесь: людям не нужны по-настоящему рандомные числа (нужно, чтобы ситуация «пуля всегда летит из одного места» не случалась — при рандомных числах такая вероятность есть!), но они используют рандомный генератор не по назначению. И, естественно, получают не такой результат, какой нужно. Alexandr_7 пишет: Возможно на тот момент использовались файлы старой версии движка. Но вроде 1.6.1 были. Если верить git blame на Гитхабе, текущий код появился как раз в версии 1.6.1. Код до этого времени косметически отличался, но работал так же.Если честно, не знаю, зачем они его поменяли. Старый код давал тот же результат. ______ Добавлено: в Википедии есть хорошая статья, Иллюзия кластеризации. «Багованность» генератора случайных чисел в MV — это именно такая иллюзия. |
Последнее редактирование: 4 года 7 мес. назад от Dmy.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK, MaltonTheWarrior
|
Утилиты разработчика 4 года 7 мес. назад #116409
|
Нет. Это вероятность крайне мала учитоввая что 30 запусков я делал а генерациии было на много больше ведь пуля летит не 1 раз а через определенный промижуток. Всегда выподало число 3. Такого просто не может быть да будь бы милион проверок уверен что милион бы и выпало 3. К томуже про баг мне писал человек который сам пишет плагины под MV. Короче если у вас работает встроенный способ тьо флаг вам в руки а у меня встроенный способ генерацмии рандома от 1 до 3 постоянно генеририрует число 3. И такого между прочем не разу небыло когда я стал генеририровать рандом своим способом.
И да. Встроенный способ я имею в виду присвоить переменной через команды от 1 до 3. А не через встроенные скрипты. |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Последнее редактирование: 4 года 7 мес. назад от Alexandr_7.
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116411
|
В любом случае даже если не этот баг это функция полезна так как минимум не везде можно пользоваться встроенными возможностями. Например если нужно указать напрямую рандомное число в функцию то достаточно мою функцию вызвать а не через mv сначало присваивать переменной а потом в функцию присваивать переменную. Оптимизация другими словами.
|
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy
|
Утилиты разработчика 4 года 7 мес. назад #116413
|
1. неправильно ты, александр, рандом тестируешь. надо создавать цикл хотя бы до 1000 и смотреть результаты. а на такой маленькой выборке как 30 смысл тестировать нет.
var arr = ["вне выборки",0,0,0,0],
max = 4,
min = 1;
for(let i = 0; i<1000000; i++) {
let a = Math.floor(Math.random() * (max - min + 1)) + min;
arr[a]++;
}
console.log(arr);
//["вне выборки", 249779, 250288, 249932, 250001]
// итого - нормальный рандом 2. В версии мукера декабря 2015 год рандом такой же, пусть и немного отличается написанием: //функция рандома в rpg_objects.js:
value = this._params[4] + Math.randomInt(this._params[5] - this._params[4] + 1);
//функция Math.randomInt в rpg_core.js
Math.randomInt = function(max) {
return Math.floor(max * Math.random());
}; соединяем ее в одну, выходит: this._params[4] + Math.floor((Math.randomInt(this._params[5] - this._params[4] + 1)* Math.random()); переписываем с нашими переменными min и max, получается то же самое, что у тебя, только с переменой мест слагаемых: min + Math.floor((Math.randomInt(max - min + 1)* Math.random()); Поэтому если ошибка в рандом МВ и была, то в октябре-ноябре 2015-ого, что уже как 4,5 года неактуально |
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116419
|
Ой. Блин. Вы либо не верите мне либо меня не слушаете.
1. Я сказал что баг был при использовании команд события а не через скрипты напрямую. Я понимаю что команды событий вызывают встроенные скрипты но так или иначе баг был и баг сейчас я потестировал - не повторяется. Скорее всего какойто файл от старой версии был или не знаю как объяснить но точно помню баг был. И повторюсь. Я присваивал переменной не через стартные скрипты а через команду переменная в событии и сейчас все нормально. Но тогда при использовании от 1 до 3 постоянно выподало 3. С тех пор использую скрипт. Если у кого работает нормально и то флаг вам в руки. Сейчас у меня и у самого нормально работает но я всеже предпочитаю через свой скрипт делать к томуже я в принципе в основном использую скриптинг JS для создиния чего либо ибо чтото реально хорошее встроенными способами создавать ужасно неудобно. Да. Скриптинг в некоторых местах горазду удобнее например для ситуаций когда множество if и else лучше использовать скрипты чем команды плагина ибо в командах ветвление условий сделано очень хреново и когда у тебя условий штук 10 то выглядит уже крайне нечитабельно. Учитывая тот факт что окошки mv маленькие и увеличить их размер нельзя. Короче помимо бага который когдато был у меня были еще 2 причины использовать скрипт вывода рандомного числа. 2. Я также сказал что этот скрипт используется для других скриптов. Скрипт полезен если нужно указать рандомное число в функцию. Короче. Про баг речь закрыта. Баг был у меня и ктото гдето мне гсказал что причина в баге MV. Также забыл сказать что баг был именно на готовом проекте а не на |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Последнее редактирование: 4 года 7 мес. назад от Alexandr_7.
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116429
|
Почему у тебя условия использования противоречат друг другу ?
-Изменять имя, версию и авторов проекта под свой проект. Вы не можете: -Убирать или изменять любую информацию о плагине (Название, авторство, контактная информация, версия и дата релиза) Кхм... Очень знакомый текст... |
Администратор запретил публиковать записи гостям.
|
Утилиты разработчика 4 года 7 мес. назад #116430
|
DK пишет:
Почему у тебя условия использования противоречат друг другу ? -Изменять имя, версию и авторов проекта под свой проект. Вы не можете: -Убирать или изменять любую информацию о плагине (Название, авторство, контактная информация, версия и дата релиза) Кхм... Очень знакомый текст... Информацию в плагине нет но есть переменные с информацией проекта и автора. Там можно. |
Мой вк: vk.com/borisov_alexandr_5
Мой ютуб канал: www.youtube.com/@alexandr_5836 Мой бусти: boosty.to/alexandr-7
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy
|
Модераторы: NeKotZima
Время создания страницы: 0.860 секунд