slave-princess-charlotte/data/Script/screen/screen-unitmenu.js
2025-10-12 13:17:46 -05:00

866 lines
21 KiB
JavaScript

var UnitMenuMode = {
TOP: 0,
HELP: 1
};
var UnitMenuEnum = {
ALIVE: 0,
SORTIE: 1
};
var UnitMenuScreen = defineObject(BaseScreen,
{
_unit: null,
_unitEnumMode: 0,
_unitList: null,
_activePageIndex: 0,
_topWindow: null,
_bottomWindowArray: null,
_unitSentenceWindow: null,
_pageChanger: null,
_dataChanger: null,
setScreenData: function(screenParam) {
this._prepareScreenMemberData(screenParam);
this._completeScreenMemberData(screenParam);
},
moveScreenCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
this._moveAnimation();
if (mode === UnitMenuMode.TOP) {
result = this._moveTopMode();
}
else if (mode === UnitMenuMode.HELP) {
result = this._moveHelpMode();
}
return result;
},
drawScreenCycle: function() {
var x, y;
var index = this._activePageIndex;
var width = this._topWindow.getWindowWidth();
var topHeight = this._topWindow.getWindowHeight();
var bottomHeight = this._bottomWindowArray[index].getWindowHeight();
var interval = DefineControl.getWindowInterval();
if (this._isUnitSentenceVisible()) {
x = LayoutControl.getCenterX(-1, width + this._unitSentenceWindow.getWindowWidth());
}
else {
x = LayoutControl.getCenterX(-1, width);
}
y = LayoutControl.getCenterY(-1, topHeight + bottomHeight + interval);
this._topWindow.drawWindow(x, y);
if (this._isUnitSentenceVisible()) {
this._unitSentenceWindow.drawWindow(x + width, y);
}
this._bottomWindowArray[index].drawWindow(x, y + topHeight + interval);
// drawWindowの後のthis._pageChanger.drawPageは、
// スクロールカーソルがアイテムウインドウの上に表示されてしまう。
// 予めsetDrawingMethodを呼び出すことで、drawWindowContentの前にカーソルが描画されるようにする。
},
drawScreenBottomText: function(textui) {
var text;
var index = this._activePageIndex;
if (this._topWindow.isTracingHelp()) {
text = this._topWindow.getHelpText();
}
else if (this._bottomWindowArray[index].isHelpMode() || this._bottomWindowArray[index].isTracingHelp()) {
text = this._bottomWindowArray[index].getHelpText();
}
else {
text = this._unit.getDescription();
}
TextRenderer.drawScreenBottomText(text, textui);
},
getScreenInteropData: function() {
return root.queryScreen('UnitMenu');
},
getCurrentTarget: function() {
return this._unit;
},
getPageChanger: function() {
return this._pageChanger;
},
_prepareScreenMemberData: function(screenParam) {
this._unit = screenParam.unit;
this._unitEnumMode = screenParam.enummode;
this._unitList = this._getUnitList(this._unit);
this._activePageIndex = 0;
this._topWindow = createObject(UnitMenuTopWindow);
if (this._isUnitSentenceVisible()) {
this._unitSentenceWindow = createObject(UnitSentenceWindow);
}
this._bottomWindowArray = [];
this._pageChanger = createObject(HorizontalPageChanger);
this._dataChanger = createObject(VerticalDataChanger);
},
_completeScreenMemberData: function(screenParam) {
this._configureBottomWindows(this._bottomWindowArray);
this._setMenuData();
this._setNewTarget(this._unit);
this._playMenuOpenSound();
this._pageChanger.setPageData(this._bottomWindowArray.length, this._bottomWindowArray[0].getWindowWidth(), this._bottomWindowArray[0].getWindowHeight());
this.changeCycleMode(UnitMenuMode.TOP);
},
_setMenuData: function() {
var i, count;
var method = function(x, y) {
SceneManager.getLastScreen().getPageChanger().drawPage(x, y);
};
this._topWindow.setUnitMenuData();
count = this._bottomWindowArray.length;
for (i = 0; i < count; i++) {
this._bottomWindowArray[i].setDrawingMethod(method);
this._bottomWindowArray[i].setUnitMenuData();
}
},
_setNewTarget: function(unit) {
var i, count;
this._unit = unit;
if (this._isUnitSentenceVisible()) {
this._unitSentenceWindow.setUnitData(unit);
}
// unitは上下のウインドウも必要になる
this._topWindow.changeUnitMenuTarget(unit);
count = this._bottomWindowArray.length;
for (i = 0; i < count; i++) {
this._bottomWindowArray[i].changeUnitMenuTarget(unit);
}
},
_moveTopMode: function() {
var index;
var result = MoveResult.CONTINUE;
this._pageChanger.movePage();
if (this._pageChanger.checkPage()) {
this._activePageIndex = this._pageChanger.getPageIndex();
return result;
}
// 上下のキーが押された場合は_changeTargetでユニットが切り替わる
if (InputControl.isSelectAction()) {
result = this._selectAction();
}
else if (InputControl.isCancelAction()) {
result = this._cancelAction();
}
else if (InputControl.isOptionAction()) {
result = this._optionAction();
}
else {
index = this._dataChanger.checkDataIndex(this._unitList, this._unit);
if (index !== -1) {
this._setNewTarget(this._unitList.getData(index));
}
}
return result;
},
_moveHelpMode: function() {
if (!this._bottomWindowArray[this._activePageIndex].isHelpMode()) {
this.changeCycleMode(UnitMenuMode.TOP);
}
return MoveResult.CONTINUE;
},
_moveAnimation: function() {
this._topWindow.moveWindow();
this._bottomWindowArray[this._activePageIndex].moveWindow();
if (this._isUnitSentenceVisible()) {
this._unitSentenceWindow.moveWindow();
}
return MoveResult.CONTINUE;
},
_selectAction: function() {
return this._optionAction();
},
_cancelAction: function() {
this._playMenuCancelSound();
return MoveResult.END;
},
_optionAction: function() {
var result = this._bottomWindowArray[this._activePageIndex].setHelpMode();
if (result) {
this.changeCycleMode(UnitMenuMode.HELP);
}
return MoveResult.CONTINUE;
},
_getUnitList: function(unit) {
var list = [];
var type = unit.getUnitType();
if (type === UnitType.PLAYER) {
if (this._unitEnumMode === UnitMenuEnum.ALIVE) {
if (unit.isGuest()) {
// 開かれているユニットがゲストの場合は、ゲストユニットに切り替えるようにする
list = root.getCurrentSession().getGuestList();
}
else {
list = PlayerList.getAliveDefaultList();
}
}
else if (this._unitEnumMode === UnitMenuEnum.SORTIE) {
// 出撃が完了している場合は、PlayerListにゲストユニットも含まれる
list = PlayerList.getSortieDefaultList();
}
}
else if (type === UnitType.ENEMY) {
list = EnemyList.getAliveDefaultList();
}
else if (type === UnitType.ALLY) {
list = AllyList.getAliveDefaultList();
}
return list;
},
_isUnitSentenceVisible: function() {
return true;
},
_playMenuOpenSound: function() {
MediaControl.soundDirect('commandopen');
},
_playMenuCancelSound: function() {
MediaControl.soundDirect('commandcancel');
},
_configureBottomWindows: function(groupArray) {
groupArray.appendWindowObject(UnitMenuBottomWindow, this);
}
}
);
var UnitMenuTopWindow = defineObject(BaseWindow,
{
_unit: null,
setUnitMenuData: function() {
},
changeUnitMenuTarget: function(unit) {
this._unit = unit;
},
moveWindowContent: function() {
return MoveResult.CONTINUE;
},
drawWindowContent: function(x, y) {
this._drawUnitFace(x, y);
this._drawUnitName(x, y);
this._drawUnitClass(x, y);
this._drawUnitLevel(x, y);
this._drawUnitHp(x, y);
this._drawFusionIcon(x, y);
},
getWindowWidth: function() {
return DefineControl.getUnitMenuWindowWidth();
},
getWindowHeight: function() {
return DefineControl.getFaceWindowHeight();
},
getWindowXPadding: function() {
return DefineControl.getFaceXPadding();
},
getWindowYPadding: function() {
return DefineControl.getFaceYPadding();
},
getWindowTextUI: function() {
return root.queryTextUI('face_window');
},
getWindowUI: function() {
return root.queryTextUI('face_window').getUIImage();
},
isTracingHelp: function() {
var range = createRangeObject(this.xRendering + 120, this.yRendering + 50, 170, 32);
return MouseControl.isHovering(range) && this._unit.getClass().getDescription() !== '';
},
getHelpText: function() {
var text = '';
if (this.isTracingHelp()) {
text = this._unit.getClass().getDescription();
}
return text;
},
_drawUnitFace: function(xBase, yBase) {
var alpha = 255;
if (this._unit.getHp() === 0) {
// 蘇生時に実行される
alpha = 128;
}
ContentRenderer.drawUnitFace(xBase, yBase, this._unit, false, alpha);
},
_drawUnitName: function(xBase, yBase) {
var textui = this.getWindowTextUI();
var color = textui.getColor();
var font = textui.getFont();
var length = this._getUnitTextLength();
var x = xBase + 130;
var y = yBase + 15;
TextRenderer.drawText(x, y, this._unit.getName(), length, color, font);
},
_drawUnitClass: function(xBase, yBase) {
var textui = this.getWindowTextUI();
var color = textui.getColor();
var font = textui.getFont();
var length = this._getClassTextLength();
var x = xBase + 120;
var y = yBase + 50;
var cls = this._unit.getClass();
UnitRenderer.drawDefaultUnit(this._unit, x, y, null);
TextRenderer.drawText(x + 45, y + 13, cls.getName(), length, color, font);
},
_drawUnitLevel: function(xBase, yBase) {
var x = xBase + 303;
var y = yBase + 10;
ContentRenderer.drawLevelInfo(x, y, this._unit);
},
_drawUnitHp: function(xBase, yBase) {
var x = xBase + 303;
var y = yBase + 50;
var pic = root.queryUI('unit_gauge');
ContentRenderer.drawUnitHpZone(x, y, this._unit, pic);
},
_drawFusionIcon: function(xBase, yBase) {
var handle;
var x = xBase + 102;
var y = yBase + 11;
if (FusionControl.getFusionParent(this._unit) === null) {
return;
}
handle = FusionControl.getFusionData(this._unit).getIconResourceHandle();
if (handle.isNullHandle()) {
return;
}
GraphicsRenderer.drawImage(x, y, handle, GraphicsType.ICON);
},
_getUnitTextLength: function() {
return 180;
},
_getClassTextLength: function() {
return 145;
}
}
);
var BaseMenuBottomWindow = defineObject(BaseWindow,
{
setUnitMenuData: function() {
},
changeUnitMenuTarget: function(unit) {
},
moveWindowContent: function() {
return MoveResult.END;
},
drawWindowContent: function(x, y) {
},
getWindowWidth: function() {
return DefineControl.getUnitMenuWindowWidth();
},
getWindowHeight: function() {
return DefineControl.getUnitMenuBottomWindowHeight();
},
setHelpMode: function() {
return false;
},
isHelpMode: function() {
return false;
},
isTracingHelp: function() {
return false;
},
getHelpText: function() {
return '';
}
}
);
var UnitMenuHelp = {
ITEM: 0,
SKILL: 1
};
var UnitMenuBottomWindow = defineObject(BaseMenuBottomWindow,
{
_statusScrollbar: null,
_unit: null,
_unitMenuHelp: 0,
_isTracingLocked: false,
_skillInteraction: null,
_itemInteraction: null,
setUnitMenuData: function() {
this._skillInteraction = createObject(SkillInteraction);
this._itemInteraction = createObject(ItemInteraction);
this._statusScrollbar = createScrollbarObject(UnitStatusScrollbar, this);
},
changeUnitMenuTarget: function(unit) {
this._unit = unit;
this._unitMenuHelp = 0;
this._itemInteraction.setData(unit);
this._itemInteraction.setWindowTextUI(this.getWindowTextUI());
this._setSkillData(unit);
this._statusScrollbar.setStatusFromUnit(unit);
this._skillInteraction.checkInitialTopic();
this._itemInteraction.checkInitialTopic();
},
moveWindowContent: function() {
var recentlyInput;
this._itemInteraction.moveInteraction();
this._skillInteraction.moveInteraction();
if (!this.isHelpMode()) {
return MoveResult.CONTINUE;
}
if (this._unitMenuHelp === UnitMenuHelp.ITEM) {
recentlyInput = this._itemInteraction.getInteractionScrollbar().getRecentlyInputType();
if (this._skillInteraction.isHelpAvailable() && (recentlyInput === InputType.LEFT || recentlyInput === InputType.RIGHT)) {
this._itemInteraction.cancelInteraction();
this._unitMenuHelp = UnitMenuHelp.SKILL;
this._skillInteraction.setHelpMode();
}
}
else if (this._unitMenuHelp === UnitMenuHelp.SKILL) {
recentlyInput = this._skillInteraction.getInteractionScrollbar().getRecentlyInputType();
if (this._itemInteraction.isHelpAvailable() && (recentlyInput === InputType.UP || recentlyInput === InputType.DOWN)) {
this._skillInteraction.cancelInteraction();
this._unitMenuHelp = UnitMenuHelp.ITEM;
this._itemInteraction.setHelpMode();
}
}
return MoveResult.CONTINUE;
},
drawWindowContent: function(x, y) {
this._drawParamArea(x, y);
this._drawItemArea(x, y);
this._drawWeaponTypeArea(x, y);
this._drawSkillArea(x, y);
this._drawInfoWindow(x, y);
},
isHelpMode: function() {
return this._itemInteraction.isHelpMode() || this._skillInteraction.isHelpMode();
},
isTracingHelp: function() {
return this._itemInteraction.isTracingHelp() || this._skillInteraction.isTracingHelp();
},
setHelpMode: function() {
if (this._itemInteraction.setHelpMode()) {
this._unitMenuHelp = UnitMenuHelp.ITEM;
return true;
}
if (this._skillInteraction.setHelpMode()) {
this._unitMenuHelp = UnitMenuHelp.SKILL;
return true;
}
return false;
},
getHelpText: function() {
var text = '';
var help = this._getActiveUnitMenuHelp();
if (help === UnitMenuHelp.ITEM) {
text = this._itemInteraction.getHelpText();
}
else if (help === UnitMenuHelp.SKILL) {
text = this._skillInteraction.getHelpText();
}
return text;
},
lockTracing: function(isLocked) {
this._isTracingLocked = isLocked;
},
// 後のバージョンで削除
_setStatusArea: function(unit) {
var statusEntry = this._createStatusEntry(unit);
this._statusScrollbar.setStatusFromParam(statusEntry.typeArray, statusEntry.paramArray, 2, 4);
},
// 後のバージョンで削除
_createStatusEntry: function(unit) {
var i;
var count = ParamGroup.getParameterCount();
var statusEntry = StructureBuilder.buildStatusEntry();
statusEntry.typeArray = [];
statusEntry.paramArray = [];
// HPを入れないために1から開始する
for (i = 1; i < count; i++) {
statusEntry.typeArray.push(ParamGroup.getParameterName(i));
// ボーナスも加算する
statusEntry.paramArray.push(ParamGroup.getLastValue(unit, i));
}
return statusEntry;
},
_setSkillData: function(unit) {
var i;
var weapon = ItemControl.getEquippedWeapon(unit);
var arr = SkillControl.getSkillMixArray(unit, weapon, -1, '');
var count = arr.length;
var newSkillArray = [];
for (i = 0; i < count; i++) {
if (!arr[i].skill.isHidden()) {
newSkillArray.push(arr[i]);
}
}
this._skillInteraction.setSkillArray(newSkillArray);
},
_drawItemArea: function(xBase, yBase) {
this._itemInteraction.getInteractionScrollbar().drawScrollbar(xBase, yBase);
},
_drawParamArea: function(xBase, yBase) {
var dx = 15;
this._statusScrollbar.drawScrollbar(xBase + ItemRenderer.getItemWidth() + dx, yBase);
},
_drawWeaponTypeArea: function(xBase, yBase) {
var dy = this._itemInteraction.getInteractionScrollbar().getScrollbarHeight() + 14;
WeaponTypeRenderer.drawClassWeaponList(xBase, yBase + dy, this._unit.getClass());
},
_drawSkillArea: function(xBase, yBase) {
var dy = this._itemInteraction.getInteractionScrollbar().getScrollbarHeight() + 14;
var width = 230;
this._skillInteraction.getInteractionScrollbar().drawScrollbar(xBase + width, yBase + dy);
},
_drawInfoWindow: function(xBase, yBase) {
var x, help;
if (this._isTracingLocked) {
return;
}
help = this._getActiveUnitMenuHelp();
if (help === UnitMenuHelp.SKILL) {
this._skillInteraction.getInteractionWindow().drawWindow(xBase, yBase);
}
else if (help === UnitMenuHelp.ITEM) {
x = xBase + ItemRenderer.getItemWidth();
if (x + this._itemInteraction.getInteractionWindow().getWindowWidth() > root.getGameAreaWidth()) {
x -= x + this._itemInteraction.getInteractionWindow().getWindowWidth() - root.getGameAreaWidth();
x -= 8;
}
this._itemInteraction.getInteractionWindow().drawWindow(x, yBase);
}
},
_getActiveUnitMenuHelp: function() {
var help = -1;
if (this._itemInteraction.isTracingHelp()) {
help = UnitMenuHelp.ITEM;
}
else if (this._skillInteraction.isTracingHelp()) {
help = UnitMenuHelp.SKILL;
}
else if (this._itemInteraction.isHelpMode()) {
help = UnitMenuHelp.ITEM;
}
else if (this._skillInteraction.isHelpMode()) {
help = UnitMenuHelp.SKILL;
}
return help;
}
}
);
var IconItemScrollbar = defineObject(BaseScrollbar,
{
drawScrollContent: function(x, y, object, isSelect, index) {
var handle = object.skill.getIconResourceHandle();
GraphicsRenderer.drawImage(x, y, handle, GraphicsType.ICON);
},
drawDescriptionLine: function(x, y) {
},
playSelectSound: function() {
},
getObjectWidth: function() {
return 30;
},
getObjectHeight: function() {
return GraphicsFormat.ICON_HEIGHT;
}
}
);
var BaseInteraction = defineObject(BaseObject,
{
_isHelpMode: false,
_scrollbar: null,
_window: null,
moveInteraction: function() {
var input, index;
if (this._isHelpMode) {
input = this._scrollbar.moveInput();
if (input === ScrollbarInput.CANCEL) {
this.cancelInteraction();
}
else {
this._changeTopic();
}
}
else {
index = this._getTracingIndex();
if (index !== -1) {
this._scrollbar.setIndex(index);
this._changeTopic();
}
}
return MoveResult.CONTINUE;
},
checkInitialTopic: function() {
var index = MouseControl.getIndexFromMouse(this._scrollbar);
if (index !== -1) {
this._scrollbar.setIndex(index);
this._changeTopic();
}
},
cancelInteraction: function() {
this._isHelpMode = false;
this._scrollbar.setActive(false);
},
isInteraction: function() {
return this.isHelpMode() || this.isTracingHelp();
},
isHelpMode: function() {
return this._isHelpMode;
},
isTracingHelp: function() {
return MouseControl.getIndexFromMouse(this._scrollbar) !== -1;
},
isHelpAvailable: function() {
return this._scrollbar.getObjectCount() > 0;
},
setHelpMode: function() {
if (!this.isHelpAvailable()) {
return false;
}
this._isHelpMode = true;
this._scrollbar.setActive(true);
this._playHelpSelectSound();
return true;
},
getHelpText: function() {
var item = this._scrollbar.getObject();
return item.getDescription();
},
getInteractionScrollbar: function() {
return this._scrollbar;
},
getInteractionWindow: function() {
return this._window;
},
_changeTopic: function() {
},
_getTracingIndex: function() {
return MouseControl.pointMouse(this._scrollbar);
},
_playHelpSelectSound: function() {
MediaControl.soundDirect('commandselect');
}
}
);
var ItemInteraction = defineObject(BaseInteraction,
{
_textui: null,
initialize: function() {
this._scrollbar = createScrollbarObject(ItemDropListScrollbar, this);
this._scrollbar.setScrollFormation(1, DefineControl.getVisibleUnitItemCount());
this._window = createWindowObject(ItemInfoWindow, this);
},
setData: function(unit) {
this._scrollbar.setUnitItemFormation(unit);
this._scrollbar.resetDropMark();
},
getWindowTextUI: function() {
return this._textui;
},
setWindowTextUI: function(textui) {
this._textui = textui;
},
_changeTopic: function() {
var item = this._scrollbar.getObject();
this._window.setInfoItem(item);
}
}
);
var SkillInteraction = defineObject(BaseInteraction,
{
initialize: function() {
this._scrollbar = createScrollbarObject(IconItemScrollbar, this);
this._scrollbar.setScrollFormation(7, 1);
this._window = createWindowObject(SkillInfoWindow, this);
},
setSkillArray: function(arr) {
this._scrollbar.setObjectArray(arr);
},
getHelpText: function() {
var skillEntry = this._scrollbar.getObject();
return skillEntry.skill.getDescription();
},
_changeTopic: function() {
var skillEntry = this._scrollbar.getObject();
this._window.setSkillInfoData(skillEntry.skill, skillEntry.objecttype);
}
}
);
var SkillInteractionLong = defineObject(SkillInteraction,
{
initialize: function() {
this._scrollbar = createScrollbarObject(IconItemScrollbar, this);
this._scrollbar.setScrollFormation(7, 1);
this._window = createWindowObject(SkillInfoWindowLong, this);
}
}
);