ShakeModel.ts 4.14 KB
import BaseModel from "./BaseModel";
import DateUtils from "../../uitl/DateUtils";
import Util, { DataKey } from "../../uitl/Util";
import ObjectInstance from "../../uitl/ObjectInstance";
import AppSdk from "../AppSdk";

/**
 * 
 */
export default class ShakeModel extends BaseModel {

    private conf: any;
    private eleProbabilityArr: number[] = [];
    private totalWeight: number = 0;
    private proArrLen: number = 0;
    /**红包出现的总次数每日 */
    private red_day_limit: number = 0;
    private cur_red_day_limit: number = 0;
    /**摇一摇出现的总次数 */
    private shake_day_limit: number = 0;

    private cur_shake_day_limit: number = 0;

    async init() {
        let result = AppSdk.I.gameConfig;;
        console.log('---------------ShakeModel-- 获取摇一摇静态表-----' + JSON.stringify(result))
        if (result['config']) {
            let gameData = result['config'];
            this.update(this.initData(gameData));
        }
    }

    initData(gameData) {
        let data = new ShakeData;
        let lastTime = Util.I.getItem(DataKey.shakeLastTime) || '0';
        let lt = parseInt(lastTime);
        let last = DateUtils.timeDay(lt);
        let today = DateUtils.today;

        if (last != today) {
            this.cur_shake_day_limit = 0;
            this.cur_red_day_limit = 0;
            lastTime = DateUtils.nowTime.toString();
            Util.I.setItem(DataKey.cur_shake_day_limit, 0);
            Util.I.setItem(DataKey.cur_red_day_limit, 0);
            Util.I.setItem(DataKey.shakeLastTime, lastTime);

        } else {
            let cur_red_day_limit = Util.I.getItem(DataKey.cur_red_day_limit) || '0';
            this.cur_red_day_limit = parseInt(cur_red_day_limit);
            let cur_shake_day_limit = Util.I.getItem(DataKey.cur_shake_day_limit) || '0';
            this.cur_shake_day_limit = parseInt(cur_shake_day_limit);
        }

        data.config = gameData['config'];
        gameData['shake'].forEach(ele => {
            data.shakeWeightList.push(ele);
        });
        this.conf = [];
        this.conf = data.shakeWeightList;
        this.initProbability();
        this.shake_day_limit = data.config.shake_day_limit;
        this.red_day_limit = data.config.red_day_limit;
        return data;
    }

    initProbability() {
        this.totalWeight = 0;
        this.conf.forEach((ele, index) => {
            this.totalWeight += ele.weight;
            let itemW = ele.weight;
            if (index > 0)
                itemW += this.eleProbabilityArr[index - 1];
            this.eleProbabilityArr = [...this.eleProbabilityArr, itemW];
        })
        this.proArrLen = this.eleProbabilityArr.length;

    }

    getShakeType() {
        ++this.cur_shake_day_limit;
        Util.I.setItem(DataKey.cur_shake_day_limit, this.cur_shake_day_limit);

        if (this.cur_shake_day_limit > this.shake_day_limit) {
            /**'次数达到上限,请明天再来*/

            /**在此处可以弹框等处理 */
            return false;
        }
        let ran = Math.floor(Math.random() * this.totalWeight);
        for (let index = 0; index < this.proArrLen; index++) {
            const ele = this.eleProbabilityArr[index];
            if (ele >= ran) {
                if (0 === index || 1 === index) {
                    ++this.cur_red_day_limit;
                    Util.I.setItem(DataKey.cur_red_day_limit, this.cur_red_day_limit);
                    if (this.cur_red_day_limit > this.red_day_limit) {
                        return this.conf[this.proArrLen - 1];

                    }
                }
                return this.conf[index];
            }
        }
        return this.conf[this.proArrLen - 1];
    }

    get data(): ShakeData {
        return this._data;
    }

    static get I(): ShakeModel {
        return ObjectInstance.get(ShakeModel) as ShakeModel;
    }
}


class ShakeData {
    config: ShakeConfig;
    shakeWeightList: ShakeWeightData[] = [];
}
interface ShakeConfig {
    red_day_limit: number,
    shake_day_limit: number,
    interstitial_cnt: number,
    interstitial_delay: number
}

interface ShakeWeightData {
    id: number;
    type: number;
    weight: number;
    num: number;
}