//============================================================================= // AO_EnemyAlignment.js //============================================================================= // Copyright (c) 2020 AO /* 2020/2/13 ver 1.00 初版 2020/3/2 ver 1.001 ヘルプ記載を修正 */ /*: * @plugindesc 敵グループを整列させる * @author AO * @help AO_EnemyAlignment.js ver 1.001 * エネミーの配置をイベントの注釈で設定可能にします * * 敵グループ設定内バトルイベントの注釈に * 位置情報を記載することで、戦闘開始時の敵位置を * 設定できるようにします * * バトルイベントに注釈コマンドで以下のように記載してください * * グループに加えた順番:画面x座標,画面y座標; * * * ※注意 * 座標は敵画像のアンカー位置(画像の基準位置)を指定します * デフォルトのアンカー位置は敵画像の下端中央です * * 例) * 1番目の敵をx座標100,y座標400に配置 * 2番目の敵をx座標100,y座標600に配置 * * 1:100,400; * 2:100,600; * * * このプラグインにプラグインコマンドはありません * ライセンスはMIT * 改変歓迎です */ /* TODO screenX,screenY,の書き換えはなんか副作用あるのかな?必要ならSprite_EnemyのsetHomeにデータを送れるように改変を。 */ (function() { 'use strict'; const pluginName = 'AO_EnemyAlignment'; const parameters = PluginManager.parameters(pluginName); function getArgNumber(arg) { arg = arg.replace(/^\s+|\s+$/g,''); if (typeof arg === "string" && /^([1-9]\d*|0)(\.\d+)?$/g.test(arg)) { return parseFloat(arg || '0'); } return 0; } //全てのページの注釈文字列を返すユーティリティ。引数は$dataEvent、$dataTroop、あとは何でいけるかしらん function getComment(gameData) { let result = ""; for (let i = 0; i < gameData.pages.length; i++) { let page = gameData.pages[i] for (let j = 0; i < page.list.length; i++) { let command = page.list[i]; if (command && (command.code === 108 || command.code === 408)){ result += command.parameters[0]; } } } return result; } function createAlignmentObject(alignmentStr) { const alignment = {}; const regExp = /\d+/g; //実はタグで囲まれた中の整数値を順番に抽出してるだけ! let result = regExp.exec(alignmentStr); alignment["index"] = result ? getArgNumber(result[0]) : NaN; result = regExp.exec(alignmentStr); alignment["x"] = result ? getArgNumber(result[0]) : NaN; result = regExp.exec(alignmentStr); alignment["y"] = result ? getArgNumber(result[0]) : NaN; return alignment; } function getAlignmentStatusArr(commentStr) { const commentList = commentStr.match(/((?:(?!)[\s|\S])+)<\/sethome>/gi); const alignmentStatusArr = []; if (commentList) { for (let i = 0; i < commentList.length; i++) { //区切り文字";"でsplitして配列にしている。他の文字に変えたければここで const alignmentStatusList = commentList[i].replace(/<([^<]+)>/g, '').split(/;/g); for (let j = 0; j < alignmentStatusList.length; j++) { const alignmentStr = alignmentStatusList[j]; if (alignmentStr) {alignmentStatusArr.push(createAlignmentObject(alignmentStr));} } } } return alignmentStatusArr; } const _Game_Troop_setup = Game_Troop.prototype.setup; Game_Troop.prototype.setup = function(troopId) { _Game_Troop_setup.apply(this, arguments); this.setCommentHome(); }; Game_Troop.prototype.setCommentHome = function() { const members = this.members(); getAlignmentStatusArr(getComment(this.troop())).forEach(function(alignment) { if (!isNaN(alignment.index) && !isNaN(alignment.x) && !isNaN(alignment.y)) { if (members.length >= alignment.index) { const member = this.members()[alignment.index - 1]; member._screenX = alignment.x; member._screenY = alignment.y; } } }.bind(this)); }; })();