alter-egoism/js/plugins/CBR_menu_skill.js
2025-11-03 10:49:50 -06:00

449 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

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.

(function () {
//##################### メニューの背景変える #####################
Scene_Skill.prototype.createBackground = function () {
this._backgroundSprite = new Sprite();
this._backgroundSprite.bitmap = ImageManager.loadSystem("menu_skill_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("Skills", 22, 20, 200, 22, "center");
this.addChild(this._backgroundTextSprite);
this._backgroundTextSprite3 = new Sprite(new Bitmap(200, 50));
var b3 = this._backgroundTextSprite3.bitmap;
b3.fontFace = "serif";
b3.fontSize = 18;
b3.textColor = "#000000";
b3.drawTextM("SP Cost", 0, 0, 200, 50, "center");
this._backgroundTextSprite3.x = 572;
this._backgroundTextSprite3.y = 58;
this.addChild(this._backgroundTextSprite3);
this._backgroundTextSprite4 = new Sprite(new Bitmap(200, 50));
var b4 = this._backgroundTextSprite4.bitmap;
b4.fontFace = "serif";
b4.fontSize = 26;
b4.textColor = "#000000";
b4.drawTextM("Use Skill", 0, 0, 200, 50, "center");
this._backgroundTextSprite4.x = 920;
this._backgroundTextSprite4.y = 124;
this.addChild(this._backgroundTextSprite4);
};
Scene_Skill.prototype.create = function () {
Scene_ItemBase.prototype.create.call(this);
this.createHelpWindow();
this.createSkillTypeWindow();
//this.createStatusWindow();
this.createItemWindow();
this.createActorWindow();
};
// ####################################################
// ################# アイテムの種類 ####################
// ####################################################
Scene_Skill.prototype.skillTypeWindowRect = function () {
const wx = 270;
const wy = -6;
const ww = 600;
const wh = 58 + 8;
return new Rectangle(wx, wy, ww, wh);
};
Window_SkillType.prototype.maxCols = function () {
return 5;
};
Window_SkillType.prototype.initialize = function (rect) {
Window_HorzCommand.prototype.initialize.call(this, rect);
this._padding = 0;
this.contents.fontFace = "serif";
};
Window_SkillType.prototype._refreshAllParts = function () {
this._padding = 0;
//this._refreshBack();
//this._refreshFrame();
this._refreshCursor();
this._refreshArrows();
this._refreshPauseSign();
};
// デザイン関係
//カーソルの変更
Window_SkillType.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_SkillType.prototype.lineHeight = function () {
return 58;
};
Window_SkillType.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_SkillType.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_SkillType.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_SkillType.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_SkillType.prototype.select = function (index) {
this._index = index;
this.contents.clear();
this.contentsBack.clear();
this.drawAllItems();
this.refreshCursor();
this.callUpdateHelp();
};
//↑のセレクトでの不具合を出ないようにする
Window_SkillType.prototype.drawAllItems = function () {
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);
}
}
};
// コマンド関係
// コマンドの追加、2は必殺技
Window_SkillType.prototype.makeCommandList = function () {
if (this._actor) {
const skillTypes = this._actor.skillTypes();
for (const stypeId of skillTypes) {
const name = $dataSystem.skillTypes[stypeId];
this.addCommand("All Skills", "skill", true, stypeId, "all");
}
this.addCommand("Attack", "skill", true, 2, "attack");
this.addCommand("Healing", "skill", true, 2, "cure");
this.addCommand("Support", "skill", true, 2, "support");
this.addCommand("Lewd", "skill", true, 2, "h");
}
};
// コマンドにCBR_typeって属性作れるようにする
Window_SkillType.prototype.addCommand = function (name, symbol, enabled = true, ext = null, CBR_type = null) {
this._list.push({ name: name, symbol: symbol, enabled: enabled, ext: ext, CBR_type: CBR_type });
};
// 上の_listからextを引っ張ってくる
Window_SkillType.prototype.currentExt = function () {
return this.currentData() ? this.currentData() : null;
};
// updateで毎回これが更新されてる
Window_SkillList.prototype.setStypeId = function (stype) {
if (stype) {
if (this._stypeId !== stype.ext || this._CBR_type !== stype.CBR_type) {
this._stypeId = stype.ext;
this._CBR_type = stype.CBR_type;
this.refresh();
this.scrollTo(0, 0);
}
}
};
//スキル一覧に表示するべきstypeIdを設定する、コメント欄を使用
Window_SkillList.prototype.includes = function (item) {
//return item && item.stypeId === this._stypeId;
if (!this._CBR_type || this._CBR_type === "all") {
return item;
} else {
return item && item.meta.CBR_type === this._CBR_type;
}
};
// #############################################################
// ################## スキル一覧ウィンドウ #######################
// #############################################################
Scene_Skill.prototype.createItemWindow = function () {
const rect = this.itemWindowRect();
this._itemWindow = new Window_MenuSkillList(rect);
this._itemWindow.setHelpWindow(this._helpWindow);
this._itemWindow.setHandler("ok", this.onItemOk.bind(this));
this._itemWindow.setHandler("cancel", this.onItemCancel.bind(this));
this._skillTypeWindow.setSkillWindow(this._itemWindow);
this.addWindow(this._itemWindow);
};
Scene_Skill.prototype.itemWindowRect = function () {
const wx = 147;
const wy = 82;
const ww = 630;
const wh = 464;
return new Rectangle(wx, wy, ww, wh);
};
function Window_MenuSkillList() {
this.initialize(...arguments);
}
Window_MenuSkillList.prototype = Object.create(Window_SkillList.prototype);
Window_MenuSkillList.prototype.constructor = Window_MenuSkillList;
Window_MenuSkillList.prototype.initialize = function (rect) {
Window_Selectable.prototype.initialize.call(this, rect);
this._actor = null;
this._stypeId = 0;
this._data = [];
this.contents.fontFace = "serif";
};
Window_MenuSkillList.prototype.maxCols = function () {
return 1;
};
Window_MenuSkillList.prototype.drawItemName = function (item, x, y, width) {
if (item) {
const iconY = y + (this.lineHeight() - ImageManager.iconHeight) / 2;
const delta = ImageManager.standardIconWidth - ImageManager.iconWidth;
const textMargin = ImageManager.standardIconWidth + 4;
const itemWidth = Math.max(0, width - textMargin);
this.resetTextColor();
//this.drawIcon(item.iconIndex, x + delta / 2, iconY);
this.changeTextColor("#000000");
this.drawTextS(item.name, x + textMargin + 24, y, itemWidth);
this.resetTextColor();
}
};
Window_MenuSkillList.prototype.drawItemNumber = function (item, x, y, width) {
if (this.needsNumber()) {
this.changeTextColor("#000000");
this.drawTextS($gameParty.numItems(item), x - 30, y, width, "right");
this.resetTextColor();
}
};
Window_MenuSkillList.prototype.changePaintOpacity = function (enabled) {
this.contents.paintOpacity = enabled ? 255 : 100;
};
Window_MenuSkillList.prototype.drawItem = function (index) {
const skill = this.itemAt(index);
if (skill) {
this.contents.fontSize = 22;
const costWidth = this.costWidth();
const rect = this.itemLineRect(index);
this.changePaintOpacity(this.isEnabled(skill));
this.drawItemName(skill, rect.x + 8, rect.y, rect.width);
this.drawSkillCost(skill, rect.x - 70, rect.y, rect.width);
this.changePaintOpacity(1);
}
};
Window_MenuSkillList.prototype.drawSkillCost = function (skill, x, y, width) {
this.changeTextColor("#000000");
this.contents.fontSize = 22;
if (this._actor.skillTpCost(skill) > 0) {
//this.changeTextColor(ColorManager.tpCostColor());
this.drawTextM(this._actor.skillTpCost(skill), x, y, width, "right");
} else if (this._actor.skillMpCost(skill) > 0) {
//this.changeTextColor(ColorManager.mpCostColor());
this.drawTextM(this._actor.skillMpCost(skill), x, y, width, "right");
}
this.contents.fontSize = 16;
this.drawTextM("SP", x + 24, y + 2, width, "right");
};
//カーソルの変更
Window_MenuSkillList.prototype.loadWindowskin = function () {
this.windowskin = ImageManager.loadSystem("Window");
this.menu_cursor_skin = ImageManager.loadSystem("menu_item_selected");
this.menu_item_skin = ImageManager.loadSystem("menu_item_selected_2");
};
//56×200にする
Window_MenuSkillList.prototype._refreshCursor = function () {
const drect = this._cursorRect.clone();
const srect = { x: 0, y: 40, width: 588, 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_MenuSkillList.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, 588, 40, dx, dy, dw, dh);
}
};
Window_MenuSkillList.prototype._refreshAllParts = function () {
//this._refreshBack();
//this._refreshFrame();
this._refreshCursor();
this._refreshArrows();
this._refreshPauseSign();
};
// ##################################################
// ############# ステータスウィンドウ #################
// ##################################################
Scene_Skill.prototype.actorWindowRect = function () {
const wx = 756;
const wy = 170;
const ww = 522;
const wh = 540;
return new Rectangle(wx, wy, ww, wh);
};
Scene_Skill.prototype.refreshActor = function () {
const actor = this.actor();
this._skillTypeWindow.setActor(actor);
//this._statusWindow.setActor(actor);
this._itemWindow.setActor(actor);
};
Scene_Skill.prototype.useItem = function () {
Scene_ItemBase.prototype.useItem.call(this);
//this._statusWindow.refresh();
this._itemWindow.refresh();
};
Scene_Skill.prototype.showActorWindow = function () {
this._actorWindow.show();
this._actorWindow.activate();
};
Scene_Skill.prototype.hideActorWindow = function () {
// this._actorWindow.hide();
this._actorWindow.deactivate();
};
// ############################################
// ############# ヘルプウィンドウ ##############
// ############################################
Scene_Skill.prototype.onItemCancel = function () {
this._itemWindow.setHelpWindowItem(null);
this._itemWindow.deselect();
this._skillTypeWindow.activate();
};
Scene_Skill.prototype.helpWindowRect = function () {
const wx = 20;
const wy = 542;
const ww = 740;
const wh = this.helpAreaHeight() + 50;
return new Rectangle(wx, wy, ww, wh);
};
function Window_SkillHelp() {
this.initialize(...arguments);
}
Window_SkillHelp.prototype = Object.create(Window_Help.prototype);
Window_SkillHelp.prototype.constructor = Window_SkillHelp;
Window_SkillHelp.prototype.setItem = function (item) {
if (item) {
this.CBR_skill = item;
} else {
this.CBR_skill = null;
}
this.setText(item ? item.description : "");
};
Window_SkillHelp.prototype.refresh = function () {
const rect = this.baseTextRect();
this.contents.clear();
this.contents.fontFace = "serif";
this.changeTextColor("#000000");
this.contents.fontSize = 20;
this.drawTextM("Description", 16, 35, 80, "center");
this.drawTextM("Attribute", rect.x + 8, rect.y + 4, rect.width);
this.drawTextM("Range", rect.x + 388, rect.y + 4, rect.width);
if (this.CBR_skill) {
this.changeTextColor("#FFFFFF");
this.drawTextS(["Sure Hit", "Physical", "Magical"][this.CBR_skill.hitType], rect.x + 108, rect.y + 4, rect.width);
const scopeNames = [
"None", // 0: None
"One Enemy", // 1: One enemy
"All Enemies", // 2: All enemies
"1 Random Enemy", // 3: 1 random enemy
"2 Random Enemies", // 4: 2 random enemies
"3 Random Enemies", // 5: 3 random enemies
"4 Random Enemies", // 6: 4 random enemies
"One Ally", // 7: One ally
"All Allies", // 8: All allies
"One Ally (KO)", // 9: One dead ally
"All Allies (KO)", // 10: All dead allies
"User", // 11: The user
"One Ally (Unconditional)", // 12: One ally (unconditional)
"All Allies (Unconditional)", // 13: All allies (unconditional)
"All Enemies & Allies"
];
this.drawTextS(scopeNames[this.CBR_skill.scope], rect.x + 468, rect.y + 4, rect.width);
}
this.changeTextColor("#FFFFFF");
this.drawTextExS(this._text, rect.x + 100, rect.y + 40, rect.width);
};
Scene_Skill.prototype.createHelpWindow = function () {
const rect = this.helpWindowRect();
this._helpWindow = new Window_SkillHelp(rect);
// 背景を透明にする
this._helpWindow.setBackgroundType(2);
//フォントサイズの変更
this._helpWindow.contents.fontSize = 22;
//文字の枠線を削除
this.addWindow(this._helpWindow);
};
})();