sakura-gozen/js/plugins/iii/iiiAltSaveScreen_k.js
2025-01-14 14:06:54 -06:00

601 lines
17 KiB
JavaScript

//=============================================================================
// RPG Maker MZ - Alternative Save Screen
//=============================================================================
/*:
* @target MZ
* @plugindesc Alternative save/load screen layout.
* @author Yoji Ojima
*
* @help AltSaveScreen.js
*
* This plugin changes the layout of the save/load screen.
* It puts the file list on the top and the details on the bottom.
*
* It does not provide plugin commands.
*/
/*:ja
* @target MZ
* @plugindesc セーブ/ロード画面のレイアウトを変更します。
* @author Yoji Ojima
*
* @help AltSaveScreen.js
*
* このプラグインは、セーブ/ロード画面のレイアウトを変更します。
* ファイル一覧を上側に、詳細を下側に配置します。
*
* プラグインコマンドはありません。
*
* 追記:サムライゲーム用に一部カスタマイズします。
*/
(() => {
const _Scene_File_create = Scene_File.prototype.create;
Scene_File.prototype.create = function () {
_Scene_File_create.apply(this, arguments);
this._listWindow.height = this._listWindow.fittingHeight(3);
const x = 0;
const y = this._listWindow.y + this._listWindow.height;
const width = Graphics.boxWidth;
const height = Graphics.boxHeight - y;
const rect = new Rectangle(x, y, width, height);
const statusWindow = new Window_SavefileStatus(rect);
this._listWindow.mzkp_statusWindow = statusWindow;
this.addWindow(statusWindow);
};
const _Scene_File_start = Scene_File.prototype.start;
Scene_File.prototype.start = function () {
_Scene_File_start.apply(this, arguments);
this._listWindow.ensureCursorVisible();
this._listWindow.callUpdateHelp();
};
// セーブファイル一覧ウインドウ
Window_SavefileList.prototype.windowWidth = function () {
return Graphics.boxWidth;
};
Window_SavefileList.prototype.maxCols = function () {
return 4;
};
Window_SavefileList.prototype.itemHeight = function () {
return this.lineHeight() * 3 + 28;
//return 8;
};
const _Window_SavefileList_callUpdateHelp =
Window_SavefileList.prototype.callUpdateHelp;
Window_SavefileList.prototype.callUpdateHelp = function () {
_Window_SavefileList_callUpdateHelp.apply(this, arguments);
if (this.active && this.mzkp_statusWindow) {
this.mzkp_statusWindow.setSavefileId(this.savefileId());
}
};
const _Window_SavefileList_prototype_drawItem =
Window_SavefileList.prototype.drawItem;
Window_SavefileList.prototype.drawItem = function (index) {
// 位置を微調整したいので処理を改変する。元の表示に戻したい場合はif(true)とすること。
if (false) {
_Window_SavefileList_prototype_drawItem.call(this, index);
return;
}
const savefileId = this.indexToSavefileId(index);
const info = DataManager.savefileInfo(savefileId);
const rect = this.itemRectWithPadding(index);
this.resetTextColor();
this.changePaintOpacity(this.isEnabled(savefileId));
// //リスト画像描画
this.drawSaveFrame(rect.x, rect.y + 4);
//セーブファイル番号
//フォントサイズの変更
const defaultFontSize = $gameSystem.mainFontSize();
this.contents.fontSize = defaultFontSize - 10;
this.drawTitle(savefileId, rect.x + 2, rect.y);
//フォントサイズリセット
this.contents.fontsize = defaultFontSize;
//セーブデータがあれば内容表示
if (info) {
this.drawContents(info, rect);
}
};
Window_SavefileList.prototype.drawSaveFrame = function (x, y) {
let bitmap = ImageManager.loadBitmap(
"img/pictures/SystemPic/",
"UI_savelist"
);
const pw = bitmap.width;
const ph = bitmap.height;
const sx = 0;
const sy = 0;
this.contents.blt(bitmap, sx, sy, pw, ph, x, y);
};
Window_SavefileList.prototype.drawClearChapter = function (x, y, chap) {
let bitmap = [
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_savec1"),
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_savec2"),
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_savec3"),
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_savec4"),
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_savec5"),
ImageManager.loadBitmap("img/pictures/SystemPic/", "UI_save_trial"),
];
const pw = bitmap[chap].width;
const ph = bitmap[chap].height;
const sx = 0;
const sy = 0;
const wy = 17;
this.contents.blt(bitmap[chap], sx, sy * (wy * chap), pw, ph, x, y);
};
const _Window_SavefileList_prototype_drawContents =
Window_SavefileList.prototype.drawContents;
Window_SavefileList.prototype.drawContents = function (info, rect) {
// 位置を微調整したいので処理を改変する。元の表示に戻したい場合はif(true)とすること。
if (false) {
_Window_SavefileList_prototype_drawContents.call(this, info, rect);
return;
}
const bottom = rect.y + rect.height;
const defaultFontSize = $gameSystem.mainFontSize();
const lineHeight = this.lineHeight();
// アクター画像
this.drawPartyCharacters(info, rect.x + rect.width * 0.78, bottom - 24);
// アクターレベル
let actorLevel = 1;
if (info.actorLevel && info.actorLevel > 0) {
actorLevel = info.actorLevel;
}
this.contents.fontSize = defaultFontSize - 5;
this.drawText(
TextManager.level + " " + actorLevel,
rect.x + 10,
bottom - lineHeight * 2.8,
rect.width
);
//クリアしたチャプター
let cwy = 17;
if (!info.ChapClear1) {
if (info.trialvar)
this.drawClearChapter(
rect.x + rect.width / 1.18,
rect.y + 5 + cwy * 0,
5
);
} else if (info.ChapClear1) {
if (info.ChapClear1)
this.drawClearChapter(rect.x + rect.width / 3, rect.y + 5 + cwy * 0, 0);
if (info.ChapClear2)
this.drawClearChapter(rect.x + rect.width / 3, rect.y + 5 + cwy * 1, 1);
if (info.ChapClear3)
this.drawClearChapter(rect.x + rect.width / 3, rect.y + 5 + cwy * 2, 2);
if (info.ChapClear4)
this.drawClearChapter(rect.x + rect.width / 2, rect.y + 5 + cwy * 0, 3);
if (info.ChapClear5)
this.drawClearChapter(rect.x + rect.width / 2, rect.y + 5 + cwy * 1, 4);
if (info.trialvar)
this.drawClearChapter(
rect.x + rect.width / 1.18,
rect.y + 5 + cwy * 0,
5
);
}
// 現在のプレイ中のチャプター
this.contents.fontSize = defaultFontSize - 8;
let list_chapX = rect.x;
let list_chapY = bottom - lineHeight * 2.1;
if (1 <= info.purpose && info.purpose <= 999) {
//this.drawText(IIITEXT[0], rect.x + 10, bottom - (lineHeight * 1.5), rect.width);
this.drawText(
$dataSystemTexts.SaveList_Chapter0,
list_chapX,
list_chapY,
rect.width
);
}
if (1000 <= info.purpose && info.purpose <= 1999) {
this.drawText(
$dataSystemTexts.SaveList_Chapter1,
list_chapX,
list_chapY,
rect.width
);
}
if (2000 <= info.purpose && info.purpose <= 2999) {
this.drawText(
$dataSystemTexts.SaveList_Chapter2,
list_chapX,
list_chapY,
rect.width
);
}
if (3000 <= info.purpose && info.purpose <= 3999) {
//chapter3 befor
this.drawText(
$dataSystemTexts.SaveList_Chapter3,
list_chapX,
list_chapY,
rect.width
);
}
if (4000 <= info.purpose && info.purpose <= 4999) {
//chapterEx1
this.drawText(
$dataSystemTexts.SaveList_ChapterEx,
list_chapX,
list_chapY,
rect.width
);
}
if (5000 <= info.purpose && info.purpose <= 6999) {
//chapter3 after
this.drawText(
$dataSystemTexts.SaveList_Chapter3,
list_chapX,
list_chapY,
rect.width
);
}
if (7000 <= info.purpose && info.purpose <= 9999) {
//chapterEx2
this.drawText(
$dataSystemTexts.SaveList_ChapterEx2,
list_chapX,
list_chapY,
rect.width
);
}
if (info.purpose >= 10000) {
this.drawText(
$dataSystemTexts.SaveList_ChapterSelect,
list_chapX,
list_chapY,
rect.width
);
}
this.contents.fontSize = defaultFontSize;
// プレイ時間
// this.contents.fontSize = defaultFontSize - 8;
// this.drawText("time", rect.x + 10, bottom - (lineHeight * 1.5), rect.width);
// this.drawPlaytime(info, rect.x - rect.width /2.2, bottom - (lineHeight * 1.5), rect.width);
// 鈴音アクター表示
if (!$dataPurpose) {
return;
}
const varVal = info.purpose; //$gameVariables.value(varId);
if (100 <= varVal && varVal <= 9999) {
if (100 <= varVal && varVal <= 1999) {
// 1章
this.drawCharacter(
"!$ActorC2_10",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
}
if (2000 <= varVal && varVal <= 2999) {
// 2章
this.drawCharacter(
"!$ActorC2_10",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
}
if (3000 <= varVal && varVal <= 3999) {
// 3章 前半
if (3200 <= varVal && varVal <= 3299) {
//鈴音一時操作時
return;
} else {
this.drawCharacter(
"!$ActorC2_10",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
}
}
if (4000 <= varVal && varVal <= 4999) {
// 断章
if (4100 <= varVal && varVal <= 4200) {
this.drawCharacter(
"!$ActorC2_20",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
}
}
if (5000 <= varVal && varVal <= 7000) {
// 3章 後半
if (5100 <= varVal && varVal <= 7000) {
this.drawCharacter(
"!$ActorC2_10",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
}
}
if (7000 <= varVal && varVal <= 9999) {
// EX章
}
if (10000 <= varVal) {
// Chapter Select
this.drawCharacter(
"!$ActorC11_10",
2,
rect.x + rect.width * 0.93,
bottom - 24
);
//this.drawTextEx("\\I[225]", rect.x + rect.width*0.85, bottom - 60, rect.width);
}
}
// マップ名
this.contents.fontSize = defaultFontSize - 8;
this.drawText(
info.mapName,
rect.x + 8,
bottom - lineHeight * 1.5,
rect.width,
"left"
);
// セーブ時間
this.contents.fontSize = defaultFontSize - 8;
let sdate = [
info.timeYear,
info.timeMonth,
info.timeDate,
info.timeHours,
info.timeMinutes,
];
this.drawText(
$dataSystemTexts.SaveList_savetime +
sdate[0] +
"/" +
sdate[1] +
"/" +
sdate[2] +
" " +
sdate[3] +
":" +
sdate[4],
rect.x,
bottom - lineHeight * 0.85,
rect.width,
"right"
);
};
// セーブ画面下部のウインドウ
function Window_SavefileStatus() {
this.initialize.apply(this, arguments);
}
Window_SavefileStatus.prototype = Object.create(Window_Base.prototype);
Window_SavefileStatus.prototype.constructor = Window_SavefileStatus;
Window_SavefileStatus.prototype.initialize = function (rect) {
Window_Base.prototype.initialize.call(this, rect);
this._savefileId = 1;
};
Window_SavefileStatus.prototype.setSavefileId = function (id) {
this._savefileId = id;
this.refresh();
};
Window_SavefileStatus.prototype.refresh = function () {
const info = DataManager.savefileInfo(this._savefileId);
const rect = this.contents.rect;
this.contents.clear();
this.resetTextColor();
this.drawTitle(this._savefileId, rect.x + 160, rect.y);
if (info) {
this.drawContents(info, rect);
}
};
Window_SavefileStatus.prototype.drawTitle = function (savefileId, x, y) {
if (savefileId === 0) {
this.drawText(TextManager.autosave, x, y, 180);
} else {
this.drawText(TextManager.file + " " + savefileId, x, y, 180);
}
};
Window_SavefileStatus.prototype.drawContents = function (info, rect) {
var bottom = rect.y + rect.height;
var lh = this.lineHeight();
//III add
//infoの中身はIISaveInfoEx.jsにて編集
if (!$dataPurpose) {
return;
}
const varVal = info.purpose; //$gameVariables.value(varId);
let purposeText = "---";
let len = $dataPurpose.length;
for (let i = 0; i < len; i++) {
let data = $dataPurpose[i];
if (!data) {
continue;
}
if (data.val <= varVal) {
purposeText = data.purposeText;
} else {
break;
}
}
this.drawTextEx(
$dataSystemTexts.SaveList_purpose + purposeText,
rect.x + 150,
bottom - lh * 3,
rect.width - 192
);
this.drawTextEx(
$dataSystemTexts.SaveList_nowmap + info.mapName,
rect.x + 150,
bottom - lh * 2,
rect.width - 192
);
this.drawTextEx(
$dataSystemTexts.SaveList_playtime + info.playtime,
rect.x + 150,
bottom - lh * 1,
rect.width
);
this.drawTextEx(
"\\}" +
info.timeYear +
"/" +
info.timeMonth +
"/" +
info.timeDate +
" " +
info.timeHours +
":" +
info.timeMinutes,
rect.width - 170,
bottom - lh * 1,
rect.width
);
//this.drawPartyActor(info, rect.x + 30, bottom - 10);
this.drawPartyfaces(info, rect.x, bottom - 144);
//Hステータス
let wx = 90;
let ssx = (wx + 16) * 4 + 47;
this.drawTextEx(
"\\I[238]Lv" + info.Hlv,
rect.width - ssx + wx * 0,
bottom - lh * 2,
rect.width
);
this.drawTextEx(
"\\I[220]Lv" + info.HparamKuti,
rect.width - ssx + wx * 1,
bottom - lh * 2,
rect.width
);
this.drawTextEx(
"\\I[221]Lv" + info.HparamTitu,
rect.width - ssx + wx * 2,
bottom - lh * 2,
rect.width
);
this.drawTextEx(
"\\I[222]Lv" + info.HparamTiti,
rect.width - ssx + wx * 3,
bottom - lh * 2,
rect.width
);
this.drawTextEx(
"\\I[223]Lv" + info.HparamSiri,
rect.width - ssx + wx * 4,
bottom - lh * 2,
rect.width
);
};
Window_SavefileStatus.prototype.drawPartyfaces = function (info, x, y) {
if (info && info.faces) {
for (var i = 0; i < info.characters.length; i++) {
// var data = info.characters[i];
var dataf = info.faces[i];
this.drawFace(dataf[0], dataf[1], x + i * 150, y);
// this.drawCharacter2(data[0], data[1], x + 20 + i * 150, y);
break;
}
}
};
Window_SavefileStatus.prototype.drawPartyActor = function (info, x, y) {
if (info && info.faces) {
for (var i = 0; i < info.characters.length; i++) {
var data = info.characters[i];
this.drawCharacter2(data[0], data[1], x + 20 + i * 150, y);
break;
}
}
};
Window_SavefileStatus.prototype.drawCharacter2 = function (
characterName,
characterIndex,
x,
y
) {
var bitmap = ImageManager.loadCharacter(characterName);
var big = ImageManager.isBigCharacter(characterName);
var pw = bitmap.width / (big ? 3 : 12);
var ph = bitmap.height / (big ? 4 : 8);
var n = characterIndex;
if (big) n = 0;
var sx = ((n % 4) * 3 + 1) * pw;
var sy = Math.floor(n / 4) * 4 * ph;
this.contents.blt(bitmap, sx, sy, pw, ph, x - pw / 2, y - ph);
};
const _Window_SavefileStatus_prototype_resetFontSettings =
Window_SavefileStatus.prototype.resetFontSettings;
Window_SavefileStatus.prototype.resetFontSettings = function () {
_Window_SavefileStatus_prototype_resetFontSettings.call(this);
this.contents.fontFace = "menufont, " + $gameSystem.mainFontFace();
};
//最大セーブデータ数を上書き
DataManager.maxSavefiles = function () {
return 51;
};
//in
const _Window_Save_makeFontBigger = Window_Base.prototype.makeFontBigger;
Window_Base.prototype.makeFontBigger = function () {
if (this.contents.fontSize <= 96) {
this.contents.fontSize += 4;
} else {
_Window_Save_makeFontBigger.apply(this, arguments);
}
};
const _Window_Save_makeFontSmaller = Window_Base.prototype.makeFontSmaller;
Window_Base.prototype.makeFontSmaller = function () {
if (this.contents.fontSize >= 20) {
this.contents.fontSize -= 4;
} else {
_Window_Save_makeFontSmaller.apply(this, arguments);
}
};
//out
})();