white-thirst/www/js/plugins/GamepadConfig.js
2024-11-28 12:18:46 -06:00

621 lines
20 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Gamepad Config
// GamepadConfig.js
// Version: 1.00
//=============================================================================
var Imported = Imported || {};
Imported.GamepadConfig = true;
var Yanfly = Yanfly || {};
Yanfly.GamepadConfig = Yanfly.GamepadConfig || {};
//=============================================================================
/*:
* @plugindesc v1.00 Allows players to adjust their button configuration
* for gamepads.
* @author Yanfly Engine Plugins
*
* @param Command Name
* @desc This is the option name that appears in the main menu.
* @default Gamepad Config
*
* @param Button Name
* @desc This is how a button name will appear in the config menu.
* @default Button %1
*
* @param OK Button
* @desc This is the command name for the OK button.
* @default OK / Talk
*
* @param OK Help
* @desc This is the help description for the OK button.
* @default Used to accept menu actions and talk to people.
*
* @param Cancel Button
* @desc Cancel Button
* @desc This is the command name for the Cancel button.
* @default Cancel
*
* @param Cancel Help
* @desc This is the help description for the Cancel button.
* @default Used to cancel menu actions.
*
* @param Shift Button
* @desc This is the command name for the Shift button.
* @default Dash
*
* @param Shift Help
* @desc This is the help description for the Shift button.
* @default Hold this button to dash on the field.
*
* @param Menu Button
* @desc This is the command name for the Menu button.
* @default Menu
*
* @param Menu Help
* @desc This is the help description for the Menu button.
* @default Access the Main Menu from the field.
*
* @param PageUp Button
* @desc This is the command name for the Page Up button.
* @default Page Up
*
* @param PageUp Help
* @desc This is the help description for the Page Up button.
* @default Use it to quickly scroll up menus.
*
* @param PageDown Button
* @desc This is the command name for the Page Down button.
* @default Page Down
*
* @param PageDown Help
* @desc This is the help description for the Page Down button.
* @default Use it to quickly scroll down menus.
*
* @param Reset Default
* @desc This is the command name to reset the config to default.
* @default Reset to Default
*
* @param Reset Help
* @desc This is the help description for the Reset button.
* @default Returns your controller to default settings.
*
* @param Finish Config
* @desc This is the command name for the finish button.
* @default Finish Configuration
*
* @param Finish Help
* @desc This is the help description for the Finish button.
* @default Are you done configuring your gamepad?
*
* @help
* Adds a "Gamepad Config" option to the Options Menu if a gamepad is detected.
* Players can then adjust the button configuration to their liking and it will
* be loaded automatically each time they play the game. Keep in mind that if
* at any point where a Gamepad is not detected inside of the Option or Gamepad
* Config menu, the game will automatically eject the player out the prevent
* the player from being locked inside.
*/
/*:ja
* @plugindesc ゲームパッド向けにボタンコンフィグを行なうプラグインです。
* @author Yanfly Engine Plugins
*
* @param Command Name
* @desc メインメニューに表示されるオプション名を変更できます
* @default Gamepad Config
*
* @param Button Name
* @desc コンフィグメニューでのボタン名の表示方法を変更できます
* @default Button %1
*
* @param OK Button
* @desc OKボタンに対するコマンド名を変更できます
* @default OK / Talk
*
* @param OK Help
* @desc OKボタンに対するヘルプを設定できます
* @default メニューの決定/人に話しかける際に使うボタンです
*
* @param Cancel Button
* @desc キャンセルボタン
* @desc キャンセルボタンに対するコマンド名を変更できます
* @default Cancel
*
* @param Cancel Help
* @desc キャンセルボタンに対するヘルプを設定できます
* @default メニューアクションをキャンセルする際に使うボタンです
*
* @param Shift Button
* @desc シフトボタンに対するコマンド名を変更できます
* @default ダッシュ
*
* @param Shift Help
* @desc シフトボタンに対するヘルプを設定できます
* @default 長押しするとフィールド上をダッシュできます
*
* @param Menu Button
* @desc メニューボタンに対するコマンド名を変更できます
* @default Menu
*
* @param Menu Help
* @desc メニューボタンに対するヘルプを設定できます
* @default フィールドからメインメニューにアクセスします
*
* @param PageUp Button
* @desc ページアップボタンに対するコマンド名を変更できます
* @default Page Up
*
* @param PageUp Help
* @desc ページアップボタンに対するヘルプを設定できます
* @default メニューを素早くスクロールアップできます
*
* @param PageDown Button
* @desc ページダウンボタンに対するコマンド名を変更できます
* @default Page Down
*
* @param PageDown Help
* @desc ページダウンボタンに対するヘルプを設定できます
* @default メニューを素早くスクロールダウンできます
*
* @param Reset Default
* @desc コンフィグをリセットする際のコマンド名を変更できます
* @default Reset to Default
*
* @param Reset Help
* @desc リセットボタンに対するヘルプを設定できます
* @default コントローラコンフィグをデフォルトに戻します
*
* @param Finish Config
* @desc コンフィグを完了する際のコマンド名を変更できます
* @default Finish Configuration
*
* @param Finish Help
* @desc 完了ボタンに対するヘルプを設定できます
* @default ゲームパッドのコンフィグを完了しますか?
*
* @help
* ゲームパッドが使用される場合、
* "Gamepad Config"をオプションメニューに追加してください。
* プレイヤーは好みのコンフィグ設定を行うことができ、
* その設定は毎回プレイ時に自動的にロードされます。
*
* ゲームパッドがオプションやゲームパッドコンフィグから検出されなくなると、
* ゲームは自動的にプレイヤーを排出し、ゲーム内に閉じ込められることを防ぎます。
*
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters("GamepadConfig");
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.GamepadConfigName = String(Yanfly.Parameters["Command Name"]);
Yanfly.Param.GamepadConfigButton = String(Yanfly.Parameters["Button Name"]);
Yanfly.Param.GamepadConfigOkTx = String(Yanfly.Parameters["OK Button"]);
Yanfly.Param.GamepadConfigOkHelp = String(Yanfly.Parameters["OK Help"]);
Yanfly.Param.GamepadConfigCancelTx = String(Yanfly.Parameters["Cancel Button"]);
Yanfly.Param.GamepadConfigCancelHelp = String(Yanfly.Parameters["Cancel Help"]);
Yanfly.Param.GamepadConfigShiftTx = String(Yanfly.Parameters["Shift Button"]);
Yanfly.Param.GamepadConfigShiftHelp = String(Yanfly.Parameters["Shift Help"]);
Yanfly.Param.GamepadConfigMenuTx = String(Yanfly.Parameters["Menu Button"]);
Yanfly.Param.GamepadConfigMenuHelp = String(Yanfly.Parameters["Menu Help"]);
Yanfly.Param.GamepadConfigPgUpTx = String(Yanfly.Parameters["PageUp Button"]);
Yanfly.Param.GamepadConfigPgUpHelp = String(Yanfly.Parameters["PageUp Help"]);
Yanfly.Param.GamepadConfigPgDnTx = String(Yanfly.Parameters["PageDown Button"]);
Yanfly.Param.GamepadConfigPgDnHelp = String(Yanfly.Parameters["PageDown Help"]);
Yanfly.Param.GamepadConfigResetTx = String(Yanfly.Parameters["Reset Default"]);
Yanfly.Param.GamepadConfigResetHelp = String(Yanfly.Parameters["Reset Help"]);
Yanfly.Param.GamepadConfigFinishTx = String(Yanfly.Parameters["Finish Config"]);
Yanfly.Param.GamepadConfigFinishHelp = String(Yanfly.Parameters["Finish Help"]);
//=============================================================================
// Input
//=============================================================================
Input.getPressedGamepadButton = function () {
if (Yanfly.Param.GamepadTimer > 0) {
Yanfly.Param.GamepadTimer -= 1;
return -1;
}
if (navigator.getGamepads) {
var gamepads = navigator.getGamepads();
if (gamepads) {
for (var i = 0; i < gamepads.length; i++) {
var gamepad = gamepads[i];
if (gamepad && gamepad.connected) {
return this.gamepadButtonId(gamepad);
}
}
}
}
return -1;
};
Input.gamepadButtonId = function (gamepad) {
var buttons = gamepad.buttons;
for (var i = 0; i < buttons.length; i++) {
if (buttons[i].pressed) return i;
}
return -1;
};
Input.getGamepadButton = function (type) {
for (var i = 0; i < 12; ++i) {
if (Input.gamepadMapper[i] === type) return i;
}
return null;
};
Input.isControllerConnected = function () {
if (navigator.getGamepads) {
var gamepads = navigator.getGamepads();
if (gamepads) {
for (var i = 0; i < gamepads.length; i++) {
var gamepad = gamepads[i];
if (gamepad && gamepad.connected) return true;
}
}
}
return false;
};
//=============================================================================
// ConfigManager
//=============================================================================
ConfigManager.gamepadInput = {
0: "ok",
1: "cancel",
2: "shift",
3: "menu",
4: "pageup",
5: "pagedown",
12: "up",
13: "down",
14: "left",
15: "right",
};
Yanfly.GamepadConfig.ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
var config = Yanfly.GamepadConfig.ConfigManager_makeData.call(this);
config.gamepadInput = this.gamepadInput;
return config;
};
Yanfly.GamepadConfig.ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
Yanfly.GamepadConfig.ConfigManager_applyData.call(this, config);
this.gamepadInput = this.readGamepadConfig(config, "gamepadInput");
this.applyGamepadConfig();
};
ConfigManager.applyGamepadConfig = function () {
Input.gamepadMapper = this.gamepadInput;
Input.update();
Input.clear();
};
ConfigManager.readGamepadConfig = function (config, name) {
var value = config[name];
if (value !== undefined) {
return value;
} else {
return {
0: "ok",
1: "cancel",
2: "shift",
3: "menu",
4: "pageup",
5: "pagedown",
12: "up",
13: "down",
14: "left",
15: "right",
};
}
};
//=============================================================================
// Window_MenuCommand
//=============================================================================
Yanfly.GamepadConfig.Window_Options_addGeneralOptions =
Window_Options.prototype.addGeneralOptions;
Window_Options.prototype.addGeneralOptions = function () {
Yanfly.GamepadConfig.Window_Options_addGeneralOptions.call(this);
this.addGameConfigCommand();
};
Window_Options.prototype.addGameConfigCommand = function () {
if (Input.isControllerConnected()) {
this.addCommand(Yanfly.Param.GamepadConfigName, "gamepadConfig", true);
this._addedController = true;
}
};
Yanfly.GamepadConfig.Window_Options_update = Window_Options.prototype.update;
Window_Options.prototype.update = function () {
Yanfly.GamepadConfig.Window_Options_update.call(this);
if (this._addedController && !Input.isControllerConnected()) {
this.refresh();
this.height = this.windowHeight();
this.updatePlacement();
}
};
Yanfly.GamepadConfig.Window_Options_drawItem =
Window_Options.prototype.drawItem;
Window_Options.prototype.drawItem = function (index) {
if (this.commandSymbol(index) === "gamepadConfig") {
var rect = this.itemRectForText(index);
var text = this.commandName(index);
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawText(text, rect.x, rect.y, rect.width, "left");
} else {
Yanfly.GamepadConfig.Window_Options_drawItem.call(this, index);
}
};
Yanfly.GamepadConfig.Window_Options_processOk =
Window_Options.prototype.processOk;
Window_Options.prototype.processOk = function () {
if (this.commandSymbol(this.index()) === "gamepadConfig") {
Window_Command.prototype.processOk.call(this);
} else {
Yanfly.GamepadConfig.Window_Options_processOk.call(this);
}
};
//=============================================================================
// Window_GamepadConfig
//=============================================================================
function Window_GamepadConfig() {
this.initialize.apply(this, arguments);
}
Window_GamepadConfig.prototype = Object.create(Window_Command.prototype);
Window_GamepadConfig.prototype.constructor = Window_GamepadConfig;
Window_GamepadConfig.prototype.initialize = function (helpWindow) {
var wy = helpWindow.height;
Window_Command.prototype.initialize.call(this, 0, wy);
this.setHelpWindow(helpWindow);
this.height = Graphics.boxHeight - wy;
this.refresh();
this.activate();
this.select(0);
};
Window_GamepadConfig.prototype.windowWidth = function () {
return Graphics.boxWidth;
};
Window_GamepadConfig.prototype.makeCommandList = function (index) {
for (var i = 0; i < 6; ++i) {
var text = this.getButtonTypeText(i);
this.addCommand(text, "button", true);
}
this.addCommand("", "filler", true);
this.addCommand(this.getButtonTypeText(7), "reset", true);
this.addCommand(this.getButtonTypeText(8), "finish", true);
};
Window_GamepadConfig.prototype.drawItem = function (index) {
if (index > 5) {
Window_Command.prototype.drawItem.call(this, index);
} else {
var rect = this.itemRectForText(index);
var align = this.itemTextAlign();
var ww = rect.width / 2;
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawText(this.commandName(index), rect.x, rect.y, ww, align);
var text = this.getButtonConfig(index);
this.drawText(text, rect.x + ww, rect.y, ww, align);
}
};
Window_GamepadConfig.prototype.getButtonTypeText = function (index) {
if (index === 0) return Yanfly.Param.GamepadConfigOkTx;
if (index === 1) return Yanfly.Param.GamepadConfigCancelTx;
if (index === 2) return Yanfly.Param.GamepadConfigShiftTx;
if (index === 3) return Yanfly.Param.GamepadConfigMenuTx;
if (index === 4) return Yanfly.Param.GamepadConfigPgUpTx;
if (index === 5) return Yanfly.Param.GamepadConfigPgDnTx;
if (index === 7) return Yanfly.Param.GamepadConfigResetTx;
if (index === 8) return Yanfly.Param.GamepadConfigFinishTx;
return "";
};
Window_GamepadConfig.prototype.getButtonConfig = function (index) {
if (index > 5) return "";
var key = this.getButtonKey(index);
var button = Input.getGamepadButton(key);
return Yanfly.Param.GamepadConfigButton.format(button);
};
Window_GamepadConfig.prototype.getButtonKey = function (index) {
if (index === 0) return "ok";
if (index === 1) return "cancel";
if (index === 2) return "shift";
if (index === 3) return "menu";
if (index === 4) return "pageup";
if (index === 5) return "pagedown";
};
Window_GamepadConfig.prototype.itemTextAlign = function () {
return "center";
};
Window_GamepadConfig.prototype.clearButtonConfig = function (index) {
var rect = this.itemRectForText(index);
rect.x += rect.width / 2;
rect.width /= 2;
this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
};
Window_GamepadConfig.prototype.updateHelp = function () {
if (!this._helpWindow) return;
switch (this.index()) {
case 0:
this._helpWindow.setText(Yanfly.Param.GamepadConfigOkHelp);
break;
case 1:
this._helpWindow.setText(Yanfly.Param.GamepadConfigCancelHelp);
break;
case 2:
this._helpWindow.setText(Yanfly.Param.GamepadConfigShiftHelp);
break;
case 3:
this._helpWindow.setText(Yanfly.Param.GamepadConfigMenuHelp);
break;
case 4:
this._helpWindow.setText(Yanfly.Param.GamepadConfigPgUpHelp);
break;
case 5:
this._helpWindow.setText(Yanfly.Param.GamepadConfigPgDnHelp);
break;
case 7:
this._helpWindow.setText(Yanfly.Param.GamepadConfigResetHelp);
break;
case 8:
this._helpWindow.setText(Yanfly.Param.GamepadConfigFinishHelp);
break;
default:
this._helpWindow.clear();
break;
}
};
//=============================================================================
// Scene_Options
//=============================================================================
Yanfly.GamepadConfig.Scene_Options_createOptionsWindow =
Scene_Options.prototype.createOptionsWindow;
Scene_Options.prototype.createOptionsWindow = function () {
Yanfly.GamepadConfig.Scene_Options_createOptionsWindow.call(this);
this._optionsWindow.setHandler(
"gamepadConfig",
this.commandGamepadConfig.bind(this)
);
};
Scene_Options.prototype.commandGamepadConfig = function () {
SceneManager.push(Scene_GamepadConfig);
};
//=============================================================================
// Scene_GamepadConfig
//=============================================================================
function Scene_GamepadConfig() {
this.initialize.apply(this, arguments);
}
Scene_GamepadConfig.prototype = Object.create(Scene_MenuBase.prototype);
Scene_GamepadConfig.prototype.constructor = Scene_GamepadConfig;
Scene_GamepadConfig.prototype.initialize = function () {
Scene_MenuBase.prototype.initialize.call(this);
};
Scene_GamepadConfig.prototype.create = function () {
Scene_MenuBase.prototype.create.call(this);
this.createHelpWindow();
this.createGamepadConfigWindow();
};
Scene_GamepadConfig.prototype.terminate = function () {
Scene_MenuBase.prototype.terminate.call(this);
ConfigManager.save();
};
Scene_GamepadConfig.prototype.update = function () {
Scene_MenuBase.prototype.update.call(this);
this.updateAttachedController();
this.updateButtonConfig();
this.updateAfterConfig();
};
Scene_GamepadConfig.prototype.updateAttachedController = function () {
if (Input.isControllerConnected()) return;
this.popScene();
};
Scene_GamepadConfig.prototype.createGamepadConfigWindow = function () {
this._configWindow = new Window_GamepadConfig(this._helpWindow);
this._configWindow.setHandler("button", this.commandButton.bind(this));
this._configWindow.setHandler("reset", this.commandReset.bind(this));
this._configWindow.setHandler("finish", this.popScene.bind(this));
this.addWindow(this._configWindow);
};
Scene_GamepadConfig.prototype.commandButton = function () {
var index = this._configWindow.index();
this._configWindow.clearButtonConfig(index);
this._configEnabled = true;
Yanfly.Param.GamepadTimer = 12;
};
Scene_GamepadConfig.prototype.commandReset = function () {
ConfigManager.gamepadInput = {
0: "ok",
1: "cancel",
2: "shift",
3: "menu",
4: "pageup",
5: "pagedown",
12: "up",
13: "down",
14: "left",
15: "right",
};
ConfigManager.applyGamepadConfig();
this.refreshWindows();
};
Scene_GamepadConfig.prototype.refreshWindows = function () {
this._configWindow.refresh();
this._configWindow.activate();
ConfigManager.save();
};
Scene_GamepadConfig.prototype.updateButtonConfig = function () {
if (!this._configEnabled) return;
var buttonId = Input.getPressedGamepadButton();
if (buttonId > 11) return;
if (buttonId >= 0) this.applyButtonConfig(buttonId);
};
Scene_GamepadConfig.prototype.applyButtonConfig = function (buttonId) {
this._configEnabled = false;
var index = this._configWindow.index();
var newConfig = this._configWindow.getButtonKey(index);
var formerConfig = Input.gamepadMapper[buttonId];
var formerButton = Input.getGamepadButton(newConfig);
ConfigManager.gamepadInput[buttonId] = newConfig;
ConfigManager.gamepadInput[formerButton] = formerConfig;
ConfigManager.applyGamepadConfig();
this._configTimer = 12;
};
Scene_GamepadConfig.prototype.updateAfterConfig = function () {
if (!this._configTimer) return;
if (--this._configTimer > 0) return;
SoundManager.playEquip();
this.refreshWindows();
};
//=============================================================================
// End of File
//=============================================================================