283 lines
9.1 KiB
TypeScript
283 lines
9.1 KiB
TypeScript
import { oops } from "db://oops-framework/core/Oops";
|
||
import { smc } from "../SingletonModuleComp";
|
||
import { GameEvent } from "./GameEvent";
|
||
import { UIID } from "./GameUIConfig";
|
||
|
||
/** 引导步骤类型枚举 */
|
||
export enum GuideStepType {
|
||
/** 点击操作 */
|
||
CLICK = "click",
|
||
/** 拖拽操作 */
|
||
DRAG = "drag",
|
||
/** 显示提示 */
|
||
TIP = "tip",
|
||
/** 等待操作 */
|
||
WAIT = "wait",
|
||
}
|
||
export const finishCurrGuide=(key:number)=>{
|
||
if(key==0){
|
||
oops.message.dispatchEvent(GameEvent.GuideEnd,key)
|
||
}else{
|
||
if(smc.guides[key-1]===1&&smc.guides[key]===0){
|
||
oops.message.dispatchEvent(GameEvent.GuideEnd,key)
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
export const startGuide=(key:number)=>{
|
||
if(smc.guides[key-1]===1&&smc.guides[key]===0){
|
||
oops.message.dispatchEvent(GameEvent.GuideStart,key)
|
||
}
|
||
}
|
||
/** 引导步骤配置接口 */
|
||
export interface IGuideStep {
|
||
/** 步骤ID */
|
||
id: string;
|
||
/** 步骤类型 */
|
||
type: GuideStepType;
|
||
/** 目标节点路径(用于查找目标节点) */
|
||
key: number;
|
||
targetPath?: string;
|
||
tipParent?: string;
|
||
/** 提示文本 */
|
||
tipText?: string;
|
||
/** 提示文本偏移 */
|
||
tipOffset?: { x: number, y: number };
|
||
/** 手指动画位置偏移 */
|
||
handOffset?: { x: number, y: number };
|
||
/** 下一步骤ID */
|
||
nextStep?: string;
|
||
/** 是否可跳过 */
|
||
skippable?: boolean;
|
||
/** 触发条件 */
|
||
condition?: () => boolean;
|
||
/** 对应的UI界面ID */
|
||
uiId?: UIID;
|
||
/** 等待时间 */
|
||
waitTime?: number;
|
||
/** 结束事件 */
|
||
end_event?: string;
|
||
/** 是否禁用输入 */
|
||
noInput?: boolean;
|
||
}
|
||
|
||
/** 引导配置数据 */
|
||
export const GuideConfig: { [key: number]: IGuideStep } = {
|
||
0: {
|
||
id: "welcome", type: GuideStepType.WAIT,key:0,
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/start/name",
|
||
tipText: "伟大的勇者,欢迎来到 『像素大陆』",
|
||
handOffset: { x: 42, y: -45 },
|
||
nextStep: "start_battle", waitTime: 5, end_event: "click", noInput: true,
|
||
},
|
||
1: {
|
||
id: "start_battle", type: GuideStepType.CLICK,key:1,
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/start/name",
|
||
tipText: "请带领您的英雄抵御兽人的入侵吧!",
|
||
handOffset: { x: 42, y: -45 },
|
||
// 42 45是手指的偏移量 0 0是提示的偏移量
|
||
},
|
||
2: {
|
||
id: "hero_page", type: GuideStepType.CLICK,key:2,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/btns/heros",
|
||
tipText: "在酒馆招募更多英雄增强队伍",
|
||
handOffset: { x: 42, y: -45 }, tipOffset: { x: 0, y: 600 },
|
||
},
|
||
3: {
|
||
id: "to_hero_info", type: GuideStepType.CLICK,key:3,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/heros_page",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
4: {
|
||
id: "do_hero_info", type: GuideStepType.CLICK,key:4,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/Hinfo/unLock",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
5: {
|
||
id: "up_lv_hero", type: GuideStepType.CLICK,key:5,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/Hinfo/upBtn",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
6: {
|
||
id: "close_hinfo", type: GuideStepType.CLICK,key:6,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/Hinfo/back",
|
||
handOffset: { x: 42, y: -45 }
|
||
},
|
||
7: {
|
||
id: "to_mission", type: GuideStepType.CLICK,key:7,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/btns/fight",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
8: {
|
||
id: "to_add_hero", type: GuideStepType.CLICK,key:8,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/readyheros/hero3",
|
||
tipText: "可以随时调整上阵英雄",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
9: {
|
||
id: "to_hero_select", type: GuideStepType.CLICK,key:9,
|
||
// 使用相对路径,从场景根节点开始查找
|
||
targetPath: "root/gui/LayerUI/hero_select/main/view/heros/hero2",
|
||
handOffset: { x: 42, y: -45 },
|
||
},
|
||
10: {
|
||
id: "start_battle", type: GuideStepType.CLICK,key:10,
|
||
targetPath: "root/gui/LayerUI/role_controller/mission_home/start/name",
|
||
tipText: "享受战斗的乐趣吧!",
|
||
handOffset: { x: 42, y: -45 },
|
||
// 42 45是手指的偏移量 0 0是提示的偏移量
|
||
},
|
||
};
|
||
|
||
/** 引导配置数组(用于兼容性) */
|
||
export const GuideConfigArray: IGuideStep[] = Object.values(GuideConfig);
|
||
|
||
/** 结束事件到引导索引的映射 */
|
||
export const EndEventToKey: { [key: string]: number[] } = {
|
||
[GameEvent.UpdateFightHero]: [4],
|
||
[GameEvent.MonDead]: [1],
|
||
[GameEvent.HeroLvUp]: [5],
|
||
// 示例:一个事件对应多个引导步骤
|
||
// [GameEvent.BattleStart]: [2, 3, 4], // 战斗开始时触发多个引导
|
||
// [GameEvent.LevelUp]: [5, 6, 7], // 升级时触发多个引导
|
||
// [GameEvent.HeroUnlock]: [8, 9], // 解锁英雄时触发多个引导
|
||
// [GameEvent.MissionComplete]: [10, 11, 12], // 任务完成时触发多个引导
|
||
}
|
||
|
||
/** 通过 end_event 查找引导索引数组 */
|
||
export function findGuidesByEndEvent(event: string): number[] {
|
||
return EndEventToKey[event] || [];
|
||
}
|
||
|
||
/** 通过 end_event 查找引导索引(保持向后兼容) */
|
||
export function findGuideByEndEvent(event: string): number | undefined {
|
||
const guides = EndEventToKey[event];
|
||
return guides && guides.length > 0 ? guides[0] : undefined;
|
||
}
|
||
|
||
/** 通过引导ID查找引导索引 */
|
||
export function findGuideIndexById(guideId: string): number {
|
||
for (const [key, guide] of Object.entries(GuideConfig)) {
|
||
if (guide.id === guideId) {
|
||
return parseInt(key);
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/** 通过引导ID查找引导配置 */
|
||
export function findGuideById(guideId: string): IGuideStep | undefined {
|
||
for (const guide of Object.values(GuideConfig)) {
|
||
if (guide.id === guideId) {
|
||
return guide;
|
||
}
|
||
}
|
||
return undefined;
|
||
}
|
||
|
||
/** 通过数字ID查找引导配置 */
|
||
export function findGuideByNumberId(numberId: number): IGuideStep | undefined {
|
||
return GuideConfig[numberId];
|
||
}
|
||
|
||
/** 获取所有引导ID列表 */
|
||
export function getAllGuideIds(): number[] {
|
||
return Object.keys(GuideConfig).map(key => parseInt(key));
|
||
}
|
||
|
||
/** 获取引导配置总数 */
|
||
export function getGuideConfigCount(): number {
|
||
return Object.keys(GuideConfig).length;
|
||
}
|
||
|
||
/**
|
||
* 使用示例:如何使用新的数字ID配置格式
|
||
*
|
||
* 1. 配置格式:
|
||
* export const GuideConfig: { [key: number]: IGuideStep } = {
|
||
* 0: { id: "welcome", ... },
|
||
* 1: { id: "start_battle", ... },
|
||
* 2: { id: "hero_page", ... },
|
||
* }
|
||
*
|
||
* 2. 通过数字ID查找引导:
|
||
* const guide = findGuideByNumberId(0); // 直接通过数字ID查找
|
||
*
|
||
* 3. 通过字符串ID查找引导:
|
||
* const guide = findGuideById("welcome"); // 通过字符串ID查找
|
||
*
|
||
* 4. 获取引导的数字索引:
|
||
* const index = findGuideIndexById("welcome"); // 返回 0
|
||
*
|
||
* 5. 事件映射配置:
|
||
* export const EndEventToKey: { [key: string]: number[] } = {
|
||
* [GameEvent.BattleStart]: [2, 3, 4], // 一个事件对应多个引导
|
||
* }
|
||
*
|
||
* 6. 启动引导:
|
||
* oops.message.dispatchEvent(GameEvent.GuideStart, 0); // 启动ID为0的引导
|
||
*
|
||
* 7. 优势:
|
||
* - 数字ID与 smc.guides 数组索引完全对应
|
||
* - 支持一个事件触发多个引导
|
||
* - 向后兼容,现有代码无需大幅修改
|
||
* - 便于扩展新的引导步骤
|
||
* - 数组索引从0开始,符合编程习惯
|
||
*/
|
||
|
||
/** 引导管理器配置 */
|
||
export interface IGuideManagerConfig {
|
||
/** 是否启用引导 */
|
||
enabled: boolean;
|
||
/** 引导配置文件路径 */
|
||
configPath: string;
|
||
/** 引导进度保存键 */
|
||
progressKey: string;
|
||
/** 默认引导ID */
|
||
defaultGuideId: string;
|
||
/** 引导层优先级 */
|
||
layerPriority: number;
|
||
}
|
||
|
||
/** 默认引导管理器配置 */
|
||
export const DefaultGuideConfig: IGuideManagerConfig = {
|
||
enabled: true,
|
||
configPath: "config/Guide",
|
||
progressKey: "guide_progress",
|
||
defaultGuideId: "welcome",
|
||
layerPriority: 1000
|
||
};
|
||
|
||
/** 引导事件类型 */
|
||
export enum GuideEventType {
|
||
/** 引导开始 */
|
||
GUIDE_START = "guide_start",
|
||
/** 引导步骤完成 */
|
||
STEP_COMPLETE = "step_complete",
|
||
/** 引导跳过 */
|
||
GUIDE_SKIP = "guide_skip",
|
||
/** 引导完成 */
|
||
GUIDE_COMPLETE = "guide_complete",
|
||
/** 引导错误 */
|
||
GUIDE_ERROR = "guide_error"
|
||
}
|
||
|
||
/** 引导步骤状态 */
|
||
export enum GuideStepStatus {
|
||
/** 未开始 */
|
||
NOT_STARTED = "not_started",
|
||
/** 进行中 */
|
||
IN_PROGRESS = "in_progress",
|
||
/** 已完成 */
|
||
COMPLETED = "completed",
|
||
/** 已跳过 */
|
||
SKIPPED = "skipped"
|
||
} |