EF2 Changelog

Builds / 1.14.88

Update 1.14.88

Compared with 1.14.86 · published Sat, 26 Sep 2026 09:43:03 GMT · live channel

No summary yet.

Text changes 1

KeyText
GAME_1850 + Call of Twilight can only take you to a wave at or below your recorded highest wave.

Translations touched: de (1), es (1), fr (1), id (1), it (1), ja (1), ko (1), pl (1), pt (1), ru (1), th (1), tr (1), vi (1), zh-CN (1), zh-TW (1)

Code 14 changes in 6 classes

Minified client code with short names blanked for diffing. Class names are real.

TreasureDetailPopup 7 hunks, 33 statements
- super(),Xt(this,"abilityBg"),Xt(this,"setBg"),Xt(this,"icon",new HJt),Xt(this,"lblName",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblMaxLevel",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblAbilityTitle",new yD("유물능력",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"buffInfo1",new ZJt),Xt(this,"buffInfo2",new ZJt),Xt(this,"lblBuffDesc1",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_DESC_FONT_OPTION_16)),Xt(this,"lblBuffDesc2",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_DESC_FONT_OPTION_16)),Xt(this,"lblSetTitle",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"setContainer",new He),Xt(this,"tierLabels",[]),Xt(this,"skillLabels",[]),Xt(this,"setIcons",[]),Xt(this,"lblFooter",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblHonorCoin",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnAction",new fF("UI_GEM","","",.8,160,60)),Xt(this,"btnLimitBreak",new fF("PVP_COIN_ON","","",.7,180,60)),Xt(this,"btn10LimitBreak",new fF("PVP_COIN_ON","","+10",.7,180,60)),Xt(this,"btn100LimitBreak",new fF("PVP_COIN_ON","","+100",.7,180,60)),Xt(this,"btnMaxLimitBreak",new fF("PVP_COIN_ON","","MAX",.7,180,60)),Xt(this,"multiLimitBreakContainer",new He),Xt(this,"btnResetLimitBreak",new fF("UI_GEM_ICON","","",.7,180,60)),Xt(this,"contentContainer",new He),Xt(this,"vo"),Xt(this,"mode","unequip"),Xt(this,"limitBreakTimer",null),Xt(this,"limitBreakStartValue",-1),Xt(this,"limitBreakStartHonorCoin",-1),Xt(this,"hideHandler",null),Xt(this,"requestPending",!1),Xt(this,"bookVo"),this.bg.height<850&&(this.bg.height=850,this.y=Xy.safeHeight-850),this.addChild(this.contentContainer),this.icon.hideFrame(),this.icon.x=11,this.icon.y=50,this.contentContainer.addChild(this.icon),this.lblName.x=this.icon.x+this.icon.width+20,this.lblName.y=this.icon.y+5,this.contentContainer.addChild(this.lblName),this.lblMaxLevel.x=this.lblName.x,this.lblMaxLevel.y=this.lblName.y+this.lblName.height+8,this.contentContainer.addChild(this.lblMaxLevel),this.abilityBg=new nU,this.abilityBg.setIndex(2),this.abilityBg.width=620,this.abilityBg.height=130,this.abilityBg.x=11,this.abilityBg.y=this.icon.y+this.icon.height+15,this.contentContainer.addChild(this.abilityBg),this.lblAbilityTitle.text=sB.getText("GAME_146","유물능력"),this.lblAbilityTitle.x=this.abilityBg.x+15,this.lblAbilityTitle.y=this.abilityBg.y+8,this.contentContainer.addChild(this.lblAbilityTitle),this.buffInfo1.x=this.lblAbilityTitle.x,this.buffInfo1.y=this.lblAbilityTitle.y+30,this.lblBuffDesc1.x=this.lblAbilityTitle.x,this.lblBuffDesc1.y=this.buffInfo1.y+2,this.contentContainer.addChild(this.lblBuffDesc1),this.buffInfo2.x=this.lblAbilityTitle.x,this.buffInfo2.y=this.buffInfo1.y+28,this.lblBuffDesc2.x=this.lblAbilityTitle.x,this.lblBuffDesc2.y=this.buffInfo2.y+2,this.contentContainer.addChild(this.lblBuffDesc2);
+ super(),Xt(this,"abilityBg"),Xt(this,"setBg"),Xt(this,"icon",new HJt),Xt(this,"lblName",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblMaxLevel",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblAbilityTitle",new yD("유물능력",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"buffInfo1",new ZJt),Xt(this,"buffInfo2",new ZJt),Xt(this,"lblBuffDesc1",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_DESC_FONT_OPTION_16)),Xt(this,"lblBuffDesc2",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_DESC_FONT_OPTION_16)),Xt(this,"lblSetTitle",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"setContainer",new He),Xt(this,"tierLabels",[]),Xt(this,"skillLabels",[]),Xt(this,"setIcons",[]),Xt(this,"lblFooter",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblHonorCoin",new yD("",IL.DEFAULT_COLOR,IL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnAction",new fF("UI_GEM","","",.8,160,60)),Xt(this,"btnLimitBreak",new fF("PVP_COIN_ON","","",.7,180,60)),Xt(this,"btn10LimitBreak",new fF("PVP_COIN_ON","","+10",.7,180,60)),Xt(this,"btn100LimitBreak",new fF("PVP_COIN_ON","","+100",.7,180,60)),Xt(this,"btnMaxLimitBreak",new fF("PVP_COIN_ON","","MAX",.7,180,60)),Xt(this,"multiLimitBreakContainer",new He),Xt(this,"btnResetLimitBreak",new fF("UI_GEM_ICON","","",.7,180,60)),Xt(this,"contentContainer",new He),Xt(this,"vo"),Xt(this,"mode","unequip"),Xt(this,"limitBreakTimer",null),Xt(this,"limitBreakStartValue",-1),Xt(this,"limitBreakStartHonorCoin",-1),Xt(this,"limitBreakSyncPromise",null),Xt(this,"hideHandler",null),Xt(this,"requestPending",!1),Xt(this,"bookVo"),this.bg.height<850&&(this.bg.height=850,this.y=Xy.safeHeight-850),this.addChild(this.contentContainer),this.icon.hideFrame(),this.icon.x=11,this.icon.y=50,this.contentContainer.addChild(this.icon),this.lblName.x=this.icon.x+this.icon.width+20,this.lblName.y=this.icon.y+5,this.contentContainer.addChild(this.lblName),this.lblMaxLevel.x=this.lblName.x,this.lblMaxLevel.y=this.lblName.y+this.lblName.height+8,this.contentContainer.addChild(this.lblMaxLevel),this.abilityBg=new nU,this.abilityBg.setIndex(2),this.abilityBg.width=620,this.abilityBg.height=130,this.abilityBg.x=11,this.abilityBg.y=this.icon.y+this.icon.height+15,this.contentContainer.addChild(this.abilityBg),this.lblAbilityTitle.text=sB.getText("GAME_146","유물능력"),this.lblAbilityTitle.x=this.abilityBg.x+15,this.lblAbilityTitle.y=this.abilityBg.y+8,this.contentContainer.addChild(this.lblAbilityTitle),this.buffInfo1.x=this.lblAbilityTitle.x,this.buffInfo1.y=this.lblAbilityTitle.y+30,this.lblBuffDesc1.x=this.lblAbilityTitle.x,this.lblBuffDesc1.y=this.buffInfo1.y+2,this.contentContainer.addChild(this.lblBuffDesc1),this.buffInfo2.x=this.lblAbilityTitle.x,this.buffInfo2.y=this.buffInfo1.y+28,this.lblBuffDesc2.x=this.lblAbilityTitle.x,this.lblBuffDesc2.y=this.buffInfo2.y+2,this.contentContainer.addChild(this.lblBuffDesc2);
- (this.limitBreakTimer||-1!==this.limitBreakStartValue)&&this.syncLimitBreakToServer(),super.hide(),this.hideHandler&&(this.hideHandler(),this.hideHandler=null)}
+ this.hasPendingLimitBreak()&&this.syncLimitBreakToServer(),super.hide(),this.hideHandler&&(this.hideHandler(),this.hideHandler=null)}
- (this.limitBreakTimer||-1!==this.limitBreakStartValue)&&await this.syncLimitBreakToServer(),"unequip"===this.mode?this.onUnequip():"equip"===this.mode&&this.onEquip()}
+ this.hasPendingLimitBreak()&&await this.syncLimitBreakToServer(),"unequip"===this.mode?this.onUnequip():"equip"===this.mode&&this.onEquip()}
+ if(this.limitBreakSyncPromise)return void pH.getInstance().showMessage(sB.getText("GAME_LOADING","잠시 후 다시 시도해주세요."));
- async syncLimitBreakToServer(){
- if(this.limitBreakTimer&&(clearTimeout(this.limitBreakTimer),this.limitBreakTimer=null),-1===this.limitBreakStartValue||!this.vo)return this.resetLimitBreak(),!0;
+ syncLimitBreakToServer(){
+ if(this.limitBreakSyncPromise)return this.limitBreakSyncPromise;
+ if(this.limitBreakTimer&&(clearTimeout(this.limitBreakTimer),this.limitBreakTimer=null),-1===this.limitBreakStartValue||!this.vo)return this.resetLimitBreak(),Promise.resolve(!0);
- if(t<=0)return this.resetLimitBreak(),!0;
- const i=this.vo.kindNum,s=this.limitBreakStartValue,e=this.limitBreakStartHonorCoin,n=await SL.getInstance().treasure.limitBreak(i,t);
- return!1===n.success?(this.vo&&this.vo.kindNum===i&&(this.vo.limitBreak=s),qD.honorCoin=e,IH.getInstance().updateAll(),this.vo&&(this.updateTreasureInfo(this.vo),this.updateActionButton(),this.updateLayout()),N8t.getInstance().setData(),AQt.getInstance().setData(),this.resetLimitBreak(),KG.getInstance().showError(n),!1):(qD.setUserInfo(n.body),JR.getInstance().setData(n.body.treasure,n.body.dungeon),IH.getInstance().updateAll(),N8t.getInstance().setData(),AQt.getInstance().setData(),this.vo&&(this.updateTreasureInfo(this.vo),this.updateActionButton(),this.updateLayout()),this.resetLimitBreak(),!0)}
+ if(t<=0)return this.resetLimitBreak(),Promise.resolve(!0);
+ const i=this.vo.kindNum,s=this.limitBreakStartValue,e=this.limitBreakStartHonorCoin;
+ return this.resetLimitBreak(),this.limitBreakSyncPromise=this.requestLimitBreak(i,t,s,e).finally(()=>{
+ this.limitBreakSyncPromise=null}
+ ),this.limitBreakSyncPromise}
+ hasPendingLimitBreak(){
+ return null!==this.limitBreakTimer||-1!==this.limitBreakStartValue||null!==this.limitBreakSyncPromise}
+ async requestLimitBreak(t,i,s,e){
+ let n;
+ try{
+ n=await SL.getInstance().treasure.limitBreak(t,i)}
+ catch(Qnt){
+ n={
+ success:!1,error:"NETWORK_ERROR",errorMessage:sB.getText("COMMON_77","네트워크 오류가 발생하였습니다.")}
+ }
+ return!1===n.success?(await this.recoverLimitBreakFromServer(t,s,e),KG.getInstance().showError(n),!1):(qD.setUserInfo(n.body),JR.getInstance().setData(n.body.treasure,n.body.dungeon),this.refreshAfterLimitBreak(),!0)}
+ async recoverLimitBreakFromServer(t,i,s){
+ let e=null;
+ try{
+ e=await SL.getInstance().treasure.getMyTreasureList()}
+ catch(Qnt){
+ e=null}
+ e&&!1!==e.success&&e.body?(qD.setUserInfo(e.body),JR.getInstance().setData(e.body.treasure,e.body.dungeon)):(this.vo&&this.vo.kindNum===t&&(this.vo.limitBreak=i),qD.honorCoin=s),this.refreshAfterLimitBreak()}
+ refreshAfterLimitBreak(){
+ IH.getInstance().updateAll(),N8t.getInstance().setData(),AQt.getInstance().setData(),this.vo&&(this.updateTreasureInfo(this.vo),this.updateActionButton(),this.updateLayout())}
- (this.limitBreakTimer||-1!==this.limitBreakStartValue)&&await this.syncLimitBreakToServer();
+ this.hasPendingLimitBreak()&&await this.syncLimitBreakToServer();
TimeShiftManager 3 hunks, 5 statements
+ static isWithinMaxWave(t){
+ return Number.isFinite(t)&&t>0&&t<=qD.maxWave}
- return this.isUnlocked&&this._autoEnabled&&this.hasStack&&this.isNightWave(t)&&!this.isNightWave(t+1)}
+ return this.isUnlocked&&this._autoEnabled&&this.hasStack&&this.isNightWave(t)&&!this.isNightWave(t+1)&&this.isWithinMaxWave(this.nightStartOf(t+1))}
- return this.consume()?this.nightStartOf(t+1):t+1}
+ const i=this.nightStartOf(t+1);
+ return this.isWithinMaxWave(i)&&this.consume()?i:t+1}
LanguageManager 1 hunks, 2 statements
+ case"INSUFFICIENT_HONOR_COIN":case"LACK_OF_HONOR_COIN":s=t.getText("GAME_194","명예코인이 부족합니다.");
+ break;
VersionManager 1 hunks, 1 statements
- qt(Jy,"VersionManager"),Xt(Jy,"gameId","ef2"),Xt(Jy,"appVersion","1.14.86");
+ qt(Jy,"VersionManager"),Xt(Jy,"gameId","ef2"),Xt(Jy,"appVersion","1.14.88");
TimeShiftGaugeIcon 1 hunks, 1 statements
- "blocked"!==t&&("ok"===t?(R1t.consume(),pH.getInstance().showMessage(sB.getText("GAME_1570","황혼의 부름으로 밤이 되었습니다."))):"lastDay"===t?pH.getInstance().showMessage(sB.getText("GAME_1572","곧 밤이 됩니다.")):pH.getInstance().showMessage(sB.getText("GAME_1571","밤에는 황혼의 부름을 사용할 수 없습니다.")))}
+ "blocked"!==t&&("maxWave"!==t?"ok"===t?(R1t.consume(),pH.getInstance().showMessage(sB.getText("GAME_1570","황혼의 부름으로 밤이 되었습니다."))):"lastDay"===t?pH.getInstance().showMessage(sB.getText("GAME_1572","곧 밤이 됩니다.")):pH.getInstance().showMessage(sB.getText("GAME_1571","밤에는 황혼의 부름을 사용할 수 없습니다.")):pH.getInstance().showMessage(sB.getText("GAME_1850","황혼의 부름은 기존 최고층 이내에서만 사용할 수 있습니다.")))}
BattleController 1 hunks, 1 statements
- return WU.getInstance().getScenarioForWave(this.currentScenarioId,i)?(qD.wave=i,this.currentWave=i,Yci.getInstance().updateDay(qD.wave),this.startNewWave(),"ok"):"blocked"}
+ return R1t.isWithinMaxWave(i)?WU.getInstance().getScenarioForWave(this.currentScenarioId,i)?(qD.wave=i,this.currentWave=i,Yci.getInstance().updateDay(qD.wave),this.startNewWave(),"ok"):"blocked":"maxWave"}