UnlockSpecialPlotModelManager.ts 10.1 KB
import { ConfigManager } from "simba-config-manager";
import { TimeManager } from "simba-sdk";
import { DeepReadonlyObject } from "simba-utils";
import { GameRecord, PlotManager } from "../../avg/AVG";
import { IStoryTbl, storyTbl } from "../../config/StoryTbl";
import { UnlockItemModelManager } from "./UnlockItemModelManager";

class UnlockSpecialPlotModelManager1 {
    /**存档Key */
    private UnlockedSpecialPlots = 'UnlockedSpecialPlots_';
    /**存档Key */
    private ClickedSpecialPlotsByItem = 'ClickedSpecialPlots_';
    /**存档Key */
    private FirstDayTime = "FirstDayTime"
    /**配置解锁番外剧情的剧情id和番外剧情id的映射表 */
    private _unlockPlotIds: Array<{ specialPlotId: number, plotId: number, itemId: number }> = [];

    /**
     * 检查一个番外剧情是否解锁
     * @param specialPlotId 番外剧情Id
     * @returns 
     */
    public checkSpecialPlotIdIsUnlocked(specialPlotId: number): boolean {
        let unlockedAllSpecialPlotId = this.unlockedAllSpecialPlotId();
        for (let i = 0; i < unlockedAllSpecialPlotId.length; i++) {
            if (specialPlotId == unlockedAllSpecialPlotId[i]) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据ItemId获取该Id解锁了的番外Id
     * @param itemId 
     * @returns 
     */
    public unlockedSpecialPlotIdByItemId(itemId: number): Array<number> {
        let unlockedSpecialPlots: Array<number> = [];
        let unlockedSpecialPlotsStrs = GameRecord.globalVariables[this.UnlockedSpecialPlots + itemId];
        if (unlockedSpecialPlotsStrs) {
            let itemsIdStr: Array<string> = unlockedSpecialPlotsStrs.split(',');
            itemsIdStr.forEach(id => {
                try {
                    unlockedSpecialPlots.push(Number(id));
                } catch (error) {
                    console.error(error);
                }
            });
        }
        unlockedSpecialPlots.sort((a, b) => {
            if (a < b) {
                return -1;
            } else if (a > b) {
                return 1;
            }
            return 0;
        });
        return unlockedSpecialPlots;
    }

    /**
     * 根据ItemId保存解锁了的番外Id到存档
     * @param specialPlotId 番外Id
     */
    saveUnlockedSpecialPlotIdByItemIdToGameRecord(specialPlotId: number): boolean {
        let cfg: DeepReadonlyObject<IStoryTbl> | undefined = undefined;
        cfg = ConfigManager.getConfig(storyTbl, specialPlotId);
        let itemId: number = -1;
        if (cfg) {
            itemId = cfg.itemId;
        }
        let unlockedSpecialPlotsStrs = GameRecord.globalVariables[this.UnlockedSpecialPlots + itemId];
        let plots: Array<number> = [];
        if (unlockedSpecialPlotsStrs) {
            let unlockedSpecialPlotsStr: Array<string> = unlockedSpecialPlotsStrs.split(',');
            unlockedSpecialPlotsStr.forEach(id => {
                try {
                    plots.push(Number(id));
                    plots.sort((a, b) => {
                        if (a < b) {
                            return -1;
                        } else if (a > b) {
                            return 1;
                        }
                        return 0;
                    });
                } catch (error) {
                    console.error(error);
                }
            });
        }
        if (plots.indexOf(specialPlotId) == -1) {
            plots.push(specialPlotId);
            plots.sort((a, b) => {
                if (a < b) {
                    return -1;
                } else if (a > b) {
                    return 1;
                }
                return 0;
            });
            GameRecord.globalVariables[this.UnlockedSpecialPlots + itemId] = plots.toString();
            GameRecord.saveRecord();
            return true;
        }
        return false;
    }

    /**
     * 根据ItemId获取该Id观看了的番外Id
     * @param itemId 
     * @returns 
     */
    public clickedSpecialPlotIdByItemId(itemId: number): Array<number> {
        let clickedSpecialPlots: Array<number> = [];
        let clickedSpecialPlotsStrs = GameRecord.globalVariables[this.ClickedSpecialPlotsByItem + itemId];
        if (clickedSpecialPlotsStrs) {
            let itemsIdStr: Array<string> = clickedSpecialPlotsStrs.split(',');
            itemsIdStr.forEach(id => {
                try {
                    clickedSpecialPlots.push(Number(id));
                } catch (error) {
                    console.error(error);
                }
            });
        }
        return clickedSpecialPlots;
    }

    /**
     * 根据ItemId保存观看了的番外Id到存档
     * @param specialPlotId 番外Id
     */
    saveClickedSpecialPlotIdByItemIdToGameRecord(specialPlotId: number): boolean {
        let cfg: DeepReadonlyObject<IStoryTbl> | undefined = undefined;
        cfg = ConfigManager.getConfig(storyTbl, specialPlotId);
        let itemId: number = -1;
        if (cfg) {
            itemId = cfg.itemId;
        }
        let clickedSpecialPlotsStrs = GameRecord.globalVariables[this.ClickedSpecialPlotsByItem + itemId];
        let plots: Array<number> = [];
        if (clickedSpecialPlotsStrs) {
            let unlockedSpecialPlotsStr: Array<string> = clickedSpecialPlotsStrs.split(',');
            unlockedSpecialPlotsStr.forEach(id => {
                try {
                    plots.push(Number(id));
                } catch (error) {
                    console.error(error);
                }
            });
        }
        if (plots.indexOf(specialPlotId) == -1) {
            plots.push(specialPlotId);
            GameRecord.globalVariables[this.ClickedSpecialPlotsByItem + itemId] = plots.toString();
            GameRecord.saveRecord();
            return true;
        }
        return false;
    }

    /**
     * 根据ItemId获取该Id的所有番外Id(不论是否解锁)
     * @param itemId 
     * @returns 
     */
    public allSpecialPlotIdByItemId(itemId: number): Array<number> {
        let allSpecialPlots: Array<number> = [];
        let cfg = ConfigManager.getAllConfig(storyTbl);
        if (cfg) {
            let ret: { specialPlotId: number, itemId: number }[] = [];
            for (let id in cfg) {
                ret.push({ specialPlotId: Number(id), itemId: cfg[id].itemId });
            }
            for (let i = 0; i < ret.length; i++) {
                if (itemId == ret[i].itemId) {
                    allSpecialPlots.push(ret[i].specialPlotId);
                }
            }
        }
        return allSpecialPlots;
    }

    /**
    * 获取所有解锁了的番外Id
    * @returns 
    */
    public unlockedAllSpecialPlotId(): Array<number> {
        let unlockedAllSpecialPlotId: Array<number> = [];
        let unlockedItemId: Array<number> = UnlockItemModelManager.unlockItems;
        for (let i = 0; i < unlockedItemId.length; i++) {
            let unlockedSpecialPlotId = GameRecord.globalVariables[this.UnlockedSpecialPlots + unlockedItemId[i]];
            if (unlockedSpecialPlotId) {
                let clickedSpecialPlotIdStr: Array<string> = unlockedSpecialPlotId.split(',');
                clickedSpecialPlotIdStr.forEach(id => {
                    try {
                        unlockedAllSpecialPlotId.push(Number(id));
                    } catch (error) {
                        console.error(error);
                    }
                });
            }
        }
        return unlockedAllSpecialPlotId;
    }

    getFirstDayTime(): number {
        let firstDayTime = GameRecord.globalVariables[this.FirstDayTime];
        return firstDayTime;
    }

    saveFirstDayTime(): boolean {
        let firstDayTime = GameRecord.globalVariables[this.FirstDayTime];
        if (firstDayTime) {
            return false;
        } else {
            GameRecord.globalVariables[this.FirstDayTime] = TimeManager.getTime();
            GameRecord.saveRecord();
            return true;
        }
    }

    /**
     * 登录初始化已经解锁的番外
     */
    loginInitUnlockSpecialPlots() {
        //当前剧情应该解锁的所有物品
        let specialPlotcfg: { specialPlotId: number, plotId: number, itemId: number }[] = this.unlockPlotIds;
        //获取当前的剧情id
        let record = GameRecord.getPlotsInfo();
        for (let i = 0; i < specialPlotcfg.length; i++) {
            let ele = specialPlotcfg[i];
            if (ele) {
                if (record[`${ele.plotId}`] && record[`${ele.plotId}`].cnt >= 1) {
                    let unlockedSpecialPlotsStrs = GameRecord.globalVariables[this.UnlockedSpecialPlots + ele.itemId];
                    let plots: Array<number> = [];
                    if (unlockedSpecialPlotsStrs) {
                        let unlockedSpecialPlotsStr: Array<string> = unlockedSpecialPlotsStrs.split(',');
                        unlockedSpecialPlotsStr.forEach(id => {
                            try {
                                plots.push(Number(id));
                            } catch (error) {
                                console.error(error);
                            }
                        });
                    }
                    if (plots.indexOf(ele.specialPlotId) == -1) {
                        plots.push(ele.specialPlotId);
                    }
                    GameRecord.globalVariables[this.UnlockedSpecialPlots + ele.itemId] = plots.toString();
                    // GameRecord.autoSave();
                }
            }
        }
    }

    public get unlockPlotIds(): Array<{ specialPlotId: number, plotId: number, itemId: number }> {
        if (this._unlockPlotIds.length == 0) this.analysisSpecialPlotCfg();
        return this._unlockPlotIds
    }

    /**
     * 解析story表结果
     */
    analysisSpecialPlotCfg() {
        let ret: { specialPlotId: number, plotId: number, itemId: number }[] = [];
        let cfg = ConfigManager.getAllConfig(storyTbl);
        for (let id in cfg) {
            ret.push({ specialPlotId: Number(id), plotId: cfg[id].plotId, itemId: cfg[id].itemId });
        }
        this._unlockPlotIds = ret;
    }
}

export let UnlockSpecialPlotModelManager = new UnlockSpecialPlotModelManager1();