Для начинающих программистов-мукеристов 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].id
индекса чарсета лидера партии:
Код:
$gameParty.leader()._characterIndex;
имя чарсета лидера партии:
Код:
$gameParty.leader()._characterName;
Смена графики лидера партии. Не забудьте обновить ее, добавив второй строчкой "рефреш".
Код:
$gameParty.leader().setCharacterImage('Actor1', 7);
$gamePlayer.refresh();
Для того, чтобы проверить экипировку, имя чарсета и т.д. не лидера а 2-4 члена партии, следует заменить в вышеизложенных кодах $gameParty.leader() на:
Код:
$gameParty.members()[ИД]
Перед этим лучше вставить проверку на существования этого члена партии:
Код:
$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 note;
var list = eventID.page().list;
for (var i = 0; i < list.length; i++) {
if (list[i].code === 108 || list[i].code === 408) {
note = list[i].parameters[0];
if (eventID.page().list[i].parameters[0]==tag){
console.log('wcdc');
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
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: ['script']" - нужен только в случае, когда код 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.
Код:
$gameMap.tileId(x, y, z)
Возвращает заметку тайлсета БД
Код:
$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]}`)
Изменение параметра события на определенное время (изменение прозрачности, параметра наложения)
PHP код:
var paramTime= function(id, param, value1, value2, time) {
$gameMap.event(id)[param] = value1;
setTimeout(function() {$gameMap.event(id)[param] = value2;}, time);
};
Вызов функции например для мигания события с ИД=10 на 70 миллисекунд:
PHP код:
paramTime(10, '_blendMode', 1, 0, 70);
Или например для повышения прозрачности события на столько же миллисекунд:
PHP код:
paramTime(10, '_opacity', 1, 0, 70);
Можно сделать анимацию с задержкой:
PHP код:
paramTime(10, '_animationId', 0, 1, 700);
Можно творить забавные вещи, например при вводе кода ниже событие "пойдет" сначала на клетку с координатами (10,1), а затем (10,3) Главное указать скорость побольше, чтобы событие успело до туда сбегать
PHP код:
paramTime(10, '_x', 10, 10, 700);
paramTime(10, '_y', 1, 3, 700);
Взяв это на заметку, получаем своего рода простенький плагин "поиска пути" (кривой и без анимации ходьбы)
PHP код:
paramTime(10, '_x', $gameMap.event(10).x, 10, 700);
paramTime(10, '_y', $gameMap.event(10).y, 3, 700);
Сначала указав событию идти на клетку выше, и буквально через мгновение (70 миллисекунд) приказав ему идти обратно, мы можем эмулировать прыжок на месте:
PHP код:
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);
Вызов плагина для задания маршрута событию,герою:
PHP код:
$gameMap.moveEvent(id, direction, amount);
, где id - номер события (или 0, если нужен герой), direction - направление, amount - количество повторений (например шагов)
Сама функция:
PHP код:
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);
};
Движение события "вперед" по диагонали.
Как известно, при указания в маршруте события движения "вперед", событие будет двигаться только туда, куда оно направлено. При этом команд "повернуться по-диагонали" нет, хотя движение по-диагонали задать можно.
Функция ниже исправляет этот недочет. Теперь можно задать событию "поворот по-диагонали" в маршруте движения через скриптовую команду:
PHP код:
this.diagonalDirect = 1; // 1 - поворот вниз-влево,3 - вниз-вправо, 7 - влево-вверх, 9 - вправо-вверх
или в другом событии через скриптовую команду:
PHP код:
$gameMap.event(id).diagonalDirect = 9;
После этого при указании в маршруте "вперед" событие будет двигаться по диагонали
Сама функция:
PHP код:
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;
}
};
Добавление чего-либо сразу после загрузки карты
Бывает, что после загрузки новой карты требуется сделать постоянно одно и тоже. Например, обнулять одни и те же переменные или проверять день или ночь в игре. Вместо того, чтоб на каждую новую карту вставлять автособытие, можно просто всё это добавить в скрипт:
PHP код:
var YuryolStart = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
YuryolStart.call(this);
//вставляем что хотим:
$gameVariables.setValue(1, 0); //например, обнуляем 1-ую переменную
};
Социальные закладки