Для начинающих программистов-мукеристов rpg maker MV. То, чего нет в
списке "простых скриптов" или что не очень понятно.
Плюс несколько функций. Вдруг кому пригодится.
Проверка равенства переменной определенным числам:
[1, 2, 3, 4].contains($gameVariables.value(ИД))
Проверка наличия тега в заметке в предмете в БД:
$dataItems[ИД].note.contains('тег')
проверка наличия тега в заметке во вкладке "противники" в БД:
$dataEnemies[ИД].note.contains('тег')
проверка наличия тега в заметке в оружии в БД:
$dataWeapons[ИД].note.contains('тег')
проверка наличия тега в заметке в во вкладке "броня" БД:
$dataArmors[ИД].note.contains('тег')
возвращения свойства тега в заметке в во вкладке "оружие" в БД:
$dataWeapons[ИД].meta.тег
При этом в заметке тег должен быть в треугольных скобках, а его свойство должно идти после двоеточия:
возвращает ИД слота Экипировки, где IDslot - ID слота экипировки (0-оружие, 1- щит, 2- голова и т.д.)
$gameParty.leader().equips()[IDslot]
индекса чарсета лидера партии:
$gameParty.leader()._characterIndex;
имя чарсета лидера партии:
$gameParty.leader()._characterName;
Смена графики лидера партии. Не забудьте обновить ее, добавив второй строчкой "рефреш".
$gameParty.leader().setCharacterImage('Actor1', 7);
$gamePlayer.refresh();
Для того, чтобы проверить экипировку, имя чарсета и т.д. не лидера а 2-4 члена партии, следует заменить в вышеизложенных кодах $gameParty.leader() на:
Перед этим лучше вставить проверку на существования этого члена партии:
$gameParty.members()[ИД]!=undefined
имя события:
$gameMap.event(ИД).event().name.contains('имя')
заметка события:
$gameMap.event(ИД).event().note.contains('имя')
проверка существования события:
$dataMap.events[id]==null
телепорт события:
$gameMap.event(ИД).setPosition(x, y)
смена локального переключателя на "D" события на текущей карте :
$gameSelfSwitches.value([$gameMap.mapId(), ИД, 'D'], true)
телепорт события в координату игрока:
$gameMap.event(ИД).setPosition($gamePlayer.x, $gamePlayer.y)
Пауза которую можно вызвать в функции. Вторая функция будет вызвана с задержкой в 300 милисекунд.
setTimeout(function() {функция2()}, 300);
Возвращение наличия определенного комментария на текущей странице события с нужным ID. Возвращает true или false.
Код проверки:
$gameMap.processCommentTag(ID, 'комментарий')
Сама функция.
Game_Map.prototype.processCommentTag = function (id, tag) {
var eventID = $gameMap.event(id);
var list = eventID.page().list;
for (var i = 0; i < list.length; i++) {
if (list[i].code === 108 || list[i].code === 408) {
if (eventID.page().list[i].parameters[0]==tag){
console.log('tag true');
return true;
}
}
}
return false;
}
Битмапы.
создание прямоугольника определенного цвета ('#0000ff')с правым верхним углом в определенной точке, определенной ширины и высоты:
this.bitmap.fillRect(x, y, ширина, высота, '#0000ff');
написание текста:
this.bitmap.drawText('текст', x, y, ширина, высота)
цвет текста:
this.bitmap.textColor = '#000000';
название шрифта
this.bitmap.fontFace = 'Trebuchet MS';
размер шрифта:
this.bitmap.fontSize = 12;
толщина обводки букв:
this.bitmap.outlineWidth = 2;
цвет обводки:
this.bitmap.outlineColor = '#000000';
курсив ли:
this.bitmap.fontItalic = true;
Отрисовка иконки из определенного файла, где "index" - порядковый номер иконки, "количество" -количество иконок в одном ряду иконсета.
Вызов функции:
this.drawIcon(index, x, y, ширина, высота, 16, 'название файла');
Сама функция:
ICON_Hud.prototype.drawIcon = function(index, x, y, w, h, string, IconSet) {
if (!this.bitmap) return false;
var bitmap = ImageManager.loadSystem(IconSet);
var pw = Window_Base._iconWidth;
var ph = Window_Base._iconHeight;
var sx = index%string*pw;
var sy = Math.floor(index/string)*pw;
this.bitmap.blt(bitmap,sx,sy,pw,ph,x,y, w,h);
return true;
}
Координаты расположение "экрана" относительно карты (левый верхний угол экрана):
$gameMap.displayX();
$gameMap.displayY()
Соответственно, для того, чтобы узнать реальные координаты события необходимо прибавить к ним данные координаты экрана:
$gameMap.event(id).x + $gameMap.displayX();
$gameMap.event(id).y + $gameMap.displayY()
Показ в консольке текста из события - "сообщений"("message"), "выбора".
Сообщения выводятся текстом, выбор - массивом.
Вызов функции:
$gameMap.processEventList(id);
Сама функция:
Game_Map.prototype.processEventList = function (id) {
var eventID = $gameMap.event(id);
var list = eventID.page().list;
for (var i = 0; i < list.length; i++) {
if (list[i].code === 401 || list[i].code === 102) {
console.log(list[i].parameters[0]);
}
}
}
Возвращает массив эффектов ("особенностей") оружия:
$dataWeapons[idWeapon].traits
https://s.mail.ru/LJX7/T2PSJWDmd
1) Код параметра, где idWeapon - ид оружия, id - номер особенности в массиве особенностей оружия (начинается с нуля, как во всяком массиве)
$dataWeapons[idWeapon].traits[id].code
Возвращает число, где первая цифра - порядковый номер вкладки с "особенностями", а вторая - порядковый номер особенности в этой вкладке. Например, у "состоянии атаки" вкладка "атака" - третья, а сама особенность вторая в этой вкладке, потому и номер возвратится "32"
2) Тип параметра
$dataWeapons[idWeapon].traits[id].dataId
Возвращает порядковый номер типа параметра (начиная с единицы). В примере выше возвратит "1"
3) Показатель параметра
$dataWeapons[idWeapon].traits[id].value
Возвращает показатель типа параметра, обычно он в процентах. В примере выше возвратит "100". Не очень удобно, было бы удобнее в виде "1.0" вместо 100% и, например "0.9" вместо 90%.
Движение одного события к другому событию.
В примере 4-ое событие будет двигаться к 10-ому.
$gameMap.event(4).moveTowardCharacter($gameMap.event(10));
Возврат кол-ва действий в "маршруте" события. Из этого списка следует вычесть единичку, ибо при добавлении действия в маршрут события, следом ВСЕГДА автоматически создается пустое действие.
$gameMap.event($gameVariables.value(id))._moveRoute.list;
Добавление действия в маршрут события:
$gameMap.event($gameVariables.value(id))._moveRoute.list.push({code: 45, parameters: ['script']});
, где "code: 45" - код действия из списка ниже. "parameters: " - нужен только в случае, когда код 45 (вставка в маршрут скрипта).
Game_Character.ROUTE_END = 0;
Game_Character.ROUTE_MOVE_DOWN = 1;
Game_Character.ROUTE_MOVE_LEFT = 2;
Game_Character.ROUTE_MOVE_RIGHT = 3;
Game_Character.ROUTE_MOVE_UP = 4;
Game_Character.ROUTE_MOVE_LOWER_L = 5;
Game_Character.ROUTE_MOVE_LOWER_R = 6;
Game_Character.ROUTE_MOVE_UPPER_L = 7;
Game_Character.ROUTE_MOVE_UPPER_R = 8;
Game_Character.ROUTE_MOVE_RANDOM = 9;
Game_Character.ROUTE_MOVE_TOWARD = 10;
Game_Character.ROUTE_MOVE_AWAY = 11;
Game_Character.ROUTE_MOVE_FORWARD = 12;
Game_Character.ROUTE_MOVE_BACKWARD = 13;
Game_Character.ROUTE_JUMP = 14;
Game_Character.ROUTE_WAIT = 15;
Game_Character.ROUTE_TURN_DOWN = 16;
Game_Character.ROUTE_TURN_LEFT = 17;
Game_Character.ROUTE_TURN_RIGHT = 18;
Game_Character.ROUTE_TURN_UP = 19;
Game_Character.ROUTE_TURN_90D_R = 20;
Game_Character.ROUTE_TURN_90D_L = 21;
Game_Character.ROUTE_TURN_180D = 22;
Game_Character.ROUTE_TURN_90D_R_L = 23;
Game_Character.ROUTE_TURN_RANDOM = 24;
Game_Character.ROUTE_TURN_TOWARD = 25;
Game_Character.ROUTE_TURN_AWAY = 26;
Game_Character.ROUTE_SWITCH_ON = 27;
Game_Character.ROUTE_SWITCH_OFF = 28;
Game_Character.ROUTE_CHANGE_SPEED = 29;
Game_Character.ROUTE_CHANGE_FREQ = 30;
Game_Character.ROUTE_WALK_ANIME_ON = 31;
Game_Character.ROUTE_WALK_ANIME_OFF = 32;
Game_Character.ROUTE_STEP_ANIME_ON = 33;
Game_Character.ROUTE_STEP_ANIME_OFF = 34;
Game_Character.ROUTE_DIR_FIX_ON = 35;
Game_Character.ROUTE_DIR_FIX_OFF = 36;
Game_Character.ROUTE_THROUGH_ON = 37;
Game_Character.ROUTE_THROUGH_OFF = 38;
Game_Character.ROUTE_TRANSPARENT_ON = 39;
Game_Character.ROUTE_TRANSPARENT_OFF = 40;
Game_Character.ROUTE_CHANGE_IMAGE = 41;
Game_Character.ROUTE_CHANGE_OPACITY = 42;
Game_Character.ROUTE_CHANGE_BLEND_MODE = 43;
Game_Character.ROUTE_PLAY_SE = 44;
Game_Character.ROUTE_SCRIPT = 45;
Функция для движения события к герою до тех пор, пока событие его "не догонит"
Без поиска пути, в случае препятствия событие тупо стоит. После того, как событие "догонит" игрока, включается лок.переключатель "D".
Вызов функции (вставлять в маршрут события):
this.ABSYuryolMovePlayer()
Сама функция
Game_Character.prototype.ABSYuryolMovePlayer = function() {
if (this._x == $gamePlayer.x && this._y == $gamePlayer.y) {
$gameSelfSwitches.setValue([$gameMap.mapId(), this._eventId, 'D'], true);
} else {
this.moveTowardCharacter($gamePlayer);
this._moveRoute.list.push({code: 45, parameters: ['this.ABSYuryolMovePlayer()']});
}
}
Возвращает ИД тайла на клетке с координатами x и y на слое z.
1. Земля расположена на слое 0
2. Объекты повыше типа гор или травки из вкладки А - слой 1
3. Интересно, что например тайл с вкладки Б расположен либо на 2, либо на 3 слое.
- если на клетке один тайл с вкладки Б, то его слой - 3
- если два тайла с вкладки Б, то тот, который выше имеет слой 3, а который ниже - слой 2.
Возвращает заметку тайлсета БД
$dataTilesets[$dataMap.tilesetId].note
Возвращает значение тега в заметке тайлсета БД, где tag - нужный тег
$dataTilesets[$dataMap.tilesetId].meta.tag
При этом сам тег(tag) с его значением (value) должны выглядеть в заметке тайлсета так: <tag:value>
Возвращает массив значения тега в заметке тайлсета БД, где tag - нужный тег
$dataTilesets[$dataMap.tilesetId].meta.tag.split(' ')
Нужен в случаях, когда в одном теге необходимо передать несколько значений типа:
<tag:value1 value1 value1>
Блокировка управления.
При переводе переключателя в положении false персонаж будет только поворачиваться в нужную сторону но не двигаться
var blockMove = Game_Player.prototype.moveStraight;
Game_Player.prototype.moveStraight= function(d) {
if (this.canPass(this.x, this.y, d)) {
this._followers.updateMove();
}
(blockMove) ? this.setDirection(d) : Game_Character.prototype.moveStraight.call(this, d);
}
Очистка переменных
, где mainArr - массив который надо очистить.
Бывает необходимость очистить значения переменных или массивов после перехода на другую карту. Для этого мы можем очищать их в данной функции вместо того, чтобы на каждую новую карту вставлять автоматическое событие с очисткой переменных или массивов
var absYuryolTerminate = Scene_Map.prototype.terminate;
Scene_Map.prototype.terminate = function() {
absYuryolTerminate.call(this);
mainArr= [];
}
Удобный "консоль лог"
До меня только пару месяцев назад дошло, что в мв есть поддержка ES2015 (а с недавнего времени по словам ДК и ES2016, ES2017). А значит можно использовать удобные шаблонные строки с обратными кавычками. Теперь например вместо конкатенации с кучей плюсов и открытий/закрытий кавычек
console.log('Переменная 1 = ' + variables[1] + '. Переменная 2 = ' + variables[2])
удобнее писать и читабельнее читать:
console.log(`Переменная 1 = ${variables[1]}. Переменная 2 = ${variables[2]}`)
Проверка нажатия любой из клавиш клавиатуры:document.addEventListener('keydown', function(e){
alert(`Нажата клавиша: ${e.keyCode}`); //
});
Лучше его не использовать. Это связано с тем, что onXXX могут существовать только в единственном экземпляре — когда присваиваем функцию document.onkeydown = function(e){ .... }, мы таким образом заменяем предыдущую функцию. Т.е. если два плагина будут использовать document.onkeydown одновременно, то код первого плагина не выполнится.
document.onkeydown = function(e){
alert(`Нажата клавиша: ${e.keyCode}`); //
};
Проверка нажатия любой из клавиш мыши:document.addEventListener('mousedown', function(e){
alert(`Координата Х: ${e.clientX}, Координата Y: ${e.clientY}`);
});
Лучше его не использовать. Это связано с тем, что onXXX могут существовать только в единственном экземпляре — когда присваиваем функцию document.onkeydown = function(e){ .... }, мы таким образом заменяем предыдущую функцию. Т.е. если два плагина будут использовать document.onkeydown одновременно, то код первого плагина не выполнится.
document.onmousedown = function(e){
alert(`Координата Х: ${e.clientX}, Координата Y: ${e.clientY}`);
};
Изменение параметра события на определенное время (изменение прозрачности, параметра наложения)
var paramTime= function(id, param, value1, value2, time) {
$gameMap.event(id)[param] = value1;
setTimeout(function() {$gameMap.event(id)[param] = value2;}, time);
};
Вызов функции например для мигания события с ИД=10 на 70 миллисекунд:
paramTime(10, '_blendMode', 1, 0, 70);
Или например для повышения прозрачности события на столько же миллисекунд:
paramTime(10, '_opacity', 1, 0, 70);
Можно сделать анимацию с задержкой:
paramTime(10, '_animationId', 0, 1, 700);
Можно творить забавные вещи, например при вводе кода ниже событие "пойдет" сначала на клетку с координатами (10,1), а затем (10,3) Главное указать скорость побольше, чтобы событие успело до туда сбегать
paramTime(10, '_x', 10, 10, 700);
paramTime(10, '_y', 1, 3, 700);
Взяв это на заметку, получаем своего рода простенький плагин "поиска пути" (кривой и без анимации ходьбы)
paramTime(10, '_x', $gameMap.event(10).x, 10, 700);
paramTime(10, '_y', $gameMap.event(10).y, 3, 700);
Сначала указав событию идти на клетку выше, и буквально через мгновение (70 миллисекунд) приказав ему идти обратно, мы можем эмулировать прыжок на месте:
paramTime(10, '_x', $gameMap.event(10).x,$gameMap.event(10).x, 70);
paramTime(10, '_y', $gameMap.event(10).y-1, $gameMap.event(10).y, 70);
Итак, вызов плагина для задания маршрута событию,герою:
$gameMap.moveEvent(id, direction, amount);
, где id - номер события (или 0, если нужен герой), direction - направление, amount - количество повторений (например шагов)
Сама функция:Game_Map.prototype.moveEvent = function(id, direction, amount) {
if (id) {
var event = this.event(id);
}else {
var event = $gamePlayer;
};
if (!event) return;
var gc = Game_Character;
var route = { list: [] };
var code;
switch(direction){
case 0:{
code = gc.ROUTE_END;
break;
}
case 2:{
code = gc.ROUTE_MOVE_DOWN;
break;
}
case 4:{
code = gc.ROUTE_MOVE_LEFT;
break;
}
case 6:{
code = gc.ROUTE_MOVE_RIGHT;
break;
}
case 8:{
code = gc.ROUTE_MOVE_UP;
break;
}
case 12:{
code = gc.ROUTE_MOVE_FORWARD;
break;
}
}
for(var i = 0; code && i < amount; i++){
route.list[i] = { code: code };
}
route.list[amount] = {code: gc.ROUTE_END}; //Yuryol
route.skippable = true; //Yuryol
event.forceMoveRoute(route);
};
Возможность события с приоритетом "под персонажем" или "над персонажем"
проходить сквозь другое событие.
Когда еще был на эйсе не очень понимал, почему сделано так, что например событие птица не может пролететь над лошадью.
Случай с приоритетом "Под персонажем" более понятный: те же двери в таком случае будут пропускать события "под персонажем". Но особой надобности ставить этот приоритет событию не особо вижу, кроме как дать другим событиям проходить над ним.
Game_CharacterBase.prototype.isCollidedWithCharacters = function(x, y) {
if (this._priorityType==0 || this._priorityType==2) return false;
return this.isCollidedWithEvents(x, y) || this.isCollidedWithVehicles(x, y);
};
Движение события "вперед" по диагонали.
задать событию "поворот по-диагонали" в маршруте движения через скриптовую команду:
this.diagonalDirect = 1; // 1 - поворот вниз-влево,3 - вниз-вправо, 7 - влево-вверх, 9 - вправо-вверх
или в другом событии через скриптовую команду:
$gameMap.event(id).diagonalDirect = 9;
После этого при указании в маршруте "вперед" событие будет двигаться по диагонали
Сама функция:
var YuryolmoveForward = Game_Character.prototype.moveForward;
Game_Character.prototype.moveForward = function() {
switch (this.diagonalDirect) {
case 1:
this.moveDiagonally(4, 2);
break;
case 3:
this.moveDiagonally(6, 2);
break;
case 7:
this.moveDiagonally(4, 8);
break;
case 9:
this.moveDiagonally(6, 8);
break;
default:
this.moveStraight(this.direction());
break;
}
};
Добавление чего-либо сразу после загрузки карты
var YuryolStart = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
YuryolStart.call(this);
//вставляем что хотим:
$gameVariables.setValue(1, 0); //например, обнуляем 1-ую переменную
};
Пропустить титульный экран, автоматически начиная новую игру.
Спасибо Ноксу
Scene_Title.prototype.start = function() {
this.commandNewGame();
};