alter-egoism/js/plugins/KRD_MZ_InputRange.js
2025-11-02 12:24:27 -06:00

1223 lines
40 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:
* @target MZ
* @plugindesc 音量調節スライダー
* @url https://twitter.com/kuroudo119/
* @url https://github.com/kuroudo119/RPGMZ-Plugin
* @author kuroudo119 (くろうど)
*
*
* @help
音量調節スライダー
*
*
*/
(function () {
// ####################################################
// ################# アイテムの種類 ####################
// ####################################################
Scene_Options.prototype.create = function () {
Scene_MenuBase.prototype.create.call(this);
this.createCharaVoiceWindow();
this.createOptionsWindow();
this.createCategoryWindow();
this._categoryWindow.setItemWindow(this._itemWindow);
this._categoryWindow.setVoiceWindow(this._charaVoiceWindow);
this._charaVoiceWindow.setItemWindow(this._itemWindow);
this._itemWindow.setVoiceWindow(this._charaVoiceWindow);
};
// 背景
Scene_Options.prototype.createBackground = function () {
this._backgroundSprite = new Sprite();
this._backgroundSprite.bitmap = ImageManager.loadSystem("option_back");
this.addChild(this._backgroundSprite);
this._backgroundTextSprite = new Sprite(new Bitmap(Graphics.width, Graphics.height));
var b = this._backgroundTextSprite.bitmap;
b.fontFace = "serif";
b.fontSize = 32;
b.textColor = "#000000";
b.drawTextM("Configuration", 22, 20, 200, 22, "center");
this.addChild(this._backgroundTextSprite);
};
Scene_Options.prototype.popScene = function () {
// コンフィグを閉じるとき共通変数としてセーブ
ConfigManager.saveCommonVariables();
SceneManager.pop();
};
Scene_Options.prototype.createCategoryWindow = function () {
const rect = this.categoryWindowRect();
this._categoryWindow = new Window_OptionCategory(rect);
this._categoryWindow.setHandler("ok", this.onCategoryOk.bind(this));
this._categoryWindow.setHandler("cancel", this.popScene.bind(this));
this.addWindow(this._categoryWindow);
};
Scene_Options.prototype.onCategoryOk = function () {
this._itemWindow.activate();
this._itemWindow.select(0);
};
Scene_Options.prototype.createOptionsWindow = function () {
const rect = this.optionsWindowRect();
this._itemWindow = new Window_Options(rect);
this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
this.addWindow(this._itemWindow);
};
Scene_Options.prototype.onItemCancel = function () {
this._itemWindow.deselect();
this._categoryWindow.activate();
};
Scene_Options.prototype.charaVoiceWindowRect = function () {
const ww = 1144;
const wh = 320;
const wx = (Graphics.boxWidth - ww) / 2;
const wy = 400;
return new Rectangle(wx, wy, ww, wh);
};
Scene_Options.prototype.createCharaVoiceWindow = function () {
const rect = this.charaVoiceWindowRect();
this._charaVoiceWindow = new Window_CharaVoice(rect);
this._charaVoiceWindow.setHandler("cancel", this.onCharaVoiceCancel.bind(this));
this._charaVoiceWindow.zIndex = 3000;
//this._charaVoiceWindow.setHandler("ok", this.onCharaVoiceOk.bind(this));
this.addWindow(this._charaVoiceWindow);
};
Scene_Options.prototype.onCharaVoiceCancel = function () {
this._charaVoiceWindow.deselect();
//this._charaVoiceWindow.hide();
this._itemWindow.activate();
};
Scene_Options.prototype.categoryWindowRect = function () {
const wx = 270;
const wy = -6;
const ww = 750;
const wh = 58 + 8;
return new Rectangle(wx, wy, ww, wh);
};
Scene_Options.prototype.optionsWindowRect = function () {
const n = Math.min(this.maxCommands(), this.maxVisibleCommands());
const ww = 1050;
const wh = 450;
const wx = (Graphics.boxWidth - ww) / 2;
const wy = 110;
return new Rectangle(wx, wy, ww, wh);
};
const Scene_Options_start = Scene_Options.prototype.start;
Scene_Options.prototype.start = function () {
Scene_Options_start.apply(this, arguments);
if (!bgm_show) {
bgm_show = true;
const x = BASE_X - 100;
const y = BASE_Y - 427;
const lineHeight = BASE_LINE_HEIGHT + 4;
this._bgmRange = new InputRange(
AudioManager.bgmVolume,
x,
y + lineHeight * 0,
this._itemWindow,
"bgmVolume",
"bgmVolume",
"optGauge sound"
);
this._bgsRange = new InputRange(
AudioManager.bgsVolume,
x,
y + lineHeight * 1,
this._itemWindow,
"bgsVolume",
"bgsVolume",
"optGauge sound"
);
this._seRange = new InputRange(AudioManager.seVolume, x, y + lineHeight * 2, this._itemWindow, "seVolume", "seVolume", "optGauge sound");
this._meRange = new InputRange(AudioManager.meVolume, x, y + lineHeight * 3, this._itemWindow, "meVolume", "meVolume", "optGauge sound");
this._msOpacityVolume = new InputRange(
ConfigManager.msOpacityVolume,
x,
y + lineHeight * 0,
this._itemWindow,
"msOpacityVolume",
"msOpacityVolume",
"optGauge system_2"
);
this._autoMsSpeedVolume = new InputRange(
ConfigManager.autoMsSpeedVolume,
x,
y + lineHeight * 2,
this._itemWindow,
"autoMsSpeedVolume",
"autoMsSpeedVolume",
"optGauge system_2"
);
}
};
const Scene_Options_terminate = Scene_Options.prototype.terminate;
Scene_Options.prototype.terminate = function () {
Scene_Options_terminate.apply(this, arguments);
if (bgm_show) {
bgm_show = false;
// ↓作成したIDの""なしを引数にする
document.body.removeChild(bgmVolume.closest("div"));
document.body.removeChild(bgsVolume.closest("div"));
document.body.removeChild(seVolume.closest("div"));
document.body.removeChild(meVolume.closest("div"));
document.body.removeChild(msOpacityVolume.closest("div"));
document.body.removeChild(autoMsSpeedVolume.closest("div"));
}
};
function Window_OptionCategory() {
this.initialize(...arguments);
}
Window_OptionCategory.prototype = Object.create(Window_HorzCommand.prototype);
Window_OptionCategory.prototype.constructor = Window_OptionCategory;
Window_OptionCategory.prototype.initialize = function (rect) {
Window_HorzCommand.prototype.initialize.call(this, rect);
this._padding = 0;
this.refresh();
this.select(0);
this.activate();
};
Window_OptionCategory.prototype.maxCols = function () {
return 5;
};
//Only "Item" and "Key Items" as categories
Window_OptionCategory.prototype.makeCommandList = function () {
this.addCommand("System 1", "system_1");
this.addCommand("System 2", "system_2");
this.addCommand("Sound", "sound");
this.addCommand("Keypad", "key_pad");
this.addCommand("Gamepad", "game_pad");
};
Window_OptionCategory.prototype.setItemWindow = function (itemWindow) {
this._itemWindow = itemWindow;
};
Window_OptionCategory.prototype.setVoiceWindow = function (voiceWindow) {
this._voiceWindow = voiceWindow;
};
// 変更があったらカテゴリーを更新する
Window_OptionCategory.prototype.update = function () {
Window_HorzCommand.prototype.update.call(this);
if (this._itemWindow) {
this._itemWindow.setCategory(this.currentSymbol());
}
};
Window_OptionCategory.prototype._refreshAllParts = function () {
this._padding = 0;
//this._refreshBack();
//this._refreshFrame();
this._refreshCursor();
this._refreshArrows();
this._refreshPauseSign();
};
//カーソルの変更
Window_OptionCategory.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem("Window");
this.menu_item_skin = ImageManager.loadSystem("menu_item_categoly_select");
this.menu_cursor_skin = ImageManager.loadSystem("menu_item_categoly_cursor");
if (!this.menu_item_skin.isReady()) {
this.menu_item_skin.addLoadListener(() => {
this.refresh(); // 画像がロードされたら再描画
});
return;
}
};
Window_OptionCategory.prototype.lineHeight = function () {
return 58;
};
Window_OptionCategory.prototype._refreshCursor = function () {
const drect = this._cursorRect.clone();
const srect = { x: 0, y: 0, width: 126, height: 58 };
const m = 0;
for (const child of this._cursorSprite.children) {
child.bitmap = this.menu_cursor_skin;
}
this._setRectPartsGeometry(this._cursorSprite, srect, drect, m);
};
//カーソルを微調整、あとカーソルを常に不透明に
Window_OptionCategory.prototype._updateCursor = function () {
this._cursorSprite.alpha = 255;
this._cursorSprite.visible = this.isOpen() && this.cursorVisible;
this._cursorSprite.x = this._cursorRect.x;
this._cursorSprite.y = this._cursorRect.y - 4;
};
//未選択コマンドの背景を画像に
Window_OptionCategory.prototype.drawItemBackground = function (index) {
const rect = this.itemRect(index);
if (this.menu_item_skin.isReady()) {
const bitmap = this.menu_item_skin;
const dx = rect.x;
const dy = rect.y;
const dw = rect.width;
const dh = rect.height;
this.contentsBack.blt(bitmap, 0, 0, 126, 58, dx, dy - 4, dw, dh);
}
};
//カーソルが来た時、アイテムの文字名の色を変更する
Window_OptionCategory.prototype.drawItem = function (index) {
const rect = this.itemLineRect(index);
const align = this.itemTextAlign();
this.resetTextColor();
if (index == this._index) {
this.changeTextColor("#000000");
}
this.changePaintOpacity(this.isCommandEnabled(index));
//文字をちょっと下にする
this.drawTextS(this.commandName(index), rect.x, rect.y + 8, rect.width, align);
};
//セレクトするたびに背景をリフレッシュ
Window_OptionCategory.prototype.select = function (index) {
this._index = index;
if (this._voiceWindow) {
if (index == 2) {
this._voiceWindow.show();
} else {
this._voiceWindow.hide();
}
}
this.contents.clear();
this.contentsBack.clear();
this.drawAllItems();
this.refreshCursor();
this.callUpdateHelp();
};
//↑のセレクトでの不具合を出ないようにする
Window_OptionCategory.prototype.drawAllItems = function () {
this.contents.fontFace = "serif";
const topIndex = this.topIndex();
for (let i = 0; i < this.maxVisibleItems(); i++) {
const index = topIndex + i;
if (this._list && index < this.maxItems()) {
//選択ちゅうだけ背景なくす
if (i != this._index) {
this.drawItemBackground(index);
}
this.drawItem(index);
}
}
};
// Window_OptionCategory.prototype.playOkSound = function () {
// SoundManager.playOk();
// };
// #######################################################
// ################# オプション一覧 #######################
// #######################################################
const BASE_X = (Graphics.width || 1280) / 2;
const BASE_Y = (Graphics.height || 720) / 2 + 200;
const BASE_LINE_HEIGHT = 50;
let bgm_show = false;
Window_Options.prototype.initialize = function (rect) {
Window_Selectable.prototype.initialize.call(this, rect);
this._category = null;
this.refresh();
//this.select(0);
//this.activate();
// windowが重なっても透過させる
this._isWindow = false;
};
Window_Options.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem("Window");
this.menu_item_skin = ImageManager.loadSystem("config_item_select");
//this.menu_toggle_skin = ImageManager.loadSystem("config_toggle");
if (!this.menu_item_skin.isReady()) {
this.menu_item_skin.addLoadListener(() => {
this.refresh(); // 画像がロードされたら再描画
});
return;
}
};
Window_Options.prototype._refreshCursor = function () {
const drect = this._cursorRect.clone();
const srect = { x: 0, y: 40, width: 1027, height: 40 };
const m = 0;
for (const child of this._cursorSprite.children) {
child.bitmap = this.menu_item_skin;
}
this._setRectPartsGeometry(this._cursorSprite, srect, drect, m);
};
Window_Options.prototype.refreshCursor = function () {
if (this._cursorAll) {
this.refreshCursorForAll();
} else if (this.index() >= 0) {
const rect = this.itemRect(this.index());
this.setCursorRect(rect.x, rect.y, rect.width, rect.height);
} else {
this.setCursorRect(0, 0, 0, 0);
}
const index = this.index();
if (index != -1) {
const symbol = this.commandSymbol(index);
var dom = document.querySelectorAll(`.optRange_wrap`);
for (var i = 0; i < dom.length; i++) {
dom[i].closest("div").style.backgroundPosition = "0px -32px";
}
var dom = document.querySelector(`#${symbol}`);
if (dom) {
dom.closest("div").style.backgroundPosition = "0px 0px";
}
}
};
Window_Options.prototype._createAllParts = function () {
this._createContainer();
this._createBackSprite();
this._createFrameSprite();
this._createClientArea();
this._createContentsBackSprite();
this._createCursorSprite();
this._createToggleSprite();
this._createContentsSprite();
this._createArrowSprites();
this._createPauseSignSprites();
};
Window_Options.prototype._createToggleSprite = function () {
this._toggleSprite = [];
for (var i = 0; i < 8; i++) {
this._toggleSprite[i] = [];
for (var k = 0; k < 3; k++) {
this._toggleSprite[i][k] = new Sprite();
this._toggleSprite[i][k].bitmap = ImageManager.loadSystem("config_toggle");
this._toggleSprite[i][k].y = i * 54 + 11;
this._toggleSprite[i][k].x = 470 + k * 170;
this._toggleSprite[i][k].setFrame(0, 0, 0, 0);
this._clientArea.addChild(this._toggleSprite[i][k]);
}
}
};
Window_Options.prototype.drawAllItems = function () {
const topIndex = this.topIndex();
for (let i = 0; i < this.maxVisibleItems(); i++) {
const index = topIndex + i;
if (index < this.maxItems()) {
this.drawItemBackground(index);
this.drawItem(index);
}
}
for (var i = 0; i < 8; i++) {
if (!this._list[i]) {
this._toggleSprite[i][0].setFrame(0, 0, 0, 0);
this._toggleSprite[i][1].setFrame(0, 0, 0, 0);
this._toggleSprite[i][2].setFrame(0, 0, 0, 0);
continue;
}
const symbol = this.commandSymbol(i);
const value = this.getConfigValue(symbol);
if (typeof value === "boolean") {
this._toggleSprite[i][0].setFrame(0, value ? 0 : 32, 159, 32);
this._toggleSprite[i][1].setFrame(0, value ? 32 : 0, 159, 32);
this._toggleSprite[i][2].setFrame(0, 0, 0, 0);
} else if (this.commandExt(i) === "tri") {
this._toggleSprite[i][0].setFrame(0, value == 0 ? 0 : 32, 159, 32);
this._toggleSprite[i][1].setFrame(0, value == 1 ? 0 : 32, 159, 32);
this._toggleSprite[i][2].setFrame(0, value == 2 ? 0 : 32, 159, 32);
} else {
this._toggleSprite[i][0].setFrame(0, 0, 0, 0);
this._toggleSprite[i][1].setFrame(0, 0, 0, 0);
this._toggleSprite[i][2].setFrame(0, 0, 0, 0);
}
}
};
//未選択コマンドの背景を画像に
Window_Options.prototype.drawItemBackground = function (index) {
const rect = this.itemRect(index);
if (this.menu_item_skin) {
const bitmap = this.menu_item_skin;
const dx = rect.x;
const dy = rect.y;
const dw = rect.width;
const dh = rect.height;
this.contentsBack.blt(bitmap, 0, 0, 1027, 40, dx, dy, dw, dh);
}
};
Window_Options.prototype._refreshAllParts = function () {
//this._refreshBack();
//this._refreshFrame();
this._refreshCursor();
this._refreshArrows();
this._refreshPauseSign();
};
Window_Options.prototype.rowSpacing = function () {
return 4 + 10;
};
Window_Options.prototype.itemRect = function (index) {
const maxCols = this.maxCols();
const itemWidth = this.itemWidth();
const itemHeight = this.itemHeight() + 10;
const colSpacing = this.colSpacing();
const rowSpacing = this.rowSpacing();
const col = index % maxCols;
const row = Math.floor(index / maxCols);
const x = col * itemWidth + colSpacing / 2 - this.scrollBaseX();
const y = row * itemHeight + rowSpacing / 2 - this.scrollBaseY();
const width = itemWidth - colSpacing;
const height = itemHeight - rowSpacing;
return new Rectangle(x, y, width, height);
};
Window_Options.prototype.itemRectWithPadding = function (index) {
const rect = this.itemRect(index);
const padding = this.itemPadding();
rect.x += padding + 70;
rect.width -= padding * 2;
return rect;
};
Window_Options.prototype.setCategory = function (category) {
if (this._category !== category) {
this._category = category;
this.refresh();
this.scrollTo(0, 0);
var list = ["system_1", "system_2", "sound", "key_pad", "game_pad"];
for (var i = 0; i < list.length; i++) {
var doms = document.querySelectorAll(`.${list[i]}`);
doms.forEach((e) => {
if (e) {
e.style.display = "none";
}
});
}
var doms = document.querySelectorAll(`.${this._category}`);
doms.forEach((e) => {
if (e) {
e.style.display = "inline-block";
}
});
}
};
Window_Options.prototype.makeCommandList = function () {
if (this._category == "system_1") {
this.addGeneralOptions();
}
if (this._category == "system_2") {
this.addSystem_2Options();
}
if (this._category == "sound") {
this.addVolumeOptions();
}
if (this._category == "key_pad" || this._category == "game_pad") {
}
};
const ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
const config = ConfigManager_makeData.call(this);
config.screenEffects = this.screenEffects;
$gameSwitches.setValue(502, config.screenEffects);
config.battleEffects = this.battleEffects;
$gameSwitches.setValue(503, config.battleEffects);
config.autoDefeat = this.autoDefeat;
// 戦闘→1 選択肢→0 自動敗北→2
var ary = [1, 0, 2];
$gameVariables.setValue(502, ary[config.autoDefeat]);
config.hSkip = this.hSkip;
$gameSwitches.setValue(504, config.hSkip);
config.birthSkip = this.birthSkip;
$gameSwitches.setValue(505, config.birthSkip);
config.danmenSkip = this.danmenSkip;
$gameSwitches.setValue(506, config.danmenSkip);
config.msOpacityVolume = this.msOpacityVolume;
config.msSpeed = this.msSpeed;
config.autoMsSpeedVolume = this.autoMsSpeedVolume;
config.selectLimit = this.selectLimit;
$gameSwitches.setValue(507, config.selectLimit);
return config;
};
const ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
ConfigManager_applyData.call(this, config);
this.screenEffects = this.readFlag(config, "screenEffects", true);
this.battleEffects = this.readFlag(config, "battleEffects", true);
// this.autoDefeat = this.triIndex(config.autoDefeat);
this.hSkip = this.readFlag(config, "hSkip", true);
this.birthSkip = this.readFlag(config, "birthSkip", true);
this.danmenSkip = this.readFlag(config, "danmenSkip", true);
// this.msOpacityVolume = this.readVolume(config, "msOpacityVolume");
// this.msSpeed = this.triIndex(config.msSpeed);
// this.autoMsSpeedVolume = this.readVolume(config, "autoMsSpeedVolume");
this.selectLimit = this.readFlag(config, "selectLimit", true);
};
// コンフィグに新しい物を追加
ConfigManager.screenEffects = true;
ConfigManager.battleEffects = true;
ConfigManager.hSkip = true;
ConfigManager.danmenSkip = true; // スキップじゃなくて断面図を表示するって意味
ConfigManager.selectLimit = true;
// デフォルト値を設定
// ConfigManager の元の関数を保存
const _ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
_ConfigManager_applyData.call(this, config);
this.autoDefeat = config.autoDefeat ?? 1;
this.birthSkip = config.birthSkip ?? false;
this.msOpacityVolume = config.msOpacityVolume ?? 80;
this.msSpeed = config.msSpeed ?? 1;
this.autoMsSpeedVolume = config.autoMsSpeedVolume ?? 50;
this.bgmVolume = config.bgmVolume ?? 50;
this.bgsVolume = config.bgsVolume ?? 40;
this.seVolume = config.seVolume ?? 50;
this.meVolume = config.meVolume ?? 100;
};
ConfigManager.triIndex = function (index) {
if (isNaN(index)) {
return 0;
}
return Math.max(0, Math.min(2, index));
};
Window_Options.prototype.addGeneralOptions = function () {
this.addCommand(TextManager.alwaysDash, "alwaysDash");
this.addCommand(TextManager.commandRemember, "commandRemember");
this.addCommand("Screen Effects", "screenEffects");
this.addCommand("Battle Effects", "battleEffects");
this.addCommand("Event Battle Outcome Setting", "autoDefeat", true, "tri");
this.addCommand("Skip Previously Viewed H Scenes", "hSkip");
this.addCommand("Skip Childbirth Scenes", "birthSkip");
this.addCommand("Cross-section During H Scenes", "danmenSkip");
//this.addCommand(TextManager.touchUI, "touchUI");
};
Window_Options.prototype.addSystem_2Options = function () {
this.addCommand("Message Window Transparency", "msOpacityVolume");
this.addCommand("Message Speed", "msSpeed", true, "tri");
this.addCommand("Auto Mode Speed", "autoMsSpeedVolume");
this.addCommand("Timed Choices", "selectLimit");
};
Window_Options.prototype.addVolumeOptions = function () {
this.addCommand(TextManager.bgmVolume, "bgmVolume");
this.addCommand("BGV Volume", "bgsVolume");
this.addCommand(TextManager.seVolume, "seVolume");
this.addCommand("Voice Volume", "meVolume");
this.addCommand("Character Voice Settings", "charaVoice", true, "move");
};
const HIGHLIGHT_COLOR = 24; // 青
const NORMAL_COLOR = 0;
// statusText をオーバーライドして、boolean の場合は「ON / OFF」と表示する
// const _Window_Options_statusText = Window_Options.prototype.statusText;
// Window_Options.prototype.statusText = function (index, value) {
// const ext = this.commandExt(index);
// if (typeof value === "boolean") {
// const onText = "オン";
// const offText = "オフ";
// return `${onText} ${offText}`;
// } else if (ext == "tri") {
// const text_1 = "戦闘を行う";
// const text_2 = "選択肢";
// const text_3 = "自動敗北";
// return `${text_1}    ${text_2}    ${text_3}`;
// } else if (ext == "move") {
// return;
// }
// return _Window_Options_statusText.call(this, index);
// };
// drawItem をオーバーライド。boolean の項目以外は元の描画処理に任せる
const _Window_Options_drawItem = Window_Options.prototype.drawItem;
Window_Options.prototype.drawItem = function (index) {
const symbol = this.commandSymbol(index);
// undefined や想定外の項目は元の処理で描画
if (!symbol) {
_Window_Options_drawItem.call(this, index);
return;
}
const value = this.getConfigValue(symbol);
this.contents.fontSize = 22;
if (typeof value === "boolean") {
// true,falseの場合
const rect = this.itemLineRect(index);
const name = this.commandName(index);
const statusWidth = this.statusWidth();
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
// 名前部分の描画
this.changeTextColor("#000000");
this.drawTextS(name, rect.x, rect.y, rect.width - statusWidth, "left");
// カスタムステータステキストの描画(制御文字により色変え)
//onst statusText = this.statusText(index, value);
this.drawTextS(" On", rect.x + rect.width - statusWidth - 440, rect.y);
this.drawTextS(" Off", rect.x + rect.width - statusWidth - 268, rect.y);
this._toggleSprite[index][0].setFrame(0, value ? 0 : 32, 159, 32);
this._toggleSprite[index][1].setFrame(0, value ? 32 : 0, 159, 32);
} else if (this.commandExt(index) == "tri") {
// 1,2,3の場合
const rect = this.itemLineRect(index);
const name = this.commandName(index);
const statusWidth = this.statusWidth();
this.changeTextColor("#000000");
this.changePaintOpacity(this.isCommandEnabled(index));
// 名前部分の描画
this.drawTextS(name, rect.x, rect.y, rect.width - statusWidth, "left");
// カスタムステータステキストの描画(制御文字により色変え)
//const statusText = this.statusText(index, value);
if (symbol == "autoDefeat") {
this.drawTextS("Fight", rect.x + rect.width - statusWidth - 440, rect.y);
this.drawTextS("Choice", rect.x + rect.width - statusWidth - 274, rect.y);
this.drawTextS("Auto-Defeat", rect.x + rect.width - statusWidth - 130, rect.y);
} else {
this.drawTextS("Slow", rect.x + rect.width - statusWidth - 434, rect.y);
this.drawTextS("Normal", rect.x + rect.width - statusWidth - 268, rect.y);
this.drawTextS("Bulk", rect.x + rect.width - statusWidth - 100, rect.y);
}
this._toggleSprite[index][0].setFrame(0, value == 0 ? 0 : 32, 159, 32);
this._toggleSprite[index][1].setFrame(0, value == 1 ? 0 : 32, 159, 32);
this._toggleSprite[index][2].setFrame(0, value == 2 ? 0 : 32, 159, 32);
} else {
const title = this.commandName(index);
const status = this.statusText(index);
const rect = this.itemLineRect(index);
const statusWidth = this.statusWidth();
const titleWidth = rect.width - statusWidth;
this.changeTextColor("#000000");
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawTextS(title, rect.x, rect.y, titleWidth, "left");
this.drawTextS(status, rect.x + titleWidth, rect.y, statusWidth, "right");
}
this.contents.fontSize = $gameSystem.mainFontSize();
};
// onとoffの位置を逆にする
Window_Options.prototype.cursorRight = function () {
const index = this.index();
const symbol = this.commandSymbol(index);
if (this.isVolumeSymbol(symbol)) {
this.changeVolume(symbol, true, false);
} else if (this.commandExt(index) == "tri") {
this.changeTri(symbol, 1, 2);
} else if (this.commandExt(index) == "move") {
} else {
this.changeValue(symbol, false);
}
};
Window_Options.prototype.cursorLeft = function () {
const index = this.index();
const symbol = this.commandSymbol(index);
if (this.isVolumeSymbol(symbol)) {
this.changeVolume(symbol, false, false);
} else if (this.commandExt(index) == "tri") {
this.changeTri(symbol, -1, 2);
} else if (this.commandExt(index) == "move") {
} else {
this.changeValue(symbol, true);
}
};
Window_Options.prototype.changeTri = function (symbol, add, max) {
const lastValue = this.getConfigValue(symbol);
if (add == "click") {
this.changeValue(symbol, Math.floor((lastValue + 1) % (max + 1)));
return;
}
const value = lastValue + add;
this.changeValue(symbol, value.clamp(0, max));
};
Window_Options.prototype.changeVolume = function (symbol, forward, wrap) {
const lastValue = this.getConfigValue(symbol);
const offset = this.volumeOffset();
const value = lastValue + (forward ? offset : -offset);
if (value > 100 && wrap) {
this.changeValue(symbol, 0);
} else {
this.changeValue(symbol, value.clamp(0, 100));
}
var dom = document.querySelector(`#${symbol}`);
if (dom) {
dom.value = value;
}
};
Window_Options.prototype.processOk = function () {
const index = this.index();
const symbol = this.commandSymbol(index);
if (this.isVolumeSymbol(symbol)) {
// this.changeVolume(symbol, true, true);
} else if (this.commandExt(index) == "tri") {
this.changeTri(symbol, "click", 2);
} else if (this.commandExt(index) == "move") {
SoundManager.playOk();
this._voiceWindow.select(0);
this._voiceWindow.activate();
//this._voiceWindow.show();
this.deactivate();
} else {
this.changeValue(symbol, !this.getConfigValue(symbol));
}
};
Window_Options.prototype.setVoiceWindow = function (voiceWindow) {
this._voiceWindow = voiceWindow;
};
// バーのヤツ
class InputRange {
constructor(value, x, y, window2, symbol, id, clas) {
this._div = document.createElement("div");
this._div.className = `optRange_wrap ${clas}`;
this._div.style.display = "none";
this._div.style.left = `${x}px`;
this._div.style.top = `${y}px`;
this._input = document.createElement("input");
this._input.type = "range";
this._input.id = id;
this._input.value = value.toString();
this._input.min = "0";
this._input.max = "100";
this._input.step = "10";
// Nothing right click.
this._input.oncontextmenu = function () {
return false;
};
function move(input, window2, symbol) {
const value = Number(input.value);
window2.changeValue(symbol, value);
}
// Mouse
this._input.addEventListener(
"mousemove",
function (ev, win = window2, sbl = symbol) {
move(this, win, sbl);
},
false
);
// マウスダウンの直後だと値が反映されないのでsettimeout
this._input.addEventListener(
"mousedown",
function (ev, win = window2, sbl = symbol) {
setTimeout(move, 0, this, win, sbl);
},
false
);
// Touch
this._input.addEventListener(
"touchmove",
function (ev, win = window2, sbl = symbol) {
move(this, win, sbl);
},
false
);
this._div.appendChild(this._input);
if (typeof RangeTouch !== "undefined" && Utils.isMobileDevice()) {
this._range = new RangeTouch(this._div);
document.body.appendChild(this._range.element);
} else {
document.body.appendChild(this._div);
}
Graphics.zoomRange(id, x, y);
}
}
const Graphics__updateRealScale = Graphics._updateRealScale;
Graphics._updateRealScale = function () {
Graphics__updateRealScale.apply(this, arguments);
if (bgm_show) {
const rangeId = ["bgmVolume", "bgsVolume", "seVolume", "meVolume", "msOpacityVolume", null, "autoMsSpeedVolume"];
rangeId.forEach((id, index) => {
if (!id) {
return;
}
const x = BASE_X - 100;
const y = BASE_Y - 427;
const lineHeight = BASE_LINE_HEIGHT + 4;
const y2 = y + lineHeight * (index % 4);
this.zoomRange(id, x, y2);
});
}
};
Graphics.zoomRange = function (id, x, y) {
const x2 = x * this._realScale;
const y2 = y * this._realScale;
const rw = Graphics.width * this._realScale;
const rh = Graphics.height * this._realScale;
const xSpace = Math.floor((this._stretchWidth() - rw) / 2);
const ySpace = Math.floor((this._stretchHeight() - rh) / 2);
const xx = x2 + xSpace;
const yy = y2 + ySpace;
const element = document.getElementById(id);
// element.style.left = xx.toString() + "px";
// element.style.top = yy.toString() + "px";
element.parentElement.style.left = xx.toString() + "px";
element.parentElement.style.top = yy.toString() + "px";
// element.parentElement.style.scale = this._realScale; // なぜかscaleが働かない環境がある
element.parentElement.style.transform = `scaleX(${this._realScale}) scaleY(${this._realScale})`;
};
// #######################################################
// ################# ボイスウィンドウ #####################
// #######################################################
function Window_CharaVoice() {
this.initialize(...arguments);
}
Window_CharaVoice.prototype = Object.create(Window_Command.prototype);
Window_CharaVoice.prototype.constructor = Window_CharaVoice;
Window_CharaVoice.prototype.initialize = function (rect) {
this.v_list = [
{ id: "sir", name: "Shirayuki", var: 503, img: null },
{ id: "yoz", name: "Yazuru", var: 504, img: null },
{ id: "rei", name: "Reina", var: 505, img: null },
{ id: "kao", name: "Kaoruko", var: 506, img: null },
{ id: "kur", name: "Kurumi", var: 507, img: null },
{ id: "chi", name: "Chiage", var: 508, img: null },
{ id: "aki", name: "Akira", var: 510, img: null },
{ id: "nar", name: "Narumi", var: 511, img: null },
{ id: "mir", name: "Miran", var: 509, img: null },
{ id: "kag", name: "Kamiya", var: 512, img: null },
{ id: "mob", name: "Other", var: 513, img: null }
];
Window_Command.prototype.initialize.call(this, rect);
this.refresh();
this.select(0);
this.deactivate();
this.hide();
};
Window_CharaVoice.prototype._refreshAllParts = function () {
//this._refreshBack();
//this._refreshFrame();
this._refreshCursor();
this._refreshArrows();
this._refreshPauseSign();
};
Window_CharaVoice.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem("Window");
for (e of this.v_list) {
e.img = ImageManager.loadSystem(`config_voice_toggle_${e.id}`);
if (!e.img.isReady()) {
e.img.addLoadListener(() => {
this.refresh(); // 画像がロードされたら再描画
});
}
}
this.menu_cursor_skin = ImageManager.loadSystem("config_voice_cursor");
if (!this.menu_cursor_skin.isReady()) {
this.menu_cursor_skin.addLoadListener(() => {
this.refresh(); // 画像がロードされたら再描画
});
return;
}
};
Window_CharaVoice.prototype.maxCols = function () {
return 6;
};
Window_CharaVoice.prototype.setItemWindow = function (itemWindow) {
this._itemWindow = itemWindow;
};
Window_CharaVoice.prototype.makeCommandList = function () {
for (e of this.v_list) {
this.addCommand(e.name, e.id);
}
};
Window_CharaVoice.prototype.colSpacing = function () {
return 21;
};
Window_CharaVoice.prototype.itemHeight = function () {
return 132;
};
Window_CharaVoice.prototype.drawItemBackground = function (index) {};
Window_CharaVoice.prototype.itemRect = function (index) {
const maxCols = this.maxCols();
const itemHeight = this.itemHeight();
const colSpacing = this.colSpacing();
const rowSpacing = this.rowSpacing();
const itemWidth = this.itemWidth();
const col = index % maxCols;
const row = Math.floor(index / maxCols);
const x = col * itemWidth - this.scrollBaseX() + col * 4;
const y = row * itemHeight + row * rowSpacing - this.scrollBaseY();
const width = itemWidth - colSpacing;
const height = itemHeight - rowSpacing;
return new Rectangle(x, y, width, height);
};
// なし・1 → On 2→off
Window_CharaVoice.prototype.voice_toggle = function () {
var idx = this.index();
var d = this.v_list[idx];
var val = $gameVariables.value(d.var);
$gameVariables.setValue(d.var, val == 2 ? 1 : 2);
AudioManager.stopVoice();
AudioManager.playVoice({ name: `conf_voice_${d.id}_${val == 2 ? "on" : "off"}`, volume: 100, pitch: 100, pan: 0 });
};
Window_CharaVoice.prototype.processOk = function () {
const index = this.index();
SoundManager.playOk();
this.voice_toggle();
this.refresh();
};
Window_Command.prototype.callOkHandler = function () {
const symbol = this.currentSymbol();
if (this.isHandled(symbol)) {
this.callHandler(symbol);
} else if (this.isHandled("ok")) {
Window_Selectable.prototype.callOkHandler.call(this);
} else {
this.activate();
}
};
Window_OptionCategory.prototype.callOkHandler = function () {
const symbol = this.currentSymbol();
if (symbol == "key_pad") {
SceneManager.push(Mano_InputConfig.Scene_KeyConfig);
} else if (symbol == "game_pad") {
SceneManager.push(Mano_InputConfig.Scene_GamepadConfig);
} else {
Window_Command.prototype.callOkHandler.call(this);
}
};
Window_CharaVoice.prototype.drawItem = function (index) {
this.contents.fontFace = "serif";
this.contents.fontSize = 20;
this.changeTextColor("#000000");
const rect = this.itemLineRect(index);
//const align = this.itemTextAlign();
//this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
this.drawTextM(this.commandName(index), rect.x, rect.y + 48, rect.width, "left");
};
Window_CharaVoice.prototype.drawAllItems = function () {
const topIndex = this.topIndex();
for (let i = 0; i < this.maxVisibleItems(); i++) {
const index = topIndex + i;
if (index < this.maxItems()) {
//this.drawItemBackground(index);
this.drawItem(index);
}
}
for (var i = 0; i < this.v_list.length; i++) {
if (!$gameVariables.value(this.v_list[i].var) || $gameVariables.value(this.v_list[i].var) == 1) {
this._toggleSprite[i].setFrame(0, 0, 166, 124);
} else {
this._toggleSprite[i].setFrame(0, 124, 166, 124);
}
}
};
Window_CharaVoice.prototype._createCursorSprite = function () {
this._toggleSprite = [];
for (var i = 0; i < this.v_list.length; i++) {
this._toggleSprite[i] = [];
this._toggleSprite[i] = new Sprite();
this._toggleSprite[i].bitmap = ImageManager.loadSystem(`config_voice_toggle_${this.v_list[i].id}`);
this._toggleSprite[i].y = Math.floor(i / 6) * 136;
this._toggleSprite[i].x = (i % 6) * 190;
this._toggleSprite[i].setFrame(0, 0, 155, 116);
this._clientArea.addChild(this._toggleSprite[i]);
}
this._cursorSprite = new Sprite();
for (let i = 0; i < 9; i++) {
this._cursorSprite.addChild(new Sprite());
}
this._clientArea.addChild(this._cursorSprite);
};
//56×200にする
Window_CharaVoice.prototype._refreshCursor = function () {
const drect = this._cursorRect.clone();
const srect = { x: 0, y: 0, width: 125, height: 24 };
const m = 0;
for (const child of this._cursorSprite.children) {
child.bitmap = this.menu_cursor_skin;
}
//this._setRectPartsGeometry(this._cursorSprite, srect, drect, m);
};
Window_CharaVoice.prototype._updateCursor = function () {
this._cursorSprite.alpha = this._makeCursorAlpha();
this._cursorSprite.visible = this.isOpen() && this.cursorVisible;
this._cursorSprite.x = this._cursorRect.x;
this._cursorSprite.y = this._cursorRect.y + 100;
};
// メッセージ速度の反映
Window_Message.prototype.updateMessage = function () {
if (ConfigManager.msSpeed === 0) {
if (this.meSpeed_flag) {
this.meSpeed_flag = false;
return true;
} else {
this.meSpeed_flag = true;
}
} else if (ConfigManager.msSpeed === 2) {
this._showFast = true;
}
const textState = this._textState;
if (textState) {
while (!this.isEndOfText(textState)) {
if (this.needsNewPage(textState)) {
this.newPage(textState);
}
this.updateShowFast();
this.processCharacter(textState);
if (this.shouldBreakHere(textState)) {
break;
}
}
this.flushTextState(textState);
if (this.isEndOfText(textState) && !this.isWaiting()) {
this.onEndOfText();
}
return true;
} else {
return false;
}
};
})();
function Scene_Options_message() {
this.initialize(...arguments);
}
function Window_Options_message() {
this.initialize(...arguments);
}
Window_Options_message.prototype = Object.create(Window_Options.prototype);
Window_Options_message.prototype.constructor = Window_Options_message;
(function () {
Scene_Options_message.prototype = Object.create(Scene_Options.prototype);
Scene_Options_message.prototype.constructor = Scene_Options_message;
Scene_Options_message.prototype.createOptionsWindow = function () {
const rect = this.optionsWindowRect();
this._itemWindow = new Window_Options_message(rect);
this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
this.addWindow(this._itemWindow);
};
Window_Options_message.prototype.addGeneralOptions = function () {
this.addCommand(TextManager.alwaysDash, "alwaysDash");
this.addCommand(TextManager.commandRemember, "commandRemember");
this.addCommand("画面演出", "screenEffects");
this.addCommand("戦闘演出", "battleEffects");
// this.addCommand("イベント戦闘の勝敗設定", "autoDefeat", true, "tri");
// this.addCommand("一度見たHシーンのスキップ", "hSkip");
// this.addCommand("出産シーンのスキップ", "birthSkip");
// this.addCommand("Hシーン中の断面図表示設定", "danmenSkip");
//this.addCommand(TextManager.touchUI, "touchUI");
};
Window_Options_message.prototype.addSystem_2Options = function () {
this.addCommand("メッセージウィンドウ透過度", "msOpacityVolume");
this.addCommand("メッセージ速度", "msSpeed", true, "tri");
this.addCommand("オートモード時速度", "autoMsSpeedVolume");
// this.addCommand("時限式選択肢の有無", "selectLimit");
};
Window_Options_message.prototype.addVolumeOptions = function () {
this.addCommand(TextManager.bgmVolume, "bgmVolume");
this.addCommand("BGV 音量", "bgsVolume");
this.addCommand(TextManager.seVolume, "seVolume");
this.addCommand("ボイス 音量", "meVolume");
this.addCommand("キャラクター別音声設定", "charaVoice", true, "move");
};
})();