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.
377 lines
12 KiB
377 lines
12 KiB
import { BUILDING_TYPE, EGongFaType, NEED_TYPE, GameTotalType, TASK_TYPE, PropType } from "../const/GameEnum";
|
|
import { ITaskArchive } from "../const/GameInterface";
|
|
import { MAINPAGE_UNLOCK_PARAMS } from "../const/GGameData";
|
|
import { EUIForms } from "../const/UIFormCnf";
|
|
import { EGlobalEvent } from "../MesEvent/EGlobalEvent";
|
|
import MesMgr from "../MesEvent/MesMgr";
|
|
import { ITask } from "../Mgr_CSV/CsvEnum";
|
|
import CsvMgr from "../Mgr_CSV/CsvMgr";
|
|
import { GEData } from "../Mgr_Ge/GeDifine";
|
|
import { TDAnalyticsMgr } from "../Mgr_Ge/TDAnalyticsMgr";
|
|
import { GuideConfigType } from "../Mgr_Guide/GuideConfig";
|
|
import GuideDataMgr from "../Mgr_Guide/GuideDataMgr";
|
|
import { HomeUIRedEnum, MainRedEnum } from "../Mgr_RedPoint/RedEnumType";
|
|
import { RedNotice } from "../Mgr_RedPoint/RedNotice";
|
|
import UIMgr from "../Mgr_UI/UIMgr";
|
|
import { BagDataProxy } from "./DataTypeProxy/BagDataProxy";
|
|
import { BuildsDataProxy } from "./DataTypeProxy/BuildsDataProxy";
|
|
import { ShopDataProxy } from "./DataTypeProxy/ShopDataProxy";
|
|
import { TaskDataProxy } from "./DataTypeProxy/TaskDataProxy";
|
|
import { TokenDataProxy } from "./DataTypeProxy/TokenDataProxy";
|
|
import LocalStorage from "./LocalStorage";
|
|
import RoleDataMgr from "./RoleDataMgr";
|
|
import SceneDataMgr from "./SceneDataMgr";
|
|
|
|
|
|
export default class TaskArchivePoxy{
|
|
private archive: ITaskArchive;
|
|
|
|
private _config: ITask = null;
|
|
public completeDirty: boolean = true;
|
|
constructor(archive: ITaskArchive) {
|
|
this.archive = archive;
|
|
this.refreshConfig();
|
|
}
|
|
/**
|
|
* 刷新任务配置
|
|
*/
|
|
refreshConfig(): void {
|
|
if (this.archive.id) {
|
|
this._config = CsvMgr.tasks_csv[this.archive.id];
|
|
} else {
|
|
this.generateDefaultConfig();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成默认任务配置(当任务ID不存在时)
|
|
*/
|
|
private generateDefaultConfig(): void {
|
|
const levelKeys = Object.keys(CsvMgr.Level_csv);
|
|
const taskIndex = this.archive.index % 100000;
|
|
const levelIndex = (taskIndex - 1) % levelKeys.length;
|
|
const targetLevel = CsvMgr.Level_csv[levelKeys[levelIndex]];
|
|
const bossConfig = CsvMgr.Enemy_csv[targetLevel.boss];
|
|
this._config = {
|
|
id: this.archive.index,
|
|
name: "",
|
|
quality: 5,
|
|
condition: TASK_TYPE.XIAOGUAI,
|
|
conditionId: taskIndex,
|
|
conditionValue: 1,
|
|
conditionDesc: `击败${bossConfig.name}`,
|
|
rewardType: GameTotalType.TOKEN,
|
|
rewardId: 1,
|
|
rewardValue: 1,
|
|
desc: "测试"
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 增加任务进度
|
|
* @param increment 进度增量
|
|
*/
|
|
addProgress(increment: number): void {
|
|
if (this.progress < this.config.conditionValue) {
|
|
this.archive.progress += increment;
|
|
this.completeDirty = true;
|
|
TaskDataProxy.Ins.Save();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 重置任务进度
|
|
*/
|
|
resetProgress(): void {
|
|
this.archive.progress = 0;
|
|
this.archive.completed = false;
|
|
this.archive.getreward = false;
|
|
this.completeDirty = true;
|
|
// TaskDataProxy.Ins.Save();
|
|
}
|
|
|
|
|
|
// 任务完成后的领奖
|
|
public getReward(): boolean {
|
|
if(this.complete && !this.archive.getreward){
|
|
this.archive.getreward = true;
|
|
// 处理不同类型的任务奖励
|
|
switch (this.config.rewardType) {
|
|
case GameTotalType.ITEM:
|
|
// 物品奖励
|
|
BagDataProxy.Ins.addItem(this.config.rewardId, this.config.rewardValue);
|
|
break;
|
|
case GameTotalType.BUILD:
|
|
// 建筑类奖励(投资,商店升级等)
|
|
BuildsDataProxy.Ins.addBuilding(this.config.rewardId);
|
|
break;
|
|
case GameTotalType.TOKEN:
|
|
// 获得银两或玄武符
|
|
TokenDataProxy.Ins.addToken(this.config.rewardId, this.config.rewardValue)
|
|
|
|
break;
|
|
case GameTotalType.UNLOCK:
|
|
// 解锁类奖励(投资、商店等)
|
|
ShopDataProxy.Ins.unlockShop();
|
|
break;
|
|
}
|
|
this.nextTask();
|
|
return this.checkMainPageUnlock();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// 是否有可解锁的主功能
|
|
checkMainPageUnlock(): boolean{
|
|
for (let i = 0; i < MAINPAGE_UNLOCK_PARAMS.length; i++) {
|
|
const unlockParam = MAINPAGE_UNLOCK_PARAMS[i];
|
|
if (unlockParam.taskid === Number(this.id)) {
|
|
if(unlockParam.unlockpage){
|
|
UIMgr.Ins.ShowUI(EUIForms.UnlockUI, { param: unlockParam });
|
|
}else if(unlockParam.guideid){
|
|
GuideDataMgr.ins.setExecuteGuide(unlockParam.guideid);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
nextTask(): void {
|
|
const curid = Number(this.archive.id) + 1;
|
|
if(CsvMgr.tasks_csv[curid]){
|
|
this.resetProgress();
|
|
++this.archive.index;
|
|
this.id = "" + curid;
|
|
}else{
|
|
TaskDataProxy.Ins.compoleteAllTask();
|
|
// 仅通关任务执行的特殊逻辑
|
|
}
|
|
MesMgr.event(EGlobalEvent.REFRESH_TASK);
|
|
MesMgr.event(EGlobalEvent.FINISH_TASK);
|
|
RedNotice.emit(EGlobalEvent.E_RED_UPDATE,[MainRedEnum.游历, HomeUIRedEnum.任务完成]);
|
|
TDAnalyticsMgr.ins.TrySendtrack(GEData.GEeventName.Main_quest,{details: curid - 1});
|
|
LocalStorage.CheckSaveServerData();
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取当前任务进度(根据任务类型动态计算)
|
|
*/
|
|
get progress(): number {
|
|
if (!this.config) return 0;
|
|
switch (this.config.condition) {
|
|
case TASK_TYPE.XIAOGUAI:
|
|
return this.calculateXiaoguaiProgress();
|
|
case TASK_TYPE.BOSS:
|
|
return this.calculateBossProgress();
|
|
case TASK_TYPE.UPGRADE_WUGONG:
|
|
return RoleDataMgr.Ins.getWuGongLevel(this.config.conditionId);
|
|
case TASK_TYPE.UPGRADE_BUILDING:
|
|
return this.calculateBuildingProgress();
|
|
case TASK_TYPE.ATTAINMENT:
|
|
return this.calculateAttainmentProgress();
|
|
case TASK_TYPE.EQUIP:
|
|
return this.calculateEquipProgress();
|
|
case TASK_TYPE.ADD_WUGONG:
|
|
return RoleDataMgr.Ins.getWuGongLevel(this.config.conditionId) ? 1 : 0;
|
|
|
|
default:
|
|
return this.archive.progress;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 设置任务进度
|
|
*/
|
|
set progress(value: number) {
|
|
this.archive.progress = value;
|
|
this.completeDirty = true;
|
|
TaskDataProxy.Ins.Save();
|
|
}
|
|
|
|
/**
|
|
* 计算小怪任务进度
|
|
*/
|
|
private calculateXiaoguaiProgress(): number {
|
|
const conditionLevel = Number(this.config!.conditionId);
|
|
const currentLevel = SceneDataMgr.Ins.level.id;
|
|
if (currentLevel > conditionLevel || SceneDataMgr.Ins.level.passed) {
|
|
return this.config!.conditionValue;
|
|
}
|
|
|
|
if (currentLevel < conditionLevel) {
|
|
return 0;
|
|
}
|
|
|
|
return this.archive.progress;
|
|
}
|
|
|
|
/**
|
|
* 计算Boss任务进度
|
|
*/
|
|
private calculateBossProgress(): number {
|
|
const conditionLevel = Number(this.config!.conditionId);
|
|
const currentLevel = SceneDataMgr.Ins.level.id;
|
|
|
|
if (currentLevel > conditionLevel || SceneDataMgr.Ins.level.passed) {
|
|
return this.config!.conditionValue;
|
|
}
|
|
|
|
return this.archive.progress;
|
|
}
|
|
|
|
/**
|
|
* 计算建筑升级进度
|
|
*/
|
|
private calculateBuildingProgress(): number {
|
|
const buildingType = Number(this.config!.conditionId);
|
|
|
|
switch (buildingType) {
|
|
case BUILDING_TYPE.SHOP:
|
|
return ShopDataProxy.Ins.data.level;
|
|
case BUILDING_TYPE.BAG:
|
|
return BagDataProxy.Ins.data.level;//gameModel.bag.level;
|
|
case BUILDING_TYPE.TEAHOUSE:
|
|
case BUILDING_TYPE.TAVERN:
|
|
case BUILDING_TYPE.BANK:
|
|
const building = BuildsDataProxy.Ins.buildings[buildingType];
|
|
return (building && building.running) ? building.level : 0;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 计算武学造诣进度
|
|
*/
|
|
private calculateAttainmentProgress(): number {
|
|
const wugongMapping: { [key: string]: EGongFaType } = {
|
|
[NEED_TYPE.QUANFA]: EGongFaType.剑法,
|
|
[NEED_TYPE.JIANFA]: EGongFaType.刀法,
|
|
[NEED_TYPE.DAOFA]: EGongFaType.枪法,
|
|
[NEED_TYPE.SHENSHOU]: EGongFaType.轻功,
|
|
[NEED_TYPE.GONGFA]: EGongFaType.内功
|
|
};
|
|
const wugongType = wugongMapping[this.config!.conditionId];
|
|
return wugongType ? RoleDataMgr.Ins.attainments[wugongType] : 0;
|
|
}
|
|
|
|
/**
|
|
* 计算装备任务进度
|
|
*/
|
|
private calculateEquipProgress(): number {
|
|
const role = RoleDataMgr.Ins;
|
|
const targetEquipId = this.config!.conditionId;
|
|
|
|
if ((role.weapon && role.weapon.id === targetEquipId) ||
|
|
(role.armor && role.armor.id === targetEquipId)) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Getter 和 Setter 属性
|
|
|
|
/**
|
|
* 获取任务ID
|
|
*/
|
|
get id(): string {
|
|
return this.archive.id;
|
|
}
|
|
|
|
/**
|
|
* 设置任务ID
|
|
*/
|
|
set id(value: string) {
|
|
this.archive.id = value;
|
|
this.completeDirty = true;
|
|
TaskDataProxy.Ins.Save();
|
|
if (value) {
|
|
this._config = CsvMgr.tasks_csv[value];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取任务索引
|
|
*/
|
|
get index(): number {
|
|
return this.archive.index;
|
|
}
|
|
|
|
/**
|
|
* 设置任务索引
|
|
*/
|
|
set index(value: number) {
|
|
this.archive.index = value;
|
|
TaskDataProxy.Ins.Save();
|
|
this.refreshConfig();
|
|
}
|
|
|
|
/**
|
|
* 获取任务配置
|
|
*/
|
|
get config(): ITask {
|
|
if (!this._config) {
|
|
this.refreshConfig();
|
|
}
|
|
return this._config!;
|
|
}
|
|
|
|
/**
|
|
* 检查任务是否完成
|
|
*/
|
|
get complete(): boolean {
|
|
return this.progress >= this.config.conditionValue;
|
|
}
|
|
|
|
/**
|
|
* 获取任务完成百分比
|
|
*/
|
|
get completionPercent(): number {
|
|
if (this.config.conditionValue === 0) return 0;
|
|
return Math.min(100, Math.floor((this.progress / this.config.conditionValue) * 100));
|
|
}
|
|
|
|
/**
|
|
* 获取任务显示名称
|
|
*/
|
|
get displayName(): string {
|
|
return this.config.name || `任务 ${this.id}`;
|
|
}
|
|
|
|
/**
|
|
* 获取任务条件描述
|
|
*/
|
|
get conditionDescription(): string {
|
|
return this.config.conditionDesc;
|
|
}
|
|
|
|
/**
|
|
* 获取奖励描述
|
|
*/
|
|
get rewardDescription(): string {
|
|
return `奖励: ${this.config.rewardValue} ${this.config.desc}`;
|
|
}
|
|
|
|
/**
|
|
* 序列化任务数据(用于存档)
|
|
*/
|
|
serialize(): ITaskArchive {
|
|
return {
|
|
id: this.archive.id,
|
|
index: this.archive.index,
|
|
progress: this.archive.progress,
|
|
completed: this.complete,
|
|
getreward: this.archive.getreward,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 克隆任务数据
|
|
*/
|
|
clone(): TaskArchivePoxy {
|
|
return new TaskArchivePoxy(this.serialize());
|
|
}
|
|
}
|