import { CONFIDANTE_TYPE, SOUL_PARAMS, TALENT_TYPE, TREASURE_TYPE } from "../const/GGameData";
import { EGlobalEvent } from "../MesEvent/EGlobalEvent";
import MesMgr from "../MesEvent/MesMgr";
import UIMgr from "../Mgr_UI/UIMgr";
import { DateDataProxy } from "./DataTypeProxy/DateDataProxy";
import { GameDataProxy } from "./DataTypeProxy/GameDataProxy";
import { LocalDataMgr } from "./LocalDataMgr";
export default class SoulDataMgr {
private constructor() { };
private static _ins: SoulDataMgr = null;
public static get Ins() {
if (!this._ins) { this._ins = new SoulDataMgr(); }
return this._ins;
}
// 是否爆发
public crit: boolean = false;
private critEnd: number = 0;
private critMsEnd: number = 0;
public get _GameData() {
return GameDataProxy.Ins.data;
}
rebuild() {
this.crit = false;
this.critEnd = 0;
this.critMsEnd = 0;
}
setCrit() {
this.crit = true;
const talenttime = LocalDataMgr.Talent.getProp1(TALENT_TYPE.SOUL_MAXTIME);
const conftime = LocalDataMgr.Confidante.getProp(CONFIDANTE_TYPE.御器爆发);
const alltimes = (SOUL_PARAMS.CRIT_DURATION + talenttime) * (1 + conftime * 0.01);
this.critEnd = DateDataProxy.Ins.seconds + alltimes;
this.critMsEnd = this.critEnd * 1000;
talenttime > 0 && UIMgr.Ins.ShowTipsUI(`天赋爆发,额外+${talenttime}秒`);
conftime > 0 && UIMgr.Ins.ShowTipsUI(`经脉爆发,额外+${conftime}%秒`);
MesMgr.event(EGlobalEvent.CHANGE_SOUL);
}
checkCrit() {
if (DateDataProxy.Ins.msSeconds > this.critMsEnd) {
this.crit = false;
MesMgr.event(EGlobalEvent.CHANGE_SOUL);
}
}
// 返回爆发时的剩余时间(毫秒)
public get critleftMs(): number {
return this.crit? Math.max(0, this.critMsEnd - DateDataProxy.Ins.msSeconds) : 0;
}
public get unlock(): boolean {
return this._GameData.unlock;
}
public set unlock(value: boolean) {
this._GameData.unlock = value;
}
public get level(): number {
return this._GameData.level;
}
public set level(value: number) {
this._GameData.level = value;
}
public get exp(): number {
return this._GameData.exp;
}
public set exp(value: number) {
if(this.level < SOUL_PARAMS.MAX_LEVEL){
// 缓存神器数据,避免重复调用
// const shenqi = Tianjige_Data.Instance.get_shenqi(801);
// if (shenqi && shenqi.isOwned) {
// value *= 1 + shenqi.effect_y / 100;
// }
if (value > this.nextExp) {
value -= this.nextExp;
this.level++;
}
this._GameData.exp = value;
}
}
public get nextExp() {
return Math.floor(300 * Math.pow(this.level + 1.01, 3) + 2966);
}
public get attackSpeed(): number {
let Num = this.crit ? SOUL_PARAMS.CRIT_SPEED : SOUL_PARAMS.SPEED + this._GameData.level * SOUL_PARAMS.SPEED_ADD;
Num += LocalDataMgr.Treasure.getProp1(TREASURE_TYPE.SPEED);
return Math.min(SOUL_PARAMS.MAX_SPEED, Num);
//return Num += app.service.game.model.cabinet.getProp1(r.SPEED), Math.min(SOUL_PARAMS.MAX_SPEED, Num);
}
public get attackInterval(): number {
return 1 / this.attackSpeed;
}
}