Example #1
0
    def tick(self, global_time=None):
        # if self.player1.victorious is not None or self.player2.victorious is not None:
        #     return

        if self.tick_count < self.turn_time:
            if self.global_time != global_time:
                self.tick_count += 1
                self.player1.tick += 1
                self.player2.tick += 1
                message = {"t": "Tick", "v": {"t": self.tick_count}}

                self.send(
                    "{}{}".format(normal_length(len(str(message))), message),
                    self.player1)
                self.send(
                    "{}{}".format(normal_length(len(str(message))), message),
                    self.player2)
                self.global_time = global_time

        else:
            self.tick_count = 0
            self.player1.tick = 0
            self.player2.tick = 0
            self.player1.ready = False
            self.player2.ready = False
            self.stat = 'turn_change'
Example #2
0
    def start(self):
        self.player1.party, self.player2.party = self.party_creator()

        message = {"t": "BattleData", "v": self.player1.party}
        message = json.dumps(message)

        self.send("{}{}".format(normal_length(len(str(message))), message),
                  self.player1)

        if not self.player2.is_bot:
            message = {"t": "BattleData", "v": self.player2.party}
            message = json.dumps(message)
            self.send("{}{}".format(normal_length(len(str(message))), message),
                      self.player2)

        battle_start_data = {
            "player_1_username": self.player1.player_client.user.username,
            "player_1_bot": self.player1.is_bot,
            "player_2_username": self.player2.player_client.user.username,
            "player_2_bot": self.player2.is_bot,
            "params": {
                "player_1": self.player1.party,
                "player_2": self.player2.party
            },
            "battle_id": self.id
        }

        create_battle_log.delay(**battle_start_data)

        result = {
            "battle_id": self.id,
            "state": "start",
            "params": {
                "player_1": self.player1.party,
                "player_2": self.player2.party
            }
        }

        if settings.ACTIVE_LOG:
            battle_log.delay(**result)
Example #3
0
    def clientConnectionLost(self, client):
        if client in clients:
            clients.remove(client)

        if not client.battle.battle_end:
            if client.user.username == client.battle.player1.player_client.user.username:
                winner = client.battle.player2
                loser = client.battle.player1

            else:
                winner = client.battle.player1
                loser = client.battle.player2

            winner.victorious = True
            loser.victorious = False

            if not winner.is_bot:
                winner_profile = ProfileUpdateViewer(winner)
                winner_data = winner_profile.generate()
                chest = CtmChestGenerate(winner.player_client.user)
                chest = chest.generate_chest()
                winner_message = {
                    "t": "BattleResult",
                    "v": {
                        "victorious": str(winner.victorious),
                        "reward": {
                            "coin": winner_data['coin'],
                            "trophy": winner_data['trophy']
                        },
                        "cooldown_data": [],
                        "connection_lost": "True"
                    }
                }

                if chest is not None:
                    winner_message['v']['reward']['chest_info'] = chest

                winner_message = str(winner_message).replace("u'", '"')
                client.battle.send("{}{}".format(normal_length(len(str(winner_message))), winner_message), winner)
                winner.player_client.transport.loseConnection()

            loser_profile = ProfileUpdateViewer(loser)
            loser_data = loser_profile.generate()
Example #4
0
    def check_end_battle(self):

        if self.player1.party['party'][0]['troop'][0]['health'] <= 0 \
                or self.player1.party['party'][0]['troop'][-1]['health'] <= 0:
            winner = self.player2
            loser = self.player1

        elif self.player1.party['party'][1]['troop'][0]['health'] <= 0 \
                or self.player1.party['party'][1]['troop'][-1]['health'] <= 0:

            winner = self.player1
            loser = self.player2

        else:
            return False

        winner.victorious = True
        loser.victorious = False
        self.battle_end = True
        if winner.player_client in clients:
            clients.remove(winner.player_client)

        if loser.player_client in clients:
            clients.remove(loser.player_client)

        if not winner.is_bot:
            profile_log(winner, 'win')
            winner_profile = ProfileUpdateViewer(winner)
            winner_data = winner_profile.generate()
            troop_record(winner.troops)

            chest = CtmChestGenerate(winner.player_client.user)

            print "winner playoff:", winner.is_playoff
            if winner.is_playoff:
                playoff_log(winner.player_client.user, 'win')

            winner_league_type = winner_profile.join_to_league()

            cool_down_troop_lst = cool_down_troop(winner)

            winner_message = {
                "t": "BattleResult",
                "v": {
                    "victorious": str(winner.victorious),
                    "reward": {
                        "coin":
                        winner_data['coin'],
                        "trophy":
                        0 if winner_league_type == 'promoted' else
                        winner_data['trophy']
                    },
                    "cooldown_data": cool_down_troop_lst,
                    "connection_lost": "False"
                }
            }
            chest = chest.generate_chest()

            if chest is not None:
                winner_message['v']['reward']['chest_info'] = chest

            winner_message = str(winner_message).replace("u'", '"')
            self.send(
                "{}{}".format(normal_length(len(str(winner_message))),
                              winner_message), winner)

        if not loser.is_bot:
            profile_log(loser, 'lose')
            loser_profile = ProfileUpdateViewer(loser)
            loser_data = loser_profile.generate()
            troop_record(loser.troops, type_fight='loser')

            print "loser playoff:", loser.is_playoff
            if loser.is_playoff:
                playoff_log(loser.player_client.user, 'lose')

            loser_profile.join_to_league()

            loser_message = {
                "t": "BattleResult",
                "v": {
                    "victorious": str(loser.victorious),
                    "reward": {
                        "coin": 0,
                        "trophy": loser_data['trophy'],
                    },
                    "cooldown_data": cool_down_troop(loser)
                }
            }

            loser_message = str(loser_message).replace("u'", '"')
            self.send(
                "{}{}".format(normal_length(len(str(loser_message))),
                              loser_message), loser)

        if settings.ACTIVE_LOG:
            end_battle_log.delay(self.id)

        if not winner.is_bot:
            winner.player_client.transport.loseConnection()

        if not loser.is_bot:
            loser.player_client.transport.loseConnection()
Example #5
0
    def action(self, player, spell, target):
        spell_key, spell_value = self.find(spell,
                                           self.active_turn["eligible_spells"],
                                           'index')
        self.tick_count = 0
        self.player1.tick = 0
        self.player2.tick = 0
        self.player1.ready = False
        self.player2.ready = False
        print "player:", player, "active_turn:", self.active_turn[
            'player'].player_client
        if (player == self.active_turn['player'].player_client
                and spell_key) or self.player2.is_bot:
            troops = self.active_turn['enemy'].party['party'][0]['troop'] + \
                     self.active_turn['enemy'].party['party'][1]['troop']
            troop_key, troop_value = self.find(target, troops, 'id')

            if troop_key:
                if player.battle.player1.player_client.user.username == player.user.username:
                    selected_player = player.battle.player1
                    enemy = player.battle.player2

                else:
                    selected_player = player.battle.player2
                    enemy = player.battle.player1

                owner_troops = self.active_turn['player'].party['party'][0][
                    'troop']
                owner_troop_key, owner_value = self.find(
                    self.active_turn['turn_id'], owner_troops, 'id')

                selected_spell = Factory().create(owner_value, spell_value,
                                                  troop_value, selected_player,
                                                  enemy)
                message = selected_spell.run()

                self.send(
                    "{}{}".format(normal_length(len(str(message))), message),
                    self.player1)
                self.send(
                    "{}{}".format(normal_length(len(str(message))), message),
                    self.player2)

            else:
                message = {
                    "t": "Error",
                    "v": {
                        'error_code': 600,
                        "msg": "data invalid!!!"
                    }
                }
                message = "{}{}".format(normal_length(len(str(message))),
                                        message)
                self.player1.player_client.transport.write(message)

                if not self.player2.is_bot:
                    self.player2.player_client.transport.write(message)

        else:
            message = {
                "t": "Error",
                "v": {
                    'error_code': 600,
                    "msg": "data invalid!!!"
                }
            }
            message = "{}{}".format(normal_length(len(str(message))), message)

            self.player1.player_client.transport.write(message)

            if not self.player2.is_bot:
                self.player2.player_client.transport.write(message)

        result = {"battle_id": self.id, "state": "action", "params": message}

        if settings.ACTIVE_LOG:
            battle_log.delay(**result)

        self.check_end_battle()
        self.stat = 'turn_change'
Example #6
0
    def turn_change(self):
        if self.player1.victorious is not None or self.player2.victorious is not None:
            return

        player, enemy, result = self.valid_turn()

        lst_status_update_data = []
        lst_index_delete = []
        lst_spells = player.player_client.battle.live_spells
        for i in range(0, len(lst_spells)):
            troop = self.find_troop(lst_spells[i])

            if lst_spells[i]['player'] != player.player_client.user.username \
                    and lst_spells[i]['turn_type'] == 'enemy_turn':

                if lst_spells[i]['turn_count'] > 0:
                    lst_spells[i]['turn_count'] = int(
                        lst_spells[i]['turn_count']) - 1

                else:
                    remove_flag = BattleFlags.Taunt.value

                    lst_status_update_data.append(
                        self.live_spell_stat(
                            spell=lst_spells[i],
                            stat_change_type=SpellSingleStatChangeType.
                            curFlagValChange,
                            remove_flag=remove_flag))

                    lst_index_delete.append(i)

            else:
                if lst_spells[i]['action'] in ['burn', 'poison']:

                    if troop['shield'] > 0:
                        troop['shield'] -= 0 if lst_spells[i][
                            'damage'] is None else int(lst_spells[i]['damage'])

                        lst_status_update_data.append(
                            self.live_spell_stat(
                                spell=lst_spells[i],
                                damage=0 if lst_spells[i]['damage'] is None
                                else int(lst_spells[i]['damage']),
                                stat_change_type=SpellSingleStatChangeType.
                                curShieldValChange))

                    else:
                        if troop['health'] > 0:
                            troop['health'] -= 0 if lst_spells[i][
                                'damage'] is None else lst_spells[i]['damage']
                            if troop['health'] < 0:
                                troop['health'] = 0
                                if i not in lst_index_delete:
                                    lst_index_delete.append(i)

                            lst_status_update_data.append(
                                self.live_spell_stat(
                                    spell=lst_spells[i],
                                    damage=lst_spells[i]['damage'],
                                    stat_change_type=SpellSingleStatChangeType.
                                    curHpValChange))

                    lst_spells[i]['turn_count'] = int(
                        lst_spells[i]['turn_count']) - 1

                    if lst_spells[i]['turn_count'] == 0:
                        if lst_spells[i][
                                'action'] == 'burn' and BattleFlags.Burn.value in troop[
                                    'flag']:
                            lst_spells[i]['troop'][0]['flag'].remove(
                                BattleFlags.Burn.value)

                            if BattleFlags.Burn.value in troop['flag']:
                                troop['flag'].remove(BattleFlags.Burn.value)

                        if lst_spells[i][
                                'action'] == 'poison' and BattleFlags.Poison.value in troop[
                                    'flag']:
                            lst_spells[i]['troop'][0]['flag'].remove(
                                BattleFlags.Poison.value)

                            if BattleFlags.Poison.value in troop['flag']:
                                troop['flag'].remove(BattleFlags.Poison.value)

                        if lst_spells[i][
                                'action'] == 'confuse' and BattleFlags.Confuse.value in troop[
                                    'flag']:
                            lst_spells[i]['troop'][0]['flag'].remove(
                                BattleFlags.Confuse.value)

                        if lst_spells[i]['action'] == 'damage_reduction' and \
                                BattleFlags.DamageReduction.value in troop['flag']:
                            lst_spells[i]['troop'][0]['flag'].remove(
                                BattleFlags.DamageReduction.value)

                        lst_status_update_data.append(
                            self.live_spell_stat(
                                spell=lst_spells[i],
                                stat_change_type=SpellSingleStatChangeType.
                                curFlagValChange))

                        if i not in lst_index_delete:
                            lst_index_delete.append(i)

            result, message = self.chakra_check()
            if result:
                self.lst_pre_fight.append(message)

            else:
                self.stat = 'tick'

        for i in range(0, len(lst_spells)):
            if i in lst_index_delete:
                try:
                    lst_spells.pop(i)

                except Exception as e:
                    print "error", e

        player, enemy, result = self.valid_turn()

        data = {
            "turn_id":
            self.turns_sequence[self.turn_pointer],
            "eligible_spells": [
                item['index'] for item in result['spell']
                if item['need_ap'] <= player.action_point
            ],
            "eligible_secrets": [],
            "cool_down_spells": [],
            "status_update_data":
            lst_status_update_data,
            "player":
            str(player.player_client.user.username).encode('utf-8'),
            "enemy":
            str(enemy.player_client.user.username).encode('utf-8')
        }

        self.active_turn = data.copy()
        self.active_turn['player'] = player
        self.active_turn['enemy'] = enemy
        self.active_turn['eligible_spells'] = result['spell']

        result = {"t": "TurnData", "v": data}

        if not player.is_bot:
            data['ap'] = [player.action_point, enemy.action_point]
            self.send("{}{}".format(normal_length(len(str(result))), result),
                      player)

        if not enemy.is_bot:
            data['ap'] = [enemy.action_point, player.action_point]
            self.send("{}{}".format(normal_length(len(str(result))), result),
                      enemy)

        print "turn_change___data:{},", data

        self.turn_pointer += 1
        self.turn_count += 1

        result = {"battle_id": self.id, "state": "turn_change", "params": data}

        if settings.ACTIVE_LOG:
            battle_log.delay(**result)

        self.check_end_battle()

        if len(self.lst_pre_fight) > 0:
            self.stat = "tick"
            action_list = []
            for action in self.lst_pre_fight:
                action_list.append(action)

            self.lst_pre_fight = []

            message = {"t": "FightAction", "v": {"f_acts": action_list}}
            self.send("{}{}".format(normal_length(len(str(message))), message),
                      player)
            self.send("{}{}".format(normal_length(len(str(message))), message),
                      enemy)
Example #7
0
    def dataReceived(self, data):
        try:
            clean_data = json.loads(data)
            print 'clean data:{}'.format(clean_data)

            if not self.user:
                user = get_user(clean_data['username'])

                if user in [client.user for client in clients]:
                    message = {
                      "t": "Error",
                      "v": {'error_code': 501, 'msg': 'user {} already exists with id:{}'.format(user.username, user.id)}
                    }
                    self.transport.write('{}{}'.format(normal_length(len(str(message))), str(message).replace("'", '"')))
                    return

                if user:
                    self.user = user
                    self.troops = clean_data['troops_id']

                else:
                    message = {
                        "t": "Error",
                        "v": {'error_code': 500, 'msg': 'user login failed'}
                    }
                    self.transport.write('{}{}'.format(normal_length(len(str(message))), str(message).replace("'", '"')))

            if not self.battle:
                battle_finder(self)
                return

            if not self.battle.player1.ready or not self.battle.player2.ready:
                if clean_data['user_ready']:
                    if self.battle.player1.player_client == self:
                        self.battle.player1.ready = True
                        if self.battle.player2.is_bot:
                            self.battle.player2.ready = True

                    if self.battle.player2.player_client == self:
                        self.battle.player2.ready = True
                        if self.battle.player1.is_bot:
                            self.battle.player1.ready = True

                    self.battle.user_ready()
                    return

            if clean_data['flag'] == "action":
                self.battle.action(self, clean_data['spell_index'], clean_data['target_id'])
                return

        except ValueError as e:
            message = {
                "t": "Error",
                "v": {'error_code': 400, 'msg': 'data invalid!!!{}'.format(e)}
            }
            self.transport.write('{}{}'.format(normal_length(len(str(message))), str(message).replace("'", '"')))
            print 'value error-{}'.format(e.message)

        except KeyError as e:
            message = {
                "t": "Error",
                "v": {'error_code': 401, 'msg': 'data invalid!!!{}'.format(e)}
            }
            self.transport.write('{}{}'.format(normal_length(len(str(message))), str(message).replace("'", "'")))
            print 'KeyError-{}'.format(e.message)

        except Exception as e:
            message = {
                "t": "Error",
                "v": {'error_code': 402, 'msg': 'data invalid!!!{}'.format(e)}
            }
            self.transport.write('{}{}'.format(normal_length(len(str(message))), str(message).replace("'", '"')))

            print 'Exception-{}'.format(e.message)
Example #8
0
    def dataReceived(self, data):
        # try:
        clean_data = json.loads(data)
        log.msg(clean_data)

        if not self.user:
            user = get_user(clean_data['username'])
            self.is_playoff = clean_data['is_playoff']

            if user in [client.user for client in clients]:
                message = {
                    "t": "Error",
                    "v": {
                        'error_code':
                        501,
                        'msg':
                        'user {} already exists with id:{}'.format(
                            user.username, user.id)
                    }
                }
                self.transport.write('{}{}'.format(
                    normal_length(len(str(message))),
                    str(message).replace("'", '"')))
                return

            if user:
                self.user = user
                self.profile = get_profile(user.id)
                self.troops = clean_data['troops_id']

            else:
                message = {
                    "t": "Error",
                    "v": {
                        'error_code': 500,
                        'msg': 'user login failed'
                    }
                }
                self.transport.write('{}{}'.format(
                    normal_length(len(str(message))),
                    str(message).replace("'", '"')))

        if not self.battle:
            battle_finder(self)
            return

        if not self.battle.player1.ready or not self.battle.player2.ready:
            if clean_data['user_ready']:
                if self.battle.player1.player_client == self:
                    self.battle.player1.ready = True
                    if self.battle.player2.is_bot:
                        self.battle.player2.ready = True

                if self.battle.player2.player_client == self:
                    self.battle.player2.ready = True
                    if self.battle.player1.is_bot:
                        self.battle.player1.ready = True

                self.battle.user_ready()
                return

        if clean_data['flag'] == "action":
            self.battle.action(self, clean_data['spell_index'],
                               clean_data['target_id'])
            return
Example #9
0
    def clientConnectionLost(self, client):
        if client in clients:
            clients.remove(client)

        if client.battle and not client.battle.battle_end:
            if client.user.username == client.battle.player1.player_client.user.username:
                winner = client.battle.player2
                loser = client.battle.player1

            else:
                winner = client.battle.player1
                loser = client.battle.player2

            winner.victorious = True
            loser.victorious = False

            if not winner.is_bot:
                winner_profile = ProfileUpdateViewer(winner)
                winner_data = winner_profile.generate()
                chest = CtmChestGenerate(winner.player_client.user)
                chest = chest.generate_chest()
                troop_record(winner.troops)
                profile_log(winner, 'win')

                if winner.is_playoff:
                    playoff_log(winner.player_client.user, 'win')

                winner_profile.join_to_league()

                winner_message = {
                    "t": "BattleResult",
                    "v": {
                        "victorious": str(winner.victorious),
                        "reward": {
                            "coin": winner_data['coin'],
                            "trophy": winner_data['trophy']
                        },
                        "cooldown_data": cool_down_troop(winner),
                        "connection_lost": "True"
                    }
                }

                if chest is not None:
                    winner_message['v']['reward']['chest_info'] = chest

                winner_message = str(winner_message).replace("u'", '"')
                client.battle.send(
                    "{}{}".format(normal_length(len(str(winner_message))),
                                  winner_message), winner)
                winner.player_client.transport.loseConnection()

            # loser_profile = ProfileUpdateViewer(loser)
            # loser_data = loser_profile.generate()

            if not loser.is_bot:
                profile_log(loser)
                loser_cooldown = cool_down_troop(loser)
                troop_record(loser.troops, type_fight='loser')

                if loser.is_playoff:
                    playoff_log(loser.player_client.user, 'lose')

                loser_profile = ProfileUpdateViewer(loser)
                loser_data = loser_profile.generate()
                loser_profile.join_to_league()

            if settings.ACTIVE_LOG:
                end_battle_log.delay(client.battle.id)