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

717 lines
20 KiB
JavaScript

var MultiClassChangeMode = {
TOP: 0,
HELP: 1,
CHANGEQUESTION: 2,
ANIME: 3,
NOCHANGE: 4
};
var MultiClassChangeScreen = defineObject(BaseScreen,
{
_unit: null,
_isMapCall: false,
_classInfoWindow: null,
_classParameterWindow: null,
_classSelectWindow: null,
_infoWindow: null,
_questionWindow: null,
_dynamicAnime: null,
_classEntryArray: null,
_currentIndex: 0,
_returnData: null,
setScreenData: function(screenParam) {
this._prepareScreenMemberData(screenParam);
this._completeScreenMemberData(screenParam);
},
moveScreenCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
if (mode === MultiClassChangeMode.TOP) {
result = this._moveTop();
}
else if (mode === MultiClassChangeMode.HELP) {
result = this._moveHelp();
}
else if (mode === MultiClassChangeMode.CHANGEQUESTION) {
result = this._moveChangeQuestion();
}
else if (mode === MultiClassChangeMode.ANIME) {
result = this._moveAnime();
}
else if (mode === MultiClassChangeMode.NOCHANGE) {
result = this._moveNoChangeMode();
}
this._moveInfoParameter();
return result;
},
drawScreenCycle: function() {
var mode = this.getCycleMode();
if (mode !== MultiClassChangeMode.NOCHANGE) {
this._drawMainWindow();
}
this._drawSubWindow();
if (mode === MultiClassChangeMode.ANIME) {
this._drawAnime();
}
},
drawScreenBottomText: function(textui) {
var text, classEntry;
if (this._classEntryArray === null) {
return;
}
if (this._classInfoWindow.getSkillInteraction().isInteraction()) {
text = this._classInfoWindow.getSkillInteraction().getHelpText();
}
else {
classEntry = this._classEntryArray[this._currentIndex];
if (classEntry.isChange) {
text = classEntry.cls.getDescription();
}
else {
text = '';
}
}
TextRenderer.drawScreenBottomText(text, textui);
},
getScreenInteropData: function() {
return root.queryScreen('ClassChange');
},
getScreenResult: function() {
return this._returnData;
},
getTotalWindowHeight: function() {
return this._classInfoWindow.getWindowHeight() + this._classParameterWindow.getWindowHeight();
},
_prepareScreenMemberData: function(screenParam) {
this._unit = screenParam.unit;
this._isMapCall = screenParam.isMapCall;
this._classInfoWindow = createWindowObject(MultiClassInfoWindow, this);
this._classParameterWindow = createWindowObject(MultiClassParameterWindow, this);
this._classSelectWindow = createWindowObject(MultiClassSelectWindow, this);
this._infoWindow = createWindowObject(InfoWindow, this);
this._questionWindow = createWindowObject(QuestionWindow, this);
this._dynamicAnime = createWindowObject(DynamicAnime, this);
this._classEntryArray = null;
this._currentIndex = 0;
this._returnData = null;
},
_completeScreenMemberData: function(screenParam) {
var classEntryArray = this._getClassEntryArray(screenParam);
if (classEntryArray.length > 0) {
this._questionWindow.setQuestionMessage(this._getQuestionMessage());
this._classSelectWindow.setClassSelectData(this._unit, classEntryArray);
this._classInfoWindow.setClassInfoData(this._unit, classEntryArray[0]);
this._classParameterWindow.setClassParameterData(this._unit, classEntryArray[0]);
this._classEntryArray = classEntryArray;
this.changeCycleMode(MultiClassChangeMode.TOP);
}
else {
// クラスグループが存在しない、またはクラスグループの中身が空白な場合は、クラスチェンジできない
this._infoWindow.setInfoMessage(StringTable.ClassChange_UnableClassChange);
this.changeCycleMode(MultiClassChangeMode.NOCHANGE);
}
},
_moveTop: function() {
var index, input, recentlyInput;
var result = MoveResult.CONTINUE;
input = this._classSelectWindow.moveWindow();
if (input === ScrollbarInput.SELECT) {
if (this._classEntryArray[this._currentIndex].isChange) {
this._classSelectWindow.enableSelectCursor(false);
this._questionWindow.setQuestionActive(true);
this.changeCycleMode(MultiClassChangeMode.CHANGEQUESTION);
}
}
else if (input === ScrollbarInput.CANCEL) {
if (this._isMapCall) {
this._returnData = null;
}
result = MoveResult.END;
}
else if (input === ScrollbarInput.NONE) {
recentlyInput = this._classSelectWindow.getRecentlyInputType();
if (recentlyInput === InputType.LEFT || recentlyInput === InputType.RIGHT) {
this._setHelpMode();
}
else {
index = this._classSelectWindow.getClassEntryIndex();
if (index !== this._currentIndex) {
this._currentIndex = index;
this._classInfoWindow.setClassInfoData(this._unit, this._classEntryArray[index]);
this._classParameterWindow.setBonusStatus(this._unit, this._classEntryArray[index]);
}
}
}
return result;
},
_moveHelp: function() {
if (!this._classInfoWindow.getSkillInteraction().isHelpMode()) {
this._classSelectWindow.enableSelectCursor(true);
this.changeCycleMode(MultiClassChangeMode.TOP);
}
return MoveResult.CONTINUE;
},
_moveChangeQuestion: function() {
if (this._questionWindow.moveWindow() !== MoveResult.CONTINUE) {
if (this._questionWindow.getQuestionAnswer() === QuestionAnswer.YES) {
if (this._isMapCall) {
this._setScreenResult();
// クラスチェンジアニメの表示はマップ上で行うため、ここで終了になる
return MoveResult.END;
}
this._startAnime();
this.changeCycleMode(MultiClassChangeMode.ANIME);
}
else {
this._classSelectWindow.enableSelectCursor(true);
this.changeCycleMode(MultiClassChangeMode.TOP);
}
}
return MoveResult.CONTINUE;
},
_moveAnime: function() {
var cls = this._classEntryArray[this._currentIndex];
if (this._dynamicAnime.moveDynamicAnime() !== MoveResult.CONTINUE) {
this._classInfoWindow.setClass(cls);
this._classParameterWindow.notifyNewClass(this._unit, cls);
this._classSelectWindow.enableSelectCursor(true);
this.changeCycleMode(MultiClassChangeMode.TOP);
}
return MoveResult.CONTINUE;
},
_moveNoChangeMode: function() {
if (this._infoWindow.moveWindow() !== MoveResult.CONTINUE) {
this._playCancelSound();
return MoveResult.END;
}
return MoveResult.CONTINUE;
},
_moveInfoParameter: function() {
var mode = this.getCycleMode();
if (mode !== MultiClassChangeMode.NOCHANGE) {
this._classInfoWindow.moveWindow();
this._classParameterWindow.moveWindow();
}
return MoveResult.CONTINUE;
},
_drawAnime: function() {
this._dynamicAnime.drawDynamicAnime();
},
_drawMainWindow: function() {
var width = this._classSelectWindow.getWindowWidth() + this._classParameterWindow.getWindowWidth();
var height = this._classSelectWindow.getWindowHeight();
var x = LayoutControl.getCenterX(-1, width);
var y = LayoutControl.getCenterY(-1, height);
width = this._classSelectWindow.getWindowWidth();
height = this._classParameterWindow.getWindowHeight();
this._classSelectWindow.drawWindow(x, y);
this._classParameterWindow.drawWindow(x + width, y);
this._classInfoWindow.drawWindow(x + width, y + height);
},
_drawSubWindow: function() {
var x, y;
var mode = this.getCycleMode();
if (mode === MultiClassChangeMode.CHANGEQUESTION) {
x = LayoutControl.getCenterX(-1, this._questionWindow.getWindowWidth());
y = LayoutControl.getCenterY(-1, this._questionWindow.getWindowHeight());
this._questionWindow.drawWindow(x, y);
}
else if (mode === MultiClassChangeMode.NOCHANGE) {
x = LayoutControl.getCenterX(-1, this._infoWindow.getWindowWidth());
y = LayoutControl.getCenterY(-1, this._infoWindow.getWindowHeight());
this._infoWindow.drawWindow(x, y);
}
},
_startAnime: function() {
var anime = root.queryAnime('classchange');
var pos = this._classInfoWindow.getClassChangeAnimePos();
var width = this._classSelectWindow.getWindowWidth();
var height = this._classSelectWindow.getWindowHeight();
var x = LayoutControl.getCenterX(-1, width);
var y = LayoutControl.getCenterY(-1, height);
this._dynamicAnime.startDynamicAnime(anime, x + pos.x, y + pos.y + this._classParameterWindow.getWindowHeight());
},
_setHelpMode: function() {
var classEntry;
if (this._classEntryArray === null) {
return;
}
classEntry = this._classEntryArray[this._currentIndex];
if (!classEntry.isChange) {
return;
}
if (this._classInfoWindow.getSkillInteraction().setHelpMode()) {
this._classSelectWindow.enableSelectCursor(false);
this.changeCycleMode(MultiClassChangeMode.HELP);
}
},
_setScreenResult: function() {
this._returnData = this._classEntryArray[this._currentIndex].cls;
},
_getClassEntryArray: function(screenParam) {
return ClassChangeChecker.getClassEntryArray(screenParam.unit, screenParam.isMapCall);
},
_getQuestionMessage: function() {
return StringTable.ClassChange_UnitClassChange;
},
_playCancelSound: function() {
MediaControl.soundDirect('commandcancel');
}
}
);
var MultiClassInfoWindowMode = {
TOP: 0,
SKILL: 1
};
var MultiClassInfoWindow = defineObject(BaseWindow,
{
_unit: null,
_targetClass: null,
_motionId: 0,
_isClassDraw: false,
_animeData: null,
_animeSimple: null,
_animeRenderParam: null,
_unitRenderParam: null,
_isHelpMode: false,
_handle: null,
_skillInteraction: null,
initialize: function() {
this._skillInteraction = createObject(SkillInteraction);
},
setClassInfoData: function(unit, classEntry) {
this._unit = unit;
this._targetClass = classEntry.cls;
this._isClassDraw = classEntry.isChange;
this._setSkillData();
this._setBattleMotionGraphics();
this._handle = this._getTargetHandle();
this.changeCycleMode(MultiClassInfoWindowMode.TOP);
},
moveWindowContent: function() {
this._skillInteraction.moveInteraction();
return MoveResult.CONTINUE;
},
drawWindowContent: function(x, y) {
var textui = root.queryTextUI('decoration_title');
var color = ColorValue.KEYWORD;
var font = textui.getFont();
var pic = textui.getUIImage();
WeaponTypeRenderer.drawTitle(x + 220, y - 10, color, font, pic);
SkillRenderer.drawTitle(x + 220, y + 70, color, font, pic);
if (this._isClassDraw) {
WeaponTypeRenderer.drawClassWeaponList(x + 220, y + 50, this._targetClass);
this._skillInteraction.getInteractionScrollbar().drawScrollbar(x + 220, y + 130);
this._drawClassGraphics(x, y);
}
else {
TextRenderer.drawText(x + 60, y + 80, StringTable.HideData_Unknown, -1, color, font);
}
if (this._skillInteraction.isInteraction()) {
this._skillInteraction.getInteractionWindow().drawWindow(x, y);
}
},
getWindowWidth: function() {
return 450;
},
getWindowHeight: function() {
return 190;
},
// クラスチェンジ実行時に呼ばれる
setClass: function(classEntry) {
if (this._animeRenderParam !== null) {
this._animeRenderParam.alpha = 255;
}
else {
this._unitRenderParam.alpha = 255;
}
Miscellaneous.changeClass(this._unit, classEntry.cls);
this._unit.setHp(ParamBonus.getMhp(this._unit));
},
getClassChangeAnimePos: function() {
return createPos(-50, 0);
},
getSkillInteraction: function() {
return this._skillInteraction;
},
_setBattleMotionGraphics: function() {
var alpha = 255;
var animeData = BattlerChecker.findBattleAnime(this._targetClass, null);
if (this._unit.getClass() !== this._targetClass) {
alpha = 128;
}
if (DataConfig.isMotionGraphicsEnabled() && animeData !== null) {
this._motionId = this._getMotionId();
this._animeData = animeData;
this._animeSimple = createObject(NonBattleAnimeSimple);
this._animeSimple.setAnimeData(animeData);
this._animeSimple.setMotionId(this._motionId);
this._animeRenderParam = StructureBuilder.buildAnimeRenderParam();
this._animeRenderParam.alpha = alpha;
this._animeRenderParam.isRight = true;
this._animeRenderParam.motionColorIndex = Miscellaneous.getMotionColorIndex(this._unit);
}
else {
this._unitRenderParam = StructureBuilder.buildUnitRenderParam();
this._unitRenderParam.alpha = alpha;
this._unitRenderParam.handle = this._getTargetHandle();
}
},
_setSkillData: function() {
var i;
var refList = this._targetClass.getSkillReferenceList();
var count = refList.getTypeCount();
var arr = [];
var skillEntry;
for (i = 0; i < count; i++) {
data = refList.getTypeData(i);
skillEntry = StructureBuilder.buildMixSkillEntry();
skillEntry.skill = data;
skillEntry.objecttype = ObjectType.CLASS;
arr.push(skillEntry);
}
this._skillInteraction.setSkillArray(arr);
},
_drawClassGraphics: function(x, y) {
var frameIndex, spriteIndex;
var animeCoordinates = StructureBuilder.buildAnimeCoordinates();
if (this._animeSimple !== null) {
frameIndex = 0;
spriteIndex = this._animeData.getSpriteIndexFromType(this._motionId, frameIndex, SpriteType.KEY);
animeCoordinates.xBase = x + 96;
animeCoordinates.yBase = y + 145;
this._animeSimple.drawMotion(frameIndex, spriteIndex, this._animeRenderParam, animeCoordinates);
}
else {
UnitRenderer.drawDefaultUnit(this._unit, x + 80, y + 85, this._unitRenderParam);
}
},
_getTargetHandle: function() {
var xSrc, ySrc;
var handle = this._targetClass.getCharChipResourceHandle();
var isRuntime = handle.getHandleType() === ResourceHandleType.RUNTIME;
var id = handle.getResourceId();
var colorIndex = handle.getColorIndex();
handle = this._unit.getCharChipResourceHandle();
xSrc = handle.getSrcX();
ySrc = handle.getSrcY();
return root.createResourceHandle(isRuntime, id, colorIndex, xSrc, ySrc);
},
_getMotionId: function() {
return MotionIdControl.getWaitId(this._unit, null);
}
}
);
var MultiClassParameterWindow = defineObject(BaseWindow,
{
_scrollbar: null,
setClassParameterData: function(targetUnit, classEntry) {
this._scrollbar = createScrollbarObject(StatusScrollbar, this);
this._scrollbar.enableStatusBonus(true);
this._scrollbar.setStatusFromUnit(targetUnit);
this.setBonusStatus(targetUnit, classEntry);
},
moveWindowContent: function() {
// moveScrollbarCursorではなく、moveScrollbarContentを呼び出す。
// カーソル動作を発生させると、MultiClassChangeScreenの_classSelectWindowが高速化する。
this._scrollbar.moveScrollbarContent();
return MoveResult.CONTINUE;
},
drawWindowContent: function(x, y) {
this._scrollbar.drawScrollbar(x, y);
},
getWindowWidth: function() {
return this._scrollbar.getScrollbarWidth() + (this.getWindowXPadding() * 2);
},
getWindowHeight: function() {
return this._scrollbar.getScrollbarHeight() + (this.getWindowYPadding() * 2);
},
setBonusStatus: function(unit, targetClassEntry) {
var i, bonusArray, bonusArrayTarget;
var newBonusArray = [];
var count = ParamGroup.getParameterCount();
if (targetClassEntry.isChange) {
bonusArray = this.getClassBonusArray(unit.getClass());
bonusArrayTarget = this.getClassBonusArray(targetClassEntry.cls);
for (i = 0; i < count; i++) {
newBonusArray[i] = bonusArrayTarget[i] - bonusArray[i];
}
}
else {
for (i = 0; i < count; i++) {
newBonusArray[i] = 0;
}
}
this._scrollbar.setStatusBonus(newBonusArray);
},
getClassBonusArray: function(cls) {
var i;
var count = ParamGroup.getParameterCount();
var bonusArray = [];
for (i = 0; i < count; i++) {
bonusArray[i] = ParamGroup.getParameterBonus(cls, i);
}
return bonusArray;
},
notifyNewClass: function(unit, cls) {
this._scrollbar.setStatusFromUnit(unit);
this.setBonusStatus(unit, cls);
}
}
);
var MultiClassSelectWindow = defineObject(BaseWindow,
{
_scrollbar: null,
setClassSelectData: function(unit, classEntryArray) {
var i, count;
this._scrollbar = createScrollbarObject(MultiClassSelectScrollbar, this);
this._scrollbar.setScrollFormation(1, 7);
this._scrollbar.resetScrollData();
count = classEntryArray.length;
for (i = 0; i < count; i++) {
this._scrollbar.objectSet(classEntryArray[i]);
}
this._scrollbar.objectSetEnd();
this._scrollbar.setActive(true);
},
moveWindowContent: function() {
return this._scrollbar.moveInput();
},
drawWindowContent: function(x, y) {
this._scrollbar.drawScrollbar(x, y);
},
getWindowWidth: function() {
return 160;
},
getWindowHeight: function() {
return SceneManager.getLastScreen().getTotalWindowHeight();
},
enableSelectCursor: function(isActive) {
this._scrollbar.enableSelectCursor(isActive);
},
getRecentlyInputType: function() {
return this._scrollbar.getRecentlyInputType();
},
getClassEntryIndex: function() {
return this._scrollbar.getIndex();
}
}
);
var MultiClassSelectScrollbar = defineObject(BaseScrollbar,
{
drawScrollContent: function(x, y, object, isSelect, index) {
var length = this._getTextLength();
var textui = this.getParentTextUI();
var color = textui.getColor();
var font = textui.getFont();
if (!object.isChange) {
color = ColorValue.DISABLE;
}
TextRenderer.drawKeywordText(x, y, object.name, length, color, font);
},
playSelectSound: function() {
var object = this.getObject();
var isSelect = true;
if (!object.isChange) {
isSelect = false;
}
if (isSelect) {
MediaControl.soundDirect('commandselect');
}
else {
MediaControl.soundDirect('operationblock');
}
},
getObjectWidth: function() {
return DefineControl.getTextPartsWidth();
},
getObjectHeight: function() {
return DefineControl.getTextPartsHeight();
},
_getTextLength: function() {
return this.getObjectWidth();
}
}
);
//------------------------------------------------------------------
var MetamorphozeScreen = defineObject(MultiClassChangeScreen,
{
drawScreenBottomText: function(textui) {
var metamorphozeData = this._classEntryArray[this._currentIndex].metamorphozeData;
if (metamorphozeData !== null) {
TextRenderer.drawScreenBottomText(metamorphozeData.getDescription(), textui);
}
else {
TextRenderer.drawScreenBottomText('', textui);
}
},
getScreenInteropData: function() {
return root.queryScreen('Metamorphoze');
},
_setScreenResult: function() {
this._returnData = this._classEntryArray[this._currentIndex].metamorphozeData;
},
_getClassEntryArray: function(screenParam) {
var i, classEntry, metamorphozeData;
var unit = screenParam.unit;
var count = screenParam.refList.getTypeCount();
var classEntryArray = [];
for (i = 0; i < count; i++) {
metamorphozeData = screenParam.refList.getTypeData(i);
classEntry = StructureBuilder.buildMultiClassEntry();
classEntry.cls = metamorphozeData.getClass();
classEntry.isChange = MetamorphozeControl.isMetamorphozeAllowed(unit, metamorphozeData);
if (classEntry.isChange) {
classEntry.name = metamorphozeData.getName();
}
else {
classEntry.name = StringTable.HideData_Question;
}
classEntry.metamorphozeData = metamorphozeData;
classEntryArray.push(classEntry);
}
return classEntryArray;
},
_getQuestionMessage: function() {
return StringTable.Metamorphoze_Change;
}
}
);