消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1036 lines
40 KiB

1 week ago
//*********************
// create by 流云
// time: Sat Mar 14 2026
// desc:
//*********************
import { _decorator, Component, Node, find, sp, Label, instantiate, tween, Tween, v3, Prefab, assetManager, Asset, AssetManager } from 'cc';
import { Auto_PanelHome } from './Auto_PanelHome';
import { GBundle, getBattleResPakage, getZombieResPakage, GPath, UIID } from '../../game/ConfigRes';
import { HomeBattlePreload } from '../../game/HomeBattlePreload';
import { BattleType, ChapterDifficulty } from '../../manager/ChapterDataManager';
import { GEvent } from 'db://assets/mx/module/event/GEvent';
import { NewFunType } from '../../newFun/NewFun';
import { GuideType } from '../../storyManager/storyManager';
import { sdkConfig } from '../../sdk/sdkConfig';
import { WeaponType } from '../../manager/WeaponDataManager';
import { StatisticsType } from '../../game/GameData';
import { ItemGrid } from '../../com/ItemGrid';
import { SpriteLoad } from 'db://assets/mx/components/SpriteLoad';
import { UIManager } from 'db://assets/mx/module/ui/UIManager';
const { ccclass, property } = _decorator;
@ccclass('UIPanelHome')
export class UIPanelHome extends Auto_PanelHome {
/**切难度防重入,避免事件链反复触发时出现循环调用 */
private _switchingDiff: boolean = false;
/** 第4章后「去丧尸工厂」引导进行中:暂缓新功能弹窗,待引导结束再续播 */
private _pauseOverlayUntilGuideEnd: boolean = false;
/** 选关页随机角色动画:防快速切章节时旧 schedule 打到已销毁节点 */
private _randomRolePlaySerial = 0;
/**
* homeGuideIndex MainUI /
* - 1~13
* - 6/7/
* - >=14
*/
private static readonly HOME_GUIDE_BLOCKING_RANGE: readonly [number, number] = [1, 13];
private static readonly HOME_GUIDE_NON_BLOCKING_INDEX = new Set<number>([6, 7]);
private static readonly HOME_GUIDE_NON_BLOCKING_FROM = 14;
// setBattlePerfProfile('ios') // 切到苹果档
// setBattlePerfProfile('android') // 切到安卓档
// setBattlePerfProfile('auto') // 恢复默认(安卓)
/** 主页拆出的动态子预制是否已挂到 ui_center */
private _dynamicHomeUiReady = false;
getResPkg() {
return {
name: "主页动态UI",
// 主页常驻,勿随分包释放导致子预制引用失效
isReleaseable: false,
ress: [
// ui_task:沿用 comm2/taskTargetNode,挂载后改名为 ui_task
{ name: 'taskTargetNode', bundle: GBundle.Comm2, path: GPath.Prefab, type: Prefab },
{ name: 'ui_btns', bundle: GBundle.Home, path: GPath.Prefab, type: Prefab },
{ name: 'ui_leftBtns', bundle: GBundle.Home, path: GPath.Prefab, type: Prefab },
{ name: 'ui_RightBtns', bundle: GBundle.Home, path: GPath.Prefab, type: Prefab },
{ name: 'ui_topBtns', bundle: GBundle.Home, path: GPath.Prefab, type: Prefab },
]
};
}
onLoad(): void {
super.onLoad();
if(gg.data.getStatistics(StatisticsType.LiulianGuideIndex) != 0 && gg.data.getStatistics(StatisticsType.LiulianGuideIndex) != 7){
console.log("榴莲引导索引异常", gg.data.getStatistics(StatisticsType.LiulianGuideIndex))
gg.data.setStatistics(StatisticsType.LiulianGuideIndex, 7)
}
}
onEnable(): void {
super.onEnable();
this.ui_title.on(Node.EventType.TOUCH_END, this.click_ui_title, this);
this.ui_rewardLayer.on(Node.EventType.TOUCH_END, this.click_ui_rewardLayer, this);
GEvent.Ins.on(GEvent.SelectChapter, this.onChapterOrDiffChange, this);
GEvent.Ins.on(GEvent.SelectDifficult, this.onDiffChange, this);
GEvent.Ins.on(GEvent.StoryDialogEnd, this.StoryDialogEnd, this);
GEvent.Ins.on(GEvent.checkJuQing, this.checkJuQing, this);
GEvent.Ins.on(GEvent.homeGuideIndexEventEnd, this.guideEnd, this);
GEvent.Ins.on(GEvent.LiulianGuideIndexEvent, this.showLiulianGuideEnd, this);
GEvent.Ins.on(GEvent.jumpLayerOpenBox, this.updateBoxUI, this);
}
onDisable(): void {
super.onDisable();
this.ui_title.off(Node.EventType.TOUCH_END, this.click_ui_title, this);
this.ui_rewardLayer.off(Node.EventType.TOUCH_END, this.click_ui_rewardLayer, this);
GEvent.Ins.off(GEvent.SelectChapter, this.onChapterOrDiffChange, this);
GEvent.Ins.off(GEvent.SelectDifficult, this.onDiffChange, this);
GEvent.Ins.off(GEvent.StoryDialogEnd, this.StoryDialogEnd, this);
GEvent.Ins.off(GEvent.checkJuQing, this.checkJuQing, this);
GEvent.Ins.off(GEvent.homeGuideIndexEventEnd, this.guideEnd, this);
GEvent.Ins.off(GEvent.LiulianGuideIndexEvent, this.showLiulianGuideEnd, this);
GEvent.Ins.off(GEvent.jumpLayerOpenBox, this.updateBoxUI, this);
this._randomRolePlaySerial++;
}
/** 供 UIMainUI 在武器链跳过「点角色」时拉队列(避免依赖 PanelHome.onEnable 监听,切 Tab 时 onDisable 会丢事件) */
scheduleHomeOverlayFromGuide(): void {
this.scheduleHomeOverlaySequence();
}
/** 最大章节ID */
private _maxChapterId: number = 0;
/** 当前章节ID */
private _curentChapterId: number = 0;
/** 当前难度 */
private _curentDiffId: number = 2;
/** 当前章节配置 */
private _curentConfig: ITableChapter = null;
/**当前章节是否可挑战 */
private _curentSelectChapterIsUnlock: boolean = true;
/** 当前章节宝箱配置的进度百分比数组 */
private _chapterProgressArr: number[] = [];
/**当前章节推荐战力 */
private _curentRecommendPower: number = 0;
/**当前章节是否已通关 */
private _curentChapterIsComplete: boolean = false;
/** onInit 期间先搭完动态 UI,章节项放到最后创建 */
private _deferChapterItem = false;
onInit(): void {
this.ensureDynamicHomeUI();
if (gg.data.project.syncNormalChapterProgress()) {
gg.data.saveLocal();
}
this._maxChapterId = gg.data.project.getMaxChapterId();
this._curentDiffId = gg.data.project.getCurSelectSaveChapterDifficulty();
if (!this._curentDiffId) this._curentDiffId = ChapterDifficulty.Normal;
this._curentChapterId = gg.data.project.getCurentLevelChapterId(this._curentDiffId);
if (!this._curentChapterId) this._curentChapterId = 1;
this.updateChapterData();
this._deferChapterItem = true;
this.initUI();
this._deferChapterItem = false;
// 与界面一致:主界面红点(左右章节宝箱)用 gg.game.CurentSelectChapterId,默认曾为 1,未同步会导致重启后误判为 true
gg.game.CurentSelectChapterId = this._curentChapterId;
gg.game.CurentSelectBattleType = BattleType.Level;
gg.game.CurentSelectBattleDifficulty = this._curentDiffId;
gg.dot?.updateRedDot();
gg.newFun.checkNewFunPop();
HomeBattlePreload.startNow(this._curentChapterId);
let isUnLockTask = gg.newFun.isUnLockMainPageTab(UIID.Shop)
if (this.ui_task) {
this.ui_task.active = !!isUnLockTask;
}
this.guideShow()
this.tryShowOfflineRewardIfNeeded();
// 动态 UI 全部就绪后再创建 MainChapterItem
this.setChapterItem();
// this.scheduleOnce(()=>{
// gg.sdk.PlatformFeedSubscribe();
// },1)
}
/**
* ui_center
* ui_task(taskTargetNode)ui_btnsui_leftBtnsui_RightBtnsui_topBtns
*/
private ensureDynamicHomeUI() {
if (!this.ui_center?.isValid) {
console.warn('UIPanelHome: ui_center missing, skip dynamic home UI');
return;
}
if (this._dynamicHomeUiReady && this.ui_btns?.isValid) {
return;
}
const specs: { nodeName: string; assetName: string; bundle: string }[] = [
{ nodeName: 'ui_task', assetName: 'taskTargetNode', bundle: GBundle.Comm2 },
{ nodeName: 'ui_btns', assetName: 'ui_btns', bundle: GBundle.Home },
{ nodeName: 'ui_leftBtns', assetName: 'ui_leftBtns', bundle: GBundle.Home },
{ nodeName: 'ui_RightBtns', assetName: 'ui_RightBtns', bundle: GBundle.Home },
{ nodeName: 'ui_topBtns', assetName: 'ui_topBtns', bundle: GBundle.Home },
];
for (const spec of specs) {
let node = this.ui_center.getChildByName(spec.nodeName);
if (!node) {
node = gg.res.getNode(GPath.Prefab, spec.assetName, spec.bundle);
if (!node) {
console.warn('UIPanelHome: dynamic prefab not ready', spec.bundle, spec.assetName);
continue;
}
if (node.name !== spec.nodeName) {
node.name = spec.nodeName;
}
this.setLayerMask(node, this.ui_center.layer);
this.ui_center.addChild(node);
}
node.active = true;
}
this.bindDynamicHomeNodes();
// 首次 onEnable 早于资源加载,动态按钮当时未绑定,此处补绑
this.bindDynamicHomeEvents(true);
this._dynamicHomeUiReady = true;
}
/** 更新章节数据 */
updateChapterData() {
this._curentConfig = gg.data.project.getChapterConfig(this._curentChapterId);
this._curentSelectChapterIsUnlock = gg.data.project.isChapterCanChallenge(this._curentChapterId, this._curentDiffId);
this._chapterProgressArr = gg.data.project.getChapterBoxProgress(this._curentChapterId, this._curentDiffId);
this._curentRecommendPower = gg.data.project.getRecommendPower(this._curentChapterId, this._curentDiffId);
this._curentChapterIsComplete = gg.data.project.isChapterComplete(this._curentChapterId, this._curentDiffId);
}
/** 初始化UI */
initUI() {
this.showIAPVersionUI()
this.updateUI();
}
//内购版本显示UI
showIAPVersionUI() {
if (!this.ui_RightMidBtns || !this.ui_leftMidBtns) {
return;
}
if (sdkConfig.isIAPVersion) {
//
this.ui_RightMidBtns.active = true;
this.ui_leftMidBtns.active = true
} else {
//非内购版本显示UI
this.ui_RightMidBtns.active = false;
this.ui_leftMidBtns.active = false
}
}
/** 更新UI */
updateUI() {
this.updateBtnsStatus();
this.updateDiffUI();
this.updateChapterInfo();
if (!this.btnLeft || !this.btnRight) {
return;
}
if (this._curentChapterId == this._maxChapterId){
this.btnRight.active = false;
this.btnLeft.active = true;
} else if(this._curentChapterId ==1 ){
this.btnRight.active = true;
this.btnLeft.active = false;
}else{
this.btnRight.active = true;
this.btnLeft.active = true;
}
}
/** 更新按钮状态 */
updateBtnsStatus() {
if (!this.btnStart || !this.btnBack || !this.btnLeft || !this.btnRight) {
return;
}
this.btnStart.active = this._curentSelectChapterIsUnlock;
//this.lb_status.node.active = !this.btnStart.active && !this._curentSelectChapterIsUnlock;
this.btnBack.active = !this.btnStart.active && !this._curentSelectChapterIsUnlock;
if (this._curentDiffId == ChapterDifficulty.Normal) {
//this.lb_status.string = gg.lang.get('请通关前置关卡后可挑战');
} else {
let diffStr = "普通";
if (this._curentDiffId == ChapterDifficulty.Hell) diffStr = "困难";
let diffStr2 = '困难';
if (this._curentDiffId == ChapterDifficulty.Hell) diffStr2 = "地狱";
//this.lb_status.string = gg.lang.get('通关本关{1}模式和{2}模式前置关卡后可挑战', [diffStr, diffStr2]);
}
this.btnLeft.active = this._curentChapterId > 1;
this.btnRight.active = this._curentChapterId < gg.data.doc.chapter + 2;
this.btnStart.find("bg").children.forEach(x => x.active = false);
this.btnLeft.find("bg").children.forEach(x => x.active = false);
this.btnRight.find("bg").children.forEach(x => x.active = false);
this.btnStart.find(`bg/${this._curentDiffId}`).active = true;
this.btnLeft.find(`bg/${this._curentDiffId}`).active = true;
this.btnRight.find(`bg/${this._curentDiffId}`).active = true;
}
/** 更新难度UI */
updateDiffUI() {
//ps 修改ui
}
/** 更新章节信息 */
updateChapterInfo() {
this.lb_chapter.string = gg.lang.get('第{1}章', [this._curentChapterId]);
this.lb_chapterName.string = gg.lang.get(this._curentConfig.name);
this.lb_combatPower.string = gg.lang.get('推荐战力:{1}', [this._curentRecommendPower]);
this.ui_lockStatus.active = !this._curentSelectChapterIsUnlock;
this.ui_finishStatus.active = this._curentChapterIsComplete;
gg.data.project.vigourCost = this._curentConfig.chapter_enery;
if (this.lb_tilifree && this.ui_tilitag && this.lb_needVigour) {
if(this._curentConfig.chapter_enery == 0){
this.lb_tilifree.node.active = true
this.ui_tilitag.active = false
this.lb_needVigour.node.active = false
}else{
this.lb_needVigour.node.active = true
this.ui_tilitag.active = true
this.lb_tilifree.node.active = false
this.lb_needVigour.string = 'x'+this._curentConfig.chapter_enery.toString()
}
}
if (!this._deferChapterItem) {
this.setChapterItem();
}
this.updateBoxUI();
}
async setChapterItem(){
//设置关卡预制体
this.ui_chapterNode.active = true;
this.ui_chapterNode.removeAllChildren();
let prefab = await this.loadPrefab(GBundle.Home,"prefab/"+"MainChapterItem"+this._curentChapterId) as Prefab;
if(!this.ui_chapterNode || !this.ui_chapterNode.isValid){
return
}
let chapterItem = instantiate(prefab);
if (!chapterItem) {
console.warn("UIPanelHome: MainChapterItem"+this._curentChapterId+" prefab not ready", GBundle.Home);
return;
}
if(!this.ui_chapterNode || !this.ui_chapterNode.isValid){
return
}
chapterItem.active = true;
this.setLayerMask(chapterItem, chapterItem.layer);
chapterItem.setPosition(v3(0, 0, 0));
this.ui_chapterNode.addChild(chapterItem);
// 随机播放角色动画:原生/小游戏端偶发同一帧内 find 不到子节点或 Spine 未就绪,延后一帧再播(与模拟器一致)
const itemRef = chapterItem;
const chapterId = this._curentChapterId;
//console.log('[UIPanelHome.setChapterItem] defer randomRolePlay next frame', 'chapter', chapterId, 'item', itemRef?.name);
this.scheduleOnce(() => {
if (!itemRef?.isValid || !this.ui_chapterNode?.isValid) {
//console.warn('[UIPanelHome.setChapterItem] randomRolePlay skip: item or chapterNode invalid', 'chapter', chapterId);
return;
}
//console.log('[UIPanelHome.setChapterItem] run randomRolePlay', 'chapter', chapterId);
this.randomRolePlay(itemRef);
}, 1);
}
private async loadPrefab(bundleName, assetPath) {
let bundle = assetManager.getBundle(bundleName);
if (!bundle) bundle = await this.loadBundle(bundleName);
let res = await this.loadRes(bundle, assetPath);
return res;
}
private async loadBundle(bundleName) {
return new Promise<AssetManager.Bundle>((resolve, reject) => {
assetManager.loadBundle(bundleName, (err, bundle) => {
if (err) {
console.log(`加载Bundle:${bundleName}错误`, err);
resolve(null);
} else {
resolve(bundle);
}
})
})
}
private async loadRes(bundle: AssetManager.Bundle, assetPath) {
return new Promise<Asset>((resolve, reject) => {
let b = bundle.get(assetPath, Prefab);
if (b) {
resolve(b);
} else {
bundle.load(assetPath, Prefab, (err, asset) => {
if (err) {
console.log(`加载Bundle:${bundle.name},path:${assetPath}资源错误`, err);
resolve(null);
} else {
resolve(asset);
}
})
}
})
}
randomRolePlay(node: Node){
if (!node) return;
this._randomRolePlaySerial++;
const serial = this._randomRolePlaySerial;
let rolePath:string[] = [];
let roleName:string[] = ["role", "role-001", "role-002", "role-003", "role-004", "role-005"];
for (let i = 0; i < roleName.length; i++) {
const spineRelPath = roleName[i];
if (!spineRelPath) continue;
let spineNode = find(spineRelPath, node);
if (spineNode) {
const skInit = spineNode.getComponent(sp.Skeleton);
if (!skInit) {
console.log('[UIPanelHome.randomRolePlay] no Skeleton', spineRelPath);
continue;
}
rolePath.push(spineRelPath);
skInit.setAnimation(0, '待机', true);
}
}
let count = rolePath.length;
if (count === 1) {
const onlyRelPath = rolePath[0];
if (onlyRelPath) {
let spineNode = find(onlyRelPath, node);
if (spineNode) {
const sk1 = spineNode.getComponent(sp.Skeleton);
if (sk1) sk1.setAnimation(0, "选关页待机", true);
}
}
} else if (count >= 2) {
// 对「节点相对路径」副本洗牌后直接遍历,避免 Array(n).keys() / 数字索引在部分运行环境异常导致 path 取不到
const shuffledPaths = rolePath.slice();
for (let i = shuffledPaths.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
const tmp = shuffledPaths[i];
shuffledPaths[i] = shuffledPaths[j];
shuffledPaths[j] = tmp;
}
// 每个 Spine 单独 schedule、单调递增的绝对延迟,避免原生端链式 scheduleOnce 在同一帧连发(与浏览器表现不一致、看起来「一起跳」)
let cum = 0.35 + Math.random() * 0.55;
for (let k = 0; k < shuffledPaths.length; k++) {
const spineRelPath = shuffledPaths[k];
if (!spineRelPath) continue;
const spineNode = find(spineRelPath, node);
if (!spineNode) continue;
const sk = spineNode.getComponent(sp.Skeleton);
if (!sk) continue;
sk.setAnimation(0, null, false);
const when = cum;
cum += 0.28 + Math.random() * 1;
const skRef = sk;
this.scheduleOnce(() => {
if (serial !== this._randomRolePlaySerial || !node?.isValid || !skRef?.isValid) {
return;
}
skRef.setAnimation(0, "选关页待机", true);
}, when);
}
}
}
setLayerMask(n: Node, layerMask: number) {
n.layer = layerMask;
for (let i = 0; i < n.children.length; i++) {
if (n.children[i].isValid) {
this.setLayerMask(n.children[i], layerMask);
}
}
}
/** 更新宝箱UI */
updateBoxUI() {
let curentProgress = 0;
for (let i = 0; i < 3; i++) {
let boxStatus = gg.data.project.getChapterStatus(this._curentChapterId, this._curentDiffId, i);
let btn = this.ui_boxBtns.find("btnBox" + (i + 1));
let progress = this._chapterProgressArr[i];
if (boxStatus >= 1) curentProgress = progress;
if (btn) {
btn.find("open").active = boxStatus == 2;
btn.find("dot").active = boxStatus == 1;
btn.find("lbProgres").getComponent(Label).string = progress * 100 + "%";
}
}
this.sp_progress.fillRange = curentProgress;
}
/** 选择章节 */
selectChapter(chapterId: number) {
if (this._curentChapterId == chapterId) return;
this._curentChapterId = chapterId;
gg.data.project.setCurSelectSaveChapterId(chapterId);
gg.game.CurentSelectChapterId = this._curentChapterId;
gg.game.CurentSelectBattleType = BattleType.Level;
gg.game.CurentSelectBattleDifficulty = this._curentDiffId;
this.updateChapterData();
HomeBattlePreload.startNow(this._curentChapterId);
}
/** 选择难度 */
selectDiff(diffId: ChapterDifficulty) {
if (this._switchingDiff) return;
if (this._curentDiffId == diffId) return;
this._switchingDiff = true;
try {
this._curentDiffId = diffId;
// 切难度时:若当前章节在新难度不可挑战,跳到该难度最高可挑战章节
// if (!gg.data.project.isChapterCanChallenge(this._curentChapterId, this._curentDiffId)) {
// }
this._curentChapterId = gg.data.project.getCurentLevelChapterId(this._curentDiffId);
gg.data.project.setCurSelectSaveChapterId(this._curentChapterId);
gg.data.project.setCurSelectSaveChapterDifficulty(diffId);
gg.game.CurentSelectChapterId = this._curentChapterId;
gg.game.CurentSelectBattleType = BattleType.Level;
gg.game.CurentSelectBattleDifficulty = this._curentDiffId;
this.updateChapterData();
HomeBattlePreload.startNow(this._curentChapterId);
} finally {
this._switchingDiff = false;
}
}
/** 章节或难度改变时更新UI */
onChapterOrDiffChange(chapterId: number) {
this.selectChapter(chapterId);
//this.selectDiff(diffId);
this.updateUI();
}
/** 难度改变时更新UI */
onDiffChange(diffId: ChapterDifficulty) {
this.selectDiff(diffId);
this.updateUI();
}
click_ui_title(): void {
gg.ui.openPanel(UIID.selectDifficult)
}
click_ui_rewardLayer(): void {
this.ui_rewardLayer.active = false;
}
click_btnDiff2(): void {
this.selectDiff(ChapterDifficulty.Normal);
this.updateUI();
}
click_btnDiff3(): void {
let hardConf = gg.newFun.getNewFunData(NewFunType.Difficulty, ChapterDifficulty.Hard);
let isUnLockHard = gg.newFun.isUnLockDifficult(ChapterDifficulty.Hard);
if (!isUnLockHard) {
//提示章节不足
gg.ui.showToast(gg.lang.get(hardConf.desc, [hardConf.chapter]));
return
}
this.selectDiff(ChapterDifficulty.Hard);
this.updateUI();
}
click_btnDiff4(): void {
let hellConf = gg.newFun.getNewFunData(NewFunType.Difficulty, ChapterDifficulty.Hell);
let isUnLockHell = gg.newFun.isUnLockDifficult(ChapterDifficulty.Hell);
if (!isUnLockHell) {
//提示章节不足
gg.ui.showToast(gg.lang.get(hellConf.desc, [hellConf.chapter]));
return
}
this.selectDiff(ChapterDifficulty.Hell);
this.updateUI();
}
click_btnBox1(): void {
this.clickBoxBtn(1, this.btnBox1);
}
click_btnBox2(): void {
this.clickBoxBtn(2, this.btnBox2);
}
click_btnBox3(): void {
this.clickBoxBtn(3, this.btnBox3);
}
clickBoxBtn(boxIndex: number, btn: Node) {
let rewardStr = gg.data.project.getChapterBoxRewardStr(this._curentChapterId,ChapterDifficulty.Normal ,boxIndex);
if (btn.find("dot").active) {
gg.data.project.setChapterStatus(this._curentChapterId, this._curentDiffId, boxIndex - 1, 2);
gg.game.showGetRewardByReardStr(rewardStr);
this.updateBoxUI();
} else {
let itens = gg.game.parseRewardStr(rewardStr);
this.ui_rewardLayer.active = true;
if (boxIndex == 1) this.ui_ItemReward.x = -140;
else if (boxIndex == 2) this.ui_ItemReward.x = 0;
else if (boxIndex == 3) this.ui_ItemReward.x = 140;
this.ui_ItemReward.children.forEach(x => x.active = false);
for (let i = 0; i < itens.length; i++) {
let item = itens[i];
let n: Node = null;
if (i < this.ui_ItemReward.children.length) {
n = this.ui_ItemReward.children[i];
} else {
n = instantiate(this.ui_ItemReward.children[0]);
this.ui_ItemReward.addChild(n);
}
n.active = true;
n.getComponent(ItemGrid).setData(item);
}
}
}
click_btnLeft(): void {
let id = this._curentChapterId - 1;
if (id < 1) id = 1;
if (id == this._curentChapterId){
return
}
//ps 修改ui去掉动画效果
// Tween.stopAllByTarget(this.ui_di);
// let angleOffset = this.ui_di.angle % 90;
// tween(this.ui_di)
// .by(0.2, { angle: 90 + angleOffset })
// .start();
//end
this.selectChapter(id);
this.updateUI();
}
click_btnRight(): void {
let id = this._curentChapterId + 1;
if (id > this._maxChapterId) id = this._maxChapterId;
if (id == this._curentChapterId){
return;
}
// Tween.stopAllByTarget(this.ui_di);
// let angleOffset = this.ui_di.angle % 90;
// tween(this.ui_di)
// .by(0.2, { angle: -90 - angleOffset })
// .start();
this.selectChapter(id);
this.updateUI();
}
click_btnStart(): void {
if (gg.data.getVigour() < gg.data.project.vigourCost) {
gg.ui.showToast('请补充体力!')
return
}
if(this._curentChapterId<=0){
return
}
gg.game.CurentSelectReplica = null;
gg.game.CurentSelectChapterId = this._curentChapterId;
gg.game.CurentSelectBattleType = BattleType.Level;
gg.game.CurentSelectBattleDifficulty = this._curentDiffId;
gg.game.enterBattle();
}
click_btnBack(): void {
//点击返回到当前章节
let curChapterId = gg.data.project.getCurentLevelChapterId(ChapterDifficulty.Normal);
if (curChapterId < 1) curChapterId = 1;
this.selectChapter(curChapterId);
//this.selectDiff(diffId);
this.updateUI();
}
click_btnEntrance(): void {
gg.ui.openPanel(UIID.Sidebar);
}
click_btnNotice(): void {
gg.ui.openPanel(UIID.PopNotice);
}
click_btnSupergift() {
gg.ui.openPanel(UIID.greatGift);
}
click_btnMoreGame() {
gg.ui.openPanel(UIID.atGameChoose);
}
click_btnOutLine(): void {
// let conf = gg.newFun.getNewFunData(NewFunType.MainPageTab, UIID.zombieLayer);
// if (gg.data.doc.chapter <= conf.chapter) {
// gg.ui.showToast(gg.lang.get('通关第{1}章节解锁', [conf.chapter]), false)
// return;
// }
// //预加载UIID.zombieFarm
// gg.game.showLoading(1);
// let resPkg = getZombieResPakage();
// this.scheduleOnce(() => {
// gg.res.loadResPakg(resPkg, (c, t) => {
// }, () => {
// gg.game.hideLoading();
// gg.ui.openPanel(UIID.zombieLayer);
// });
// })
// gg.ui.openPanel(UIID.zombieLayer);
gg.ui.openPanel(UIID.wipeOut);
}
click_btnTask(): void {
let conf = gg.newFun.getNewFunData(NewFunType.MainPageBtn, 5);
if (gg.data.doc.chapter <= conf.chapter) {
gg.ui.showToast(gg.lang.get(conf.desc, [conf.chapter]), false)
return
}
gg.ui.openPanel(UIID.taskView);
}
click_btnSignIn(): void {
gg.ui.openPanel(UIID.sign7Day);
}
click_btnSetting(): void {
gg.ui.openPanel(UIID.Settings);
}
click_btnLevel(): void {
let conf = gg.newFun.getNewFunData(NewFunType.MainPageBtn, 2);
if (gg.data.doc.chapter <= conf.chapter) {
gg.ui.showToast(gg.lang.get(conf.desc, [conf.chapter]), false)
return
}
gg.ui.openPanel(UIID.jumpGameLevel)
}
/** 点击邀请好友 */
click_btnInvite(): void {
}
/** 点击排行榜 */
click_btnRank(): void {
}
/** 点击超值礼包 */
click_btnValueGift(): void {
let conf = gg.newFun.getNewFunData(NewFunType.MainPageBtn, 1);
if (gg.data.doc.chapter <= conf.chapter) {
gg.ui.showToast(gg.lang.get(conf.desc, [conf.chapter]), false)
return
}
}
click_btnFirstBag(): void {
gg.ui.openPanel(UIID.PopFirstRecharge);
}
click_btnMonthlyCard(): void {
let conf = gg.newFun.getNewFunData(NewFunType.MainPageBtn, 3);
if (gg.data.doc.chapter <= conf.chapter) {
gg.ui.showToast(gg.lang.get(conf.desc, [conf.chapter]), false)
return
}
gg.ui.openPanel(UIID.PopMonthCard);
}
click_btnDayGift(): void {
gg.ui.openPanel(UIID.PopContinuouslyBag);
}
click_btnfund(): void {
let conf = gg.newFun.getNewFunData(NewFunType.MainPageBtn, 4);
if (gg.data.doc.chapter <= conf.chapter) {
gg.ui.showToast(gg.lang.get(conf.desc, [conf.chapter]), false)
return
}
gg.ui.openPanel(UIID.PopFund);
}
showStartBtnFinger() {
this.btnStart.getChildByName('finger').active = true
}
showLiulianGuideEnd(){
if (gg.data.getStatistics(StatisticsType.LiulianGuideIndex) == 6) {
this.showStartBtnFinger()
gg.data.setStatistics(StatisticsType.LiulianGuideIndex, 7)
}
}
guideEnd() {
//引导结束
if (gg.data.getStatistics(StatisticsType.homeGuideIndex) == 4) {
this.showStartBtnFinger()
} else {
if (this._pauseOverlayUntilGuideEnd) {
this._pauseOverlayUntilGuideEnd = false;
}
this.scheduleHomeOverlaySequence();
this.tryShowOfflineRewardIfNeeded();
}
}
guideShow(){
if( gg.data.doc.chapter == 2 && gg.game.playerGameFail && gg.data.getStatistics(StatisticsType.homeGuideIndex) == 0){
let weaponLevel = gg.data.project.getWeaponLevel(WeaponType.DanGong);
if (weaponLevel >= 2) {
// 已跳过武器引导时:仅当已通关第3章才进入「点角色」(index4);否则直接结束本段
gg.data.setStatistics(StatisticsType.homeGuideIndex, 4)
return
}
let goodID = 21 //彩虹飞弹碎片
gg.data.addItemNum(goodID, 5);
gg.data.setStatistics(StatisticsType.homeGuideIndex, 1)
GEvent.Ins.emit(GEvent.homeGuideIndexEventNew, 1)
}else if(gg.data.doc.chapter == 2 && gg.game.IsPlayedGame){
//引导角色升级
//
if(gg.data.getStatistics(StatisticsType.homeGuideIndex) < 4){
gg.data.setStatistics(StatisticsType.homeGuideIndex, 4)
}
GEvent.Ins.emit(GEvent.homeGuideIndexEventNew, 4)
}
}
StoryDialogEnd(guideIndex) {
if (guideIndex == 0) {
this.scheduleHomeOverlaySequence();
return
}
//引导结束新功能引导
if (GuideType.guide1 == guideIndex) {
//引导进入丧尸工厂
console.log("超值弹窗+若引导");
// gg.game.guideGreatGift = true;
// gg.ui.popPanel(UIID.greatGift);
// this.showStartBtnFinger()
} else if (GuideType.guide2 == guideIndex) {
console.log("武器引导");
//判断彩虹飞弹武器等级
let weaponLevel = gg.data.project.getWeaponLevel(WeaponType.DanGong);
if (weaponLevel >= 2) {
// 已跳过武器引导时:仅当已通关第3章才进入「点角色」(index4);否则直接结束本段
gg.data.setStatistics(StatisticsType.homeGuideIndex, gg.data.doc.chapter >= 4 ? 4 : 6)
this.scheduleHomeOverlaySequence();
return
}
let goodID = 21 //彩虹飞弹碎片
gg.data.addItemNum(goodID, 5);
gg.data.setStatistics(StatisticsType.homeGuideIndex, 1)
GEvent.Ins.emit(GEvent.homeGuideIndexEvent)
//引导点击武器 ->引导点击彩虹飞弹->点击升级->点击战斗
} else if (GuideType.guide3 == guideIndex) {
console.log("角色引导(配表 type4 第三章后剧情)");
// 通关第3章后播片结束 → 引导点角色升级(与武器链 doc.chapter>=4 一致)
let playerLevel = gg.data.getPlayerLevel();
if (playerLevel >= 2) {
gg.data.setStatistics(StatisticsType.homeGuideIndex, 6)
this.scheduleHomeOverlaySequence();
return
}
if(playerLevel == 0){
gg.game.forceHomeRoleTabGuide = true;
gg.data.setStatistics(StatisticsType.homeGuideIndex, 4)
GEvent.Ins.emit(GEvent.homeGuideIndexEvent);
}
return;
} else if (GuideType.guide4 == guideIndex) {
console.log("强引导点击进入丧尸农场(第4章结束剧情,配表 guide4)");
// guide4 与「新副本解锁弹窗」同帧触发时会抢层:引导期间先暂停叠加流程,待 guideEnd 再恢复
this._pauseOverlayUntilGuideEnd = true;
let btnOutLine = this.btnOutLine
gg.ui.openPanel(UIID.NewGuideMask, {
data: [
[btnOutLine],
[''],
() => {
// NewGuideMask 本身不会派发“引导结束”事件;若不补这个,_pauseOverlayUntilGuideEnd 会一直卡住
// 这里以“用户完成点击目标按钮”为本段引导结束信号,恢复主页叠加队列
this.scheduleOnce(() => {
GEvent.Ins.emit(GEvent.homeGuideIndexEventEnd);
}, 0);
},
true,
255
]
})
} else if (GuideType.guide5 == guideIndex) {
console.log("引导解锁困难模式");
let toggle = this.ui_title
gg.data.setStatistics(StatisticsType.homeGuideIndex, 8)
gg.ui.openPanel(UIID.NewGuideMask, {
data: [
[toggle],
[gg.lang.get('远方传来一阵异响,地狱模式已开放,该你出手了')],
() => {
},
true,
255
]
})
} else if (GuideType.guide6 == guideIndex) {
console.log("引导点击角色");
//角色-宠物-宠物抽取
gg.data.setStatistics(StatisticsType.homeGuideIndex, 11)
GEvent.Ins.emit(GEvent.homeGuideIndexEvent)
}
}
/**
* openPanel -> popPanel -> popPanel
* / NewGuideMask
*/
checkJuQing() {
this.scheduleHomeOverlaySequence();
//地狱引导,因为和剧情和新功能没有冲突开启引导
// if(gg.data.getStatistics(StatisticsType.HellGuideIndex) == 0 && gg.data.doc.chapter > 16){
// let toggle = this.ui_title
// gg.data.setStatistics(StatisticsType.HellGuideIndex, 1)
// gg.ui.openPanel(UIID.NewGuideMask, {
// data: [
// [toggle],
// [gg.lang.get('远方传来一阵异响,地狱模式已开放,该你出手了')],
// () => {
// },
// true,
// 255
// ]
// })
// }
}
/** 与 MainUI / 各子页 homeGuideIndex 状态机一致:6=一段引导结束,7/14+=不拦截 */
private isHomeGuideBlocking(): boolean {
const idx = gg.data.getStatistics(StatisticsType.homeGuideIndex);
if (UIPanelHome.HOME_GUIDE_NON_BLOCKING_INDEX.has(idx)) return false;
if (idx >= UIPanelHome.HOME_GUIDE_NON_BLOCKING_FROM) return false;
const [min, max] = UIPanelHome.HOME_GUIDE_BLOCKING_RANGE;
return idx >= min && idx <= max;
}
/** 离线收益(wipeOut):引导进行中不弹,引导结束后再尝试 */
private tryShowOfflineRewardIfNeeded(): void {
if (gg.data.doc.chapter <= 1 || gg.game.isShowWipeOut) return;
if (this.isHomeGuideBlocking() || this._pauseOverlayUntilGuideEnd) return;
gg.game.isShowWipeOut = true;
const maxTime = 8 * 60 * 60;
const lastAddTime = gg.data.getStatistics(StatisticsType.AfkRewards);
const curTime = gg.data.getCurentTime();
const time = Math.floor((curTime - lastAddTime) / 1000);
if (time >= maxTime) {
this.scheduleOnce(() => {
if (this.isHomeGuideBlocking() || this._pauseOverlayUntilGuideEnd) return;
gg.ui.openPanel(UIID.wipeOut);
}, 1);
}
}
private scheduleHomeOverlaySequence(): void {
return;
if (this._pauseOverlayUntilGuideEnd) {
return;
}
if (this.isHomeGuideBlocking()) {
const idx = gg.data.getStatistics(StatisticsType.homeGuideIndex);
if (idx === 1 || idx === 3 || idx === 4 || idx === 11) {
GEvent.Ins.emit(GEvent.homeGuideIndexEvent);
}
return;
}
const funid = gg.storyManager.isUnLockMode();
if (funid !== -1) {
const list = gg.storyManager.getStoryComicData(funid);
const isCanOpen = gg.storyManager.isCanOpen(funid);
if (list && isCanOpen) {
gg.storyManager.storyGuide(funid);
return;
}
}else{
if(gg.game.thirdChapterFailWeaponUpgrade && gg.data.getStatistics(StatisticsType.secondChapterFailWeaponUpgrade) == 0){
gg.data.setStatistics(StatisticsType.secondChapterFailWeaponUpgrade, 1)
gg.storyManager.storyForceGuide(3);
return;
}
if(gg.game.thirdChapterFailRoleUpgrade && gg.data.getStatistics(StatisticsType.secondChapterFailRoleUpgrade) == 0){
gg.data.setStatistics(StatisticsType.secondChapterFailRoleUpgrade, 1)
//加200的金币升级
gg.data.addMoney(200);
//引导点击角色升级
gg.game.forceHomeRoleTabGuide = true;
gg.data.setStatistics(StatisticsType.homeGuideIndex, 4)
GEvent.Ins.emit(GEvent.homeGuideIndexEvent);
return;
}
if(gg.data.doc.chapter == 3 && gg.game.thirdChapterWinGreatGift){
gg.game.thirdChapterWinGreatGift = false;
let greatGiftGetDay = gg.data.getStatistics(StatisticsType.GreatGiftGetDay)
if(greatGiftGetDay == 0 && gg.data.getStatistics(StatisticsType.GreatGiftStatus) == 0){
gg.game.guideGreatGift = true;
gg.ui.openPanel(UIID.greatGift)
}
}
}
gg.newFun.checkNewFunPop();
}
checkGuide() {
return false
}
showGude() {
}
}