Beispiel #1
0
    def select(self, rand=None, rate_max=10000):
        """選別.
        """
        if self.__rate_total < 1:
            return None
        elif rand is None or type(rand) == int:
            rand = AppRandom()

        v = rand.getIntN(self.__rate_total)
        for data in self.__data_list:
            v -= data.rate
            if v < 1:
                return data
        return None
Beispiel #2
0
 def select(self, rand=None):
     if not self.can_select():
         return None
     elif rand is None:
         rand = AppRandom()
     table = (
         (Defines.TreasureType.GOLD, self.__scoutmaster.treasuregold),
         (Defines.TreasureType.SILVER, self.__scoutmaster.treasuresilver),
         (Defines.TreasureType.BRONZE, self.__scoutmaster.treasurebronze),
     )
     v = rand.getIntN(self.__rate_total)
     for treasure_type, rate in table:
         if 0 < rate and v < rate:
             return treasure_type
         v -= rate
     return None
    def handle(self, *args, **options):

        print '======================================='
        print 'Generate cabaret club user ranking data'
        print '======================================='

        players = Player.fetchValues(using=settings.DB_READONLY)
        rand = AppRandom()
        redisdb = RedisModel.getDB()
        pipe = redisdb.pipeline()
        for player in players:
            sales = rand.getIntN(10000)
            CabaClubRanking.create("currentweek", player.id, sales).save(pipe)
            CabaClubRanking.create("lastweek", player.id,
                                   max(100, sales - 1500)).save(pipe)

        pipe.execute()

        print '================================'
        print 'all done...'
Beispiel #4
0
class ScoutEventExec:

    CONTINUITY_MAX = 10

    def __init__(self,
                 player,
                 progressdata,
                 seed,
                 master,
                 nextlevelexp,
                 cardnum=0,
                 do_happening=True,
                 happnings=None,
                 is_lovetime=False,
                 title=None,
                 is_full=None):
        self.ap = player.get_ap()
        self.apmax = player.get_ap_max()
        self.exp = player.exp
        self.result = []
        self.eventlist = []
        self.rand = AppRandom(seed=seed)
        self.happeningselector = None
        self.treasureselector = None
        self.is_cleared = master.stage == progressdata.cleared
        if self.is_cleared and master.stage != progressdata.stage:
            resultlist = progressdata.result.get('result', [])
            if resultlist:
                self.progress = resultlist[-1]['progress']
            else:
                self.progress = master.execution
        else:
            self.progress = progressdata.progress
        self.master = master
        self.nextlevelexp = nextlevelexp
        self.__exec_cnt = 0
        self.__progressdata = progressdata

        self.__eventrate_drop = 1
        self.__eventrate_happening = 0
        self.__eventrate_treasure = 0
        self.__eventrate_gachapt = 0
        self.__eventrate_drop = master.eventrate_drop
        self.__eventrate_gachapt = getattr(master, 'eventrate_gachapt', 0)
        if do_happening:
            if is_full:
                self.__eventrate_happening = master.eventrate_happening_full
            else:
                self.__eventrate_happening = master.eventrate_happening
            self.happeningselector = ScoutHappeningSelector(
                player, master, happnings)

        self.treasureselector = ScoutTreasureSelector(master)
        if self.treasureselector.can_select():
            if is_full:
                self.__eventrate_treasure = master.eventrate_treasure_full
            else:
                self.__eventrate_treasure = master.eventrate_treasure
        self.itemselector = ScoutDropItemSelector(player, master, cardnum)

        self.__eventpointmin = getattr(master, 'eventpointmin', 0)
        self.__eventpointmax = getattr(master, 'eventpointmax', 0)
        self.__eventrate_lt_star = getattr(master, 'eventrate_lt_star',
                                           0) if not is_lovetime else 0

        eventrate_total = self.__eventrate_drop
        eventrate_total += self.__eventrate_happening
        eventrate_total += self.__eventrate_treasure
        eventrate_total += self.__eventrate_gachapt
        eventrate_total += self.__eventrate_lt_star
        self.__eventrate_total = eventrate_total

        # 称号効果.
        if title:
            self.__title_effect_gold = title.gold_up
            self.__title_effect_exp = title.exp_up
        else:
            self.__title_effect_gold = 0
            self.__title_effect_exp = 0

        self.__player = player

    @property
    def is_end(self):
        return 0 < len(self.eventlist)

    @property
    def exec_cnt(self):
        return self.__exec_cnt

    def end(self):
        if not self.is_end:
            self.addEvent(Defines.ScoutEventType.NONE)

    @property
    def is_levelup(self):
        return self.nextlevelexp and self.nextlevelexp.exp <= self.exp

    def add_exp(self, exp):
        if self.nextlevelexp:
            self.exp += exp

    @property
    def nextexp(self):
        if self.nextlevelexp:
            return self.nextlevelexp.exp
        else:
            return self.exp

    def select_event(self):
        """イベント選択.
        """
        if self.__eventrate_total < 1:
            return None

        v = self.rand.getIntN(self.__eventrate_total)

        if 0 <= v < self.__eventrate_drop:
            # カードかアイテムがドロップ.
            data = self.itemselector.select(self.rand)
            if data:
                # 何か発見.
                if data.itype == Defines.ItemType.CARD:
                    # カード獲得.
                    return ScoutEventGetCard.create(data.mid,
                                                    silhouette=data.silhouette,
                                                    heart=data.heart)
                elif data.itype == Defines.ItemType.ITEM:
                    # アイテム獲得.
                    return ScoutEventGetItem.create(data.mid)
            return None
        v -= self.__eventrate_drop

        if 0 <= v < self.__eventrate_gachapt:
            # イベントガチャポイント.
            point = self.rand.getIntS(self.master.gachaptmin,
                                      self.master.gachaptmax)
            return ScoutEventEventGacha.create(point)
        v -= self.__eventrate_gachapt

        if 0 <= v < self.__eventrate_happening:
            # ハプニング.
            happening = self.happeningselector.select(self.rand)
            if happening:
                return ScoutEventHappening.create(happening.mid)
            return None
        v -= self.__eventrate_happening

        if 0 <= v < self.__eventrate_treasure:
            # 宝箱発見.
            treasure_type = self.treasureselector.select(self.rand)
            if treasure_type is not None:
                return ScoutEventGetTreasure.create(treasure_type)
            return None
        v -= self.__eventrate_treasure

        if 0 <= v < self.__eventrate_lt_star:
            # 星.
            num = self.rand.getIntS(self.master.lovetime_star_min,
                                    self.master.lovetime_star_max)
            return ScoutEventLoveTimeStar.create(num)
        v -= self.__eventrate_lt_star

        return None

    def execute(self, apcost):
        if self.is_end:
            raise CabaretError(u'スカウト実行:終了済み')
        elif self.ap < apcost:
            self.addEvent(Defines.ScoutEventType.AP_NONE, self.master.id)
            self.end()
            return
        elif ScoutExec.CONTINUITY_MAX <= self.__exec_cnt:
            # 一度強制終了.
            self.end()
            return

        self.__exec_cnt += 1

        ap_pre = self.ap
        self.ap -= apcost

        gold_add = int(
            self.rand.getIntS(self.master.goldmin, self.master.goldmax) *
            (self.__title_effect_gold + 100) / 100)
        exp_add = int(self.master.exp * (self.__title_effect_exp + 100) / 100)

        # 設定期間中に経験値を指定倍率に上げる.
        if Defines.EXP_START_TIME <= OSAUtil.get_now() <= Defines.EXP_END_TIME:
            exp_add = int(exp_add * Defines.EXP_RATE_OVER)

        exp_pre = self.exp
        self.add_exp(exp_add)
        progress_pre = self.progress
        self.progress += 1

        # スカウトイベントポイント
        point_add = self.rand.getIntS(self.__eventpointmin,
                                      self.__eventpointmax)

        obj = ScoutEventExec.makeResultObject(self.__player.level, exp_pre,
                                              self.exp, exp_add, gold_add,
                                              ap_pre, self.ap, self.apmax,
                                              apcost, progress_pre,
                                              self.progress,
                                              self.master.execution, point_add)
        self.result.append(obj)

        # 3ポチ確認.
        eventflag = (self.progress % Defines.SCOUT_EVENT_RATE) == 0

        # レベルアップ.
        if self.is_levelup:
            self.addEvent(Defines.ScoutEventType.LEVELUP,
                          self.nextlevelexp.level)

        # クリア判定.
        if not self.is_cleared and self.master.execution <= self.progress:
            self.addEvent(Defines.ScoutEventType.COMPLETE, self.master.id)
        elif not self.is_end and eventflag:
            event = self.select_event()
            if event:
                self.addEvent(event)
            else:
                self.end()

    def addEvent(self, event, *args):
        if not isinstance(event, ScoutEventData):
            eventtype = event
            data_cls = get_class_by_type(eventtype)
            event = data_cls.create(*args)
        self.eventlist.append(event)

    @staticmethod
    def makeResultObject(level, exp_pre, exp_post, exp_add, gold_add, ap_pre,
                         ap_post, ap_max, ap_cost, progress_pre, progress_post,
                         execution, point_add):
        exp_add = exp_post - exp_pre

        return {
            'level': level,
            'exp_pre': exp_pre,
            'exp_post': exp_post,
            'exp_add': exp_add,
            'gold_add': gold_add,
            'ap_pre': ap_pre,
            'ap_post': ap_post,
            'ap_max': ap_max,
            'apcost': ap_cost,
            'progress_pre': progress_pre,
            'progress': progress_post,
            'execution': execution,
            'point_add': point_add,
        }

    def cancelEvent(self):
        # これやだなぁ..
        self.eventlist = []
        self.end()

    def aggregatePrizes(self):
        exp_total = 0
        gold_total = 0
        point_total = 0
        for result in self.result:
            exp_total += result['exp_add']
            gold_total += result['gold_add']
            point_total += result['point_add']
        prize = {
            'gold': gold_total,
            'exp': exp_total,
            'point': point_total,
        }
        for event in self.eventlist:
            prize[Defines.ScoutEventType.ENG_NAMES[event.get_type()]] = event
        return prize
Beispiel #5
0
    def __testGacha(self, gachamaster, cnt):
        """ガチャをテスト実行.
        """
        model_mgr = self.getModelMgr()

        test_playdata = GachaPlayData.makeInstance(
            GachaPlayData.makeID(0, gachamaster.boxid))

        # BOX.
        box = GachaBox(gachamaster, test_playdata)
        groupidlist = box.get_group_id_list()
        groupdict = dict([
            (groupmaster.id, GachaBoxGroup(groupmaster))
            for groupmaster in BackendApi.get_gachagroupmaster_list(
                model_mgr, groupidlist, using=backup_db)
        ])

        # 設定値.
        group_rate_dict = {}
        cardrate_dict = {}
        cardgroup_dict = {}
        for groupid in groupidlist:
            rate = box.get_group_rate(groupid)
            group_rate_dict[groupid] = group_rate_dict.get(groupid, 0) + rate

            group_cardrate_dict = {}
            group = groupdict[groupid]
            for carddata in group.carddata_list:
                cardid = carddata.card
                group_cardrate_dict[cardid] = group_cardrate_dict.get(
                    cardid, 0) + carddata.rate

                arr = cardgroup_dict[cardid] = cardgroup_dict.get(cardid) or []
                arr.append(groupid)

            cardrate_dict[groupid] = group_cardrate_dict

        # ランダム.
        rand = AppRandom()

        #        result_list = []
        distribution_dict = dict.fromkeys(cardgroup_dict.keys(), 0)
        group_distribution_dict = dict.fromkeys(groupdict.keys(), 0)

        def addResult(cardid, point, groupid):
            #            result_list.append((cardid, point, groupid))
            distribution_dict[cardid] = (distribution_dict.get(cardid)
                                         or 0) + 1
            group_distribution_dict[groupid] = (
                group_distribution_dict.get(groupid) or 0) + 1

        # ランキングガチャ用ポイント獲得関数.
        point_getter = lambda x: 0
        if gachamaster.consumetype == Defines.GachaConsumeType.RANKING:
            rankinggachamaster = BackendApi.get_rankinggacha_master(
                model_mgr, gachamaster.boxid, using=backup_db)
            if rankinggachamaster:
                randmax = rankinggachamaster.randmax
                randmin = rankinggachamaster.randmin
                point_getter = lambda x: x.point * (100 + rand.getIntN(
                    randmin + randmax) - randmin) / 100

        # BOXからグループを選択.
        groupidlist = []
        for _ in xrange(cnt):
            if box.is_empty:
                # 空になったのでリセット.
                test_playdata.resetGroupCounts()
                box = GachaBox(gachamaster, test_playdata)
            groupid, _ = box.select(rand)
            group = groupdict[groupid]
            carddata = group.select_obj(rand)
            addResult(carddata.card, point_getter(carddata), groupid)


#        self.html_param['result_list'] = result_list
        self.html_param['distribution_dict'] = distribution_dict
        self.html_param['group_dict'] = groupdict
        self.html_param['group_distribution_dict'] = group_distribution_dict
        self.html_param['group_rate_dict'] = group_rate_dict
        self.html_param['group_rate_total'] = sum(group_rate_dict.values())
        self.html_param['cardrate_dict'] = cardrate_dict
        self.html_param['cardgroup_dict'] = cardgroup_dict

        cardmaster_idlist = distribution_dict.keys()
        cardmaster_dict = BackendApi.get_cardmasters(cardmaster_idlist,
                                                     model_mgr,
                                                     using=backup_db)
        self.html_param['cardmaster_dict'] = cardmaster_dict