slot0 = class("ClassLayer", import("..base.BaseUI")) slot0.HasEnteredClass = nil function slot0.setPlayer(slot0, slot1) slot0.playerVO = slot1 end function slot0.setResClass(slot0, slot1) slot0.resClass = slot1 end function slot0.setCourse(slot0, slot1) slot0.course = slot1 slot2 = getProxy(BayProxy) slot0.studentVOs = _.map(slot1.students, function (slot0) return uv0:getShipById(slot0) end) end function slot0.getUIName(slot0) return "ClassUI" end function slot0.init(slot0) slot0.top = slot0:findTF("blur_panel/adapt/top") slot0.btnBack = slot0:findTF("back", slot0.top) slot0.desks = _.map({ 1, 2, 3, 4, 5 }, function (slot0) return uv0:findTF("scene/desk" .. slot0) end) slot0.teacher = slot0:findTF("scene/teacher") slot0.btnHelp = slot0:findTF("btn_help", slot0.top) slot0.btnUpgrade = slot0:findTF("scene/bg_room/btn_upgrade") slot0.btnStart = slot0:findTF("scene/bg_room/btn_start") slot0.btnClass = slot0:findTF("scene/bg_room/btn_class") slot0.textNums = slot0:findTF("scene/bg_room/btn_class/Text") slot0.barProficiency = slot0:findTF("scene/bg_room/stock_bg/bar_exp/bar") slot0.barCurProficiency = slot0:findTF("scene/bg_room/stock_bg/bar_exp/current") slot0.textProficiency = slot0:findTF("scene/bg_room/stock_bg/bar_exp/Text") slot0.textStaticSpeed = slot0:findTF("scene/bg_room/stock_bg/speed2") slot0.textSpeed = slot0:findTF("scene/bg_room/stock_bg/speed") slot0.textClassOn = slot0:findTF("scene/bg_room/stock_bg/class_on") slot0.textClassOff = slot0:findTF("scene/bg_room/stock_bg/class_off") slot0.textDuration = slot0:findTF("scene/bg_room/stock_bg/duration") slot0.tipProficiency = slot0:findTF("proficiency", slot0.top) slot0.percentProficiency = slot0:findTF("Text", slot0.tipProficiency) slot0.chatProficiency = slot0:findTF("chat", slot0.tipProficiency) slot0.resourcePanel = slot0:findTF("resource_panel") setActive(slot0.teacher, false) setActive(slot0.resourcePanel, false) setActive(slot0.textDuration, false) end function slot0.didEnter(slot0) onButton(slot0, slot0.btnBack, function () if not uv0.course:inClass() and #uv0.course.students > 0 then pg.MsgboxMgr.GetInstance():ShowMsgBox({ content = i18n("course_exit_confirm"), onYes = function () uv0:emit(ClassMediator.CLASS_CLEAR_STUDENT) uv0:emit(uv1.ON_BACK) end }) else uv0:emit(uv1.ON_BACK) end end, SFX_CANCEL) onButton(slot0, slot0.btnHelp, function () pg.MsgboxMgr.GetInstance():ShowMsgBox({ type = MSGBOX_TYPE_HELP, helps = i18n("course_class_help") }) end, SFX_PANEL) onButton(slot0, slot0.btnUpgrade, function () uv0:updateResourcePanel() setActive(uv0.resourcePanel, true) pg.UIMgr.GetInstance():BlurPanel(uv0.resourcePanel) end, SFX_PANEL) onButton(slot0, slot0.btnClass, function () uv0:emit(ClassMediator.OPEN_DOCK) end, SFX_PANEL) onButton(slot0, slot0.btnStart, function () if uv0.course:inClass() then pg.MsgboxMgr.GetInstance():ShowMsgBox({ content = i18n("course_stop_confirm"), onYes = function () uv0:emit(ClassMediator.CLASS_STOP_COURSE) end }) elseif #slot0.students == 0 then pg.TipsMgr.GetInstance():ShowTips(i18n("course_class_not_ready")) elseif slot0.proficiency == 0 then pg.TipsMgr.GetInstance():ShowTips(i18n("course_proficiency_not_enough")) else slot1 = getProxy(BayProxy) if _.any(slot0.students, function (slot0) return uv0:getShipById(slot0) and slot1:getMaxLevel() <= slot1.level end) then pg.TipsMgr.GetInstance():ShowTips(i18n("course_student_max_level")) return end uv0:emit(ClassMediator.CLASS_START_COURSE, slot0.students) end end, SFX_PANEL) onButton(slot0, slot0.tipProficiency, function () setText(uv0.chatProficiency:Find("Text"), i18n("course_proficiency_tip", pg.gameset.level_get_proficency.key_value, uv0.resClass:getConfig("proficency_get_percent") * uv0.course:getExtraRate())) setActive(uv0.chatProficiency, true) setButtonEnabled(uv0.tipProficiency, false) LeanTween.scale(rtf(uv0.chatProficiency), Vector3(1.5, 1.5, 1), 0.3):setFrom(Vector3.zero):setOnComplete(System.Action(function () LeanTween.scale(rtf(uv0.chatProficiency), Vector3(0, 0, 0), 0.2):setDelay(2):setOnComplete(System.Action(function () if not IsNil(uv0.tipProficiency) then setButtonEnabled(uv0.tipProficiency, true) setActive(uv0.chatProficiency, false) end end)) end)) end, SFX_PANEL) slot0:updateMainView() slot0:updateResourceTimer() if slot0.course:getDay() == 7 then pg.TipsMgr.GetInstance():ShowTips(i18n("course_sunday_tip")) end if uv0.HasEnteredClass == nil then uv0.HasEnteredClass = PlayerPrefs.GetInt("has_entered_class") or 0 end if uv0.HasEnteredClass ~= 1 then uv0.HasEnteredClass = 1 PlayerPrefs.SetInt(slot1, 1) PlayerPrefs.Save() triggerButton(slot0.btnHelp) end end function slot0.uiStartAnimating(slot0) setAnchoredPosition(slot0.top, { y = 84 }) shiftPanel(slot0.top, nil, 0, 0.3, 0, true, true) slot0.tweens = topAnimation(slot0:findTF("bg/left", slot0.top), slot0:findTF("bg/right", slot0.top), slot0:findTF("bg/class", slot0.top), slot0:findTF("bg/title_class", slot0.top), 0.25, function () uv0.tweens = nil end) end function slot0.uiExitAnimating(slot0) shiftPanel(slot0.top, nil, 84, 0.3, 0, true, true) end function slot0.onBackPressed(slot0) pg.CriMgr.GetInstance():PlaySoundEffect_V3(SFX_CANCEL) if isActive(slot0.resourcePanel) then triggerButton(slot0.resourcePanel:Find("frame/btnBack")) else triggerButton(slot0.btnBack) end end function slot0.updateMainView(slot0) if slot0.course:getExtraRate() > 1 then setText(slot0.percentProficiency, "" .. slot0.resClass:getConfig("proficency_get_percent") * slot2 .. "%") else setText(slot0.percentProficiency, slot0.resClass:getConfig("proficency_get_percent") .. "%") end setText(slot0.textSpeed, string.format("-%s/h", 60 * slot0.resClass:getConfig("proficency_cost_per_min"))) setActive(slot0.textClassOn, slot1:inClass()) setActive(slot0.textClassOff, not slot1:inClass()) setActive(slot0.textDuration, slot1:inClass()) setActive(slot0.textSpeed, slot1:inClass()) setActive(slot0.textStaticSpeed, slot1:inClass()) if slot1:inClass() then slot0:updateEffect() if not slot0.effectTimer then slot0.effectTimer = Timer.New(function () uv0:updateEffect() end, 1, -1) slot0.effectTimer:Start() end else if slot0.effectTimer then slot0.effectTimer:Stop() slot0.effectTimer = nil end setText(slot0.textProficiency, slot1.proficiency .. "/" .. slot0.resClass:getConfig("store")) slot0.barProficiency:GetComponent(typeof(Image)).fillAmount = slot1.proficiency / slot0.resClass:getConfig("store") slot0.barCurProficiency:GetComponent(typeof(Image)).fillAmount = slot1.proficiency / slot0.resClass:getConfig("store") end if not slot1:existCourse() then setActive(slot0.teacher, false) _.each(slot0.desks, function (slot0) setActive(slot0, false) end) setActive(slot0.btnStart, false) setActive(slot0.btnClass, false) return end slot3 = 0 slot4 = {} if slot1:inClass() then slot3, slot4 = AcademyCourse.GetProficiencyAchieved(slot0.resClass:getConfigTable(), slot1.proficiency, math.min(pg.TimeMgr.GetInstance():GetServerTime() - slot1.timestamp, AcademyCourse.MaxStudyTime), slot0.studentVOs) end setActive(slot0.btnStart:Find("start"), not slot1:inClass()) setActive(slot0.btnStart:Find("end"), slot1:inClass()) setGray(slot0.btnStart, slot1:inClass()) setActive(slot0.btnClass, true) setText(slot0.btnClass:Find("Text"), #slot1.students .. "/" .. AcademyCourse.MaxStudentSlot) slot5 = slot1:getConfig("id") setActive(slot0.teacher, true) slot0:updateShipModel(slot0.teacher:Find("ship"), Ship.New({ id = slot5, configId = slot5 }):getPrefab(), function (slot0) slot0.transform.localScale = Vector3(1, 1, 1) slot0:GetComponent("SpineAnimUI"):SetAction("stand2", 0) end) GetImageSpriteFromAtlasAsync(slot1:getConfig("icon"), "", slot0.teacher:Find("pop/icon")) function slot11() pg.MsgboxMgr.GetInstance():ShowMsgBox({ hideNo = true, content = uv0:getConfig("name") }) end slot12 = SFX_PANEL onButton(slot0, slot0.teacher:Find("pop"), slot11, slot12) for slot11, slot12 in ipairs(slot0.desks) do slot14 = slot12:Find("ship") function slot17() uv0:emit(ClassMediator.OPEN_DOCK) end removeOnButton(slot14) removeOnButton(slot12:Find("icon")) setActive(slot14, slot0.studentVOs[slot11]) setActive(slot12:Find("add"), false) if not slot1:inClass() then setActive(slot15, not slot16 and slot11 == #slot0.studentVOs + 1) onButton(slot0, slot13, slot17, SFX_PANEL) onButton(slot0, slot14, slot17, SFX_PANEL) onButton(slot0, slot15, slot17, SFX_PANEL) end slot0:updateShipModel(slot14, slot16 and slot16:getPrefab(), function (slot0) slot0.transform.localScale = Vector3(-0.8, 0.8, 1) slot0:GetComponent("SpineAnimUI"):SetAction("sit", 0) end) end end function slot0.updateShipModel(slot0, slot1, slot2, slot3) slot4 = slot1.childCount > 0 and slot1:GetChild(0).gameObject if (slot4 and slot4.name) ~= slot2 then if slot4 then PoolMgr.GetInstance():ReturnSpineChar(slot4.name, slot4) end if slot2 then PoolMgr.GetInstance():GetSpineChar(slot2, true, function (slot0) if uv0.exited then PoolMgr.GetInstance():ReturnSpineChar(uv1, slot0) end setActive(slot0, true) slot0.name = uv1 slot0.transform:SetParent(uv2, false) slot0.transform.localPosition = Vector3.zero if uv3 then uv3(slot0) end end) end end end function slot0.updateEffect(slot0) slot2 = 0 slot3 = {} if slot0.course:inClass() then slot2, slot3 = AcademyCourse.GetProficiencyAchieved(slot0.resClass:getConfigTable(), slot1.proficiency, math.min(pg.TimeMgr.GetInstance():GetServerTime() - slot1.timestamp, AcademyCourse.MaxStudyTime), slot0.studentVOs) end slot5 = pg.TimeMgr.GetInstance():GetServerTime() - slot1.timestamp setText(slot0.textDuration, pg.TimeMgr.GetInstance():DescCDTime(math.min(slot5, AcademyCourse.MaxStudyTime))) setText(slot0.textProficiency, slot1.proficiency .. "(-" .. slot2 .. ")/" .. slot0.resClass:getConfig("store")) slot0.barProficiency:GetComponent(typeof(Image)).fillAmount = slot1.proficiency / slot0.resClass:getConfig("store") slot0.barCurProficiency:GetComponent(typeof(Image)).fillAmount = math.max(slot1.proficiency - slot2, 0) / slot0.resClass:getConfig("store") if slot5 < AcademyCourse.MaxStudyTime and slot5 > 0 and slot5 % 60 == 0 then slot6 = {} if slot2 < slot1.proficiency then for slot10, slot11 in ipairs(slot0.studentVOs) do slot11:addExp(slot3[slot10]) if slot11.level < slot11:getMaxLevel() then slot12 = slot0.desks[slot10]:Find("exp") setActive(slot12, true) table.insert(slot6, slot12) end end end if #slot6 > 0 then slot7 = Vector2(4, 95) slot8 = Vector2(4, 180) LeanTween.value(slot0._go, 0, 1, 1):setOnUpdate(System.Action_float(function (slot0) slot1 = Vector2.Lerp(uv0, uv1, slot0) _.each(uv2, function (slot0) slot0.anchoredPosition = uv0 setImageAlpha(slot0, 1 - uv1) end) end)):setOnComplete(System.Action(function () _.each(uv0, function (slot0) setActive(slot0, false) end) end)) end end if math.random(0, 20) <= 1 and slot0.desks[math.floor(math.random(1, 6))] and isActive(slot7:Find("ship")) and not isActive(slot7:Find("chat")) then slot0:showShipFace(slot7:Find("chat")) end end function slot0.showShipFace(slot0, slot1) setActive(slot1, true) LeanTween.alpha(go(slot1), 1, 0.3):setFrom(0) LeanTween.scale(go(slot1), Vector3(1, 1, 1), 0.3):setFrom(Vector3.zero) LeanTween.alpha(go(slot1), 0, 0.3):setDelay(3) LeanTween.scale(go(slot1), Vector3.zero, 0.3):setDelay(3):setOnComplete(System.Action(function () setActive(uv0, false) end)) end function slot0.updateResourcePanel(slot0) slot0:onCloseRsourcePanel() slot1 = slot0.resourcePanel:Find("frame/content/info/store/prev") setImageAlpha(slot1, 1) blinkAni(go(slot1), 0.8) slot2 = slot0.resourcePanel:Find("frame/content/info/rate/prev") setImageAlpha(slot2, 1) blinkAni(go(slot2), 0.8) slot3 = slot0.resourcePanel:Find("frame/content/info/exp/prev") setImageAlpha(slot3, 1) blinkAni(go(slot3), 0.8) slot4 = slot0.resClass slot5 = slot4:bindConfigTable() slot6 = slot0.resourcePanel:Find("frame/content/upgrade_btn") slot16 = slot0.resourcePanel:Find("frame/btnBack") slot17 = slot0.resourcePanel:Find("mengban") setText(slot0.resourcePanel:Find("frame/title/icon/current"), "Lv." .. slot4:GetLevel()) slot18 = slot4:GetLevel() slot19 = slot5.all[#slot5.all] slot20 = slot5[slot18] slot21 = slot5[slot19] if slot18 == slot19 then setActive(slot6:Find("Image"), true) setActive(slot0.resourcePanel:Find("frame/content/upgrading_block"), false) setButtonEnabled(slot6, false) setText(slot6:Find("cost"), "-") setText(slot0.resourcePanel:Find("frame/upgrade_duration/Text"), "-") setText(slot0.resourcePanel:Find("frame/content/info/level/curr"), "Lv.Max") setText(slot0.resourcePanel:Find("frame/content/info/level/next"), "-") slot0:setBar(slot0.resourcePanel:Find("frame/content/info/store"), slot20.store, 0, slot21.store) slot0:setBar(slot0.resourcePanel:Find("frame/content/info/rate"), slot20.proficency_get_percent, 0, slot21.proficency_get_percent, "%") slot0:setBar(slot0.resourcePanel:Find("frame/content/info/exp"), slot20.proficency_cost_per_min * 60, 0, slot21.proficency_cost_per_min * 60, "/h") else slot22 = slot5[slot18 + 1] slot0:setBar(slot11, slot20.store, slot22.store - slot20.store, slot21.store) slot0:setBar(slot12, slot20.proficency_get_percent, slot22.proficency_get_percent - slot20.proficency_get_percent, slot21.proficency_get_percent, "%") slot0:setBar(slot13, slot20.proficency_cost_per_min * 60, (slot22.proficency_cost_per_min - slot20.proficency_cost_per_min) * 60, slot21.proficency_cost_per_min * 60, "/h") setText(slot9, slot20.use[2] <= slot0.playerVO.gold and slot20.use[2] or "" .. slot20.use[2] .. "") setText(slot14, "Lv." .. slot18) setText(slot15, "Lv." .. slot18 + 1) if slot4:GetUpgradeTimeStamp() == 0 then setActive(slot7, false) setText(slot10, pg.TimeMgr.GetInstance():DescCDTime(slot20.time)) setButtonEnabled(slot6, true) setActive(slot8, true) onButton(slot0, slot6, function () uv0:emit(ClassMediator.CLASS_UPGRADE, uv1) end, SFX_UI_ACADEMY_LVLUP) else setActive(slot8, false) setActive(slot7, true) setButtonEnabled(slot6, false) slot0.resTickTimer = pg.TimeMgr.GetInstance():AddTimer("tick_timer", 0, 1, function () if uv0:GetDuration() and slot0 > 0 then setText(uv1, pg.TimeMgr.GetInstance():DescCDTime(slot0)) end end) end end function slot22() uv0:onCloseRsourcePanel() setActive(uv0.resourcePanel, false) pg.UIMgr.GetInstance():UnblurPanel(uv0.resourcePanel, uv0._tf) end onButton(slot0, slot17, slot22, SFX_CANCEL) onButton(slot0, slot16, slot22, SFX_CANCEL) end function slot0.setBar(slot0, slot1, slot2, slot3, slot4, slot5) slot5 = slot5 or "" slot0:setSliderValue(slot1:Find("prev"), (slot2 + slot3) / slot4) slot0:setSliderValue(slot1:Find("curr"), slot2 / slot4) setText(slot1:Find("current"), slot2 .. slot5 .. "/" .. slot4 .. slot5) if slot3 <= 0 then setActive(slot1:Find("advance"), false) else setActive(slot8, true) setText(slot8, "[+" .. slot3 .. slot5 .. "]") end end function slot0.setSliderValue(slot0, slot1, slot2) setFillAmount(slot1, slot2 == 0 and slot2 or math.max(slot2, 0.08)) end function slot0.onCloseRsourcePanel(slot0) LeanTween.cancel(go(slot0.resourcePanel:Find("frame/content/info/store/prev"))) LeanTween.cancel(go(slot0.resourcePanel:Find("frame/content/info/rate/prev"))) LeanTween.cancel(go(slot0.resourcePanel:Find("frame/content/info/exp/prev"))) if slot0.resTickTimer then pg.TimeMgr.GetInstance():RemoveTimer(slot0.resTickTimer) slot0.resTickTimer = nil end end function slot0.updateResourceTimer(slot0) if slot0.resTimer then pg.TimeMgr.GetInstance():RemoveTimer(slot0.resTimer) slot0.resTimer = nil end if slot0.resClass:GetUpgradeTimeStamp() > 0 then slot0.resTimer = pg.TimeMgr.GetInstance():AddTimer("timer", 0, 1, function () if not uv0.resClass:GetDuration() or slot0 <= 0 then uv0:emit(ClassMediator.CLASS_UPGRADE_TIMES_UP) end end) end end function slot0.willExit(slot0) LeanTween.cancel(slot0._go) if slot0.tweens then cancelTweens(slot0.tweens) end if isActive(slot0.resourcePanel) then slot0:onCloseRsourcePanel() setActive(slot0.resourcePanel, false) pg.UIMgr.GetInstance():UnblurPanel(slot0.resourcePanel, slot0._tf) end slot0:updateShipModel(slot0.teacher:Find("ship"), nil) _.each(slot0.desks, function (slot0) uv0:updateShipModel(slot0:Find("ship"), nil) LeanTween.cancel(go(slot0:Find("chat"))) end) if slot0.resTimer then pg.TimeMgr.GetInstance():RemoveTimer(slot0.resTimer) slot0.resTimer = nil end if slot0.effectTimer then slot0.effectTimer:Stop() slot0.effectTimer = nil end end return slot0