Пример #1
0
def DoGroupFight(actors, maxtir_a, deffeners, maxtir_b):
    '''进行战斗
    @param actors: []角色实例列表
    @param maxtir_a: {}角色阵法信息 key:角色id,value:阵法位置
    @param deffeners: []怪物实例列表
    @param maxtir_b: {}怪物真发信息 key:怪物动态id,value:阵法位置
    '''
    challengers = BattleSide(actors, matrixType=1, matrixSetting=maxtir_a)
    defenders = BattleSide(deffeners, matrixType=1, matrixSetting=maxtir_b)
    fight = Fight(challengers, defenders, 550)
    fight.DoFight()
    return fight
Пример #2
0
    def doZhangJie(self,zhangjieid):
        '''章节战斗
        @param zhangjieid: int 章节的
        '''
        if zhangjieid>self.currentZJ:
            return {'result':False,'message':u'当前章节未被激活'}
        from app.scense.core.fight.fight_new import Fight
        zhanjieInfo = db_zhanyi.ALL_ZHANGJIE_INFO.get(self.currentZJ)
        levelrequired = zhanjieInfo.get('levelrequired')
        if self._owner.level.getLevel()<levelrequired:
            return {'result':False,'message':u'当前等级不足'}
        ruleInfo = eval(zhanjieInfo.get('mconfig'))
        temlist,rule = ruleInfo[0],ruleInfo[1]
        i = 100
        challengers = BattleSide([self._owner])
        deffen = []
        for tem in temlist:
            i+=1 
            monser = Monster(id = i,templateId = tem)
            deffen.append(monser)
        defenders = BattleSide(deffen,state = 0)
        defenders.setMatrixPositionBatch(rule)
        data = Fight( challengers, defenders, 600)
        data.DoFight()
        if data.battleResult == 1 and zhangjieid==self.currentZJ:#如果战斗胜利
#            self._owner.quest.cleanZhanYi(zhangjieid)#通知战役通关任务
            zhanyilist = ZYManage().zhanyiSet.keys()
            zhanyilist.sort()
            zy = ZYManage().getZhanYiInfoById(self.currentZY)
            zhangjielist = zy.zhangjieSet.keys()
            zhangjielist.sort()
            index = zhangjielist.index(self.currentZJ)
            if index>=len(zhangjielist)-1:
                zhanyiindex = zhanyilist.index(self.currentZY)
                if zhanyiindex<len(zhanyilist)-1:
                    zhanyiindex = zhanyilist.index(self.currentZY)
                    self.currentZY = zhanyilist[zhanyiindex+1]
                    zy = ZYManage().getZhanYiInfoById(self.currentZY)
                    zhangjielist = zy.zhangjieSet.keys()
                    zhangjielist.sort()
                    self.currentZJ = zhangjielist[0]
            else:
                self.currentZJ = zhangjielist[index+1]
        if data.battleResult == 1:
            self._owner.quest.cleanZhanYi(zhangjieid)#通知战役通关任务
        return {'result':True,'data':{'fight':data}}
 def climb(self):
     '''开始爬塔
     '''
     nowtime = datetime.datetime.now()
     if self.lasttime and minusDatetimeForSecond(nowtime,
                                                 self.lasttime) <= 30:
         return {'result': False, 'message': Lg().g(497)}
     self.lasttime = nowtime
     layer = self.nowLayers
     towerinfo = dbtower.ALL_TOWER_INFO.get(layer)
     if not towerinfo:
         return {'result': False, 'message': Lg().g(498)}
     monsterlist, eyes = towerinfo.get('rule', [[15001], [5]])
     matrixid = towerinfo.get('matrixid', 100001)
     deffen = []
     for index in range(len(monsterlist)):
         monster = Monster(id=1000 + index, templateId=monsterlist[index])
         deffen.append(monster)
     challengers = BattleSide([self._owner])
     defenders = BattleSide(deffen)
     defenders.setMatrixPositionBatch(eyes)
     fig = Fight(challengers, defenders, 550)
     fig.DoFight()
     bounds = {}
     if fig.battleResult == 1:  #胜利
         self.succedHandle()  #胜利后的处理
         bounds = self.doTowerBound(layer)  #进行胜利后的奖励处理
     else:  #失败后的处理
         pass
     msg = u''
     msglist = []
     exp = bounds.get('exp')
     item = bounds.get('item')
     bounds['name'] = self._owner.baseInfo.getName()
     if exp:
         msglist.append(Lg().g(499) + u':%d\n' % exp)
     if item:
         msglist.append(Lg().g(500) + u':%s' % item.baseInfo.getName())
     if msglist:
         msg = msg.join(msglist)
     else:
         msg = Lg().g(143)
     data = {'message': msg, 'fight': fig, 'bound': bounds}
     return {'result': True, 'data': data}
 def climb(self):
     '''开始爬塔
     '''
     nowtime = datetime.datetime.now()
     if self.lasttime and minusDatetimeForSecond(nowtime, self.lasttime)<=30:
         return {'result':False,'message':Lg().g(497)}
     self.lasttime = nowtime
     layer = self.nowLayers
     towerinfo = dbtower.ALL_TOWER_INFO.get(layer)
     if not towerinfo:
         return {'result':False,'message':Lg().g(498)}
     monsterlist,eyes = towerinfo.get('rule',[[15001],[5]])
     matrixid = towerinfo.get('matrixid',100001)
     deffen = []
     for index in range(len(monsterlist)):
         monster = Monster(id = 1000+index,templateId = monsterlist[index])
         deffen.append(monster)
     challengers = BattleSide([self._owner])
     defenders = BattleSide(deffen)
     defenders.setMatrixPositionBatch(eyes)
     fig = Fight( challengers, defenders, 550)
     fig.DoFight()
     bounds = {}
     if fig.battleResult == 1:#胜利
         self.succedHandle()#胜利后的处理
         bounds = self.doTowerBound(layer)#进行胜利后的奖励处理
     else:#失败后的处理
         pass
     msg = u''
     msglist = []
     exp = bounds.get('exp')
     item = bounds.get('item')
     bounds['name'] = self._owner.baseInfo.getName()
     if exp:
         msglist.append(Lg().g(499)+u':%d\n'%exp)
     if item:
         msglist.append(Lg().g(500)+u':%s'%item.baseInfo.getName())
     if msglist:
         msg = msg.join(msglist)
     else:
         msg = Lg().g(143)
     data = {'message':msg,'fight':fig,'bound':bounds}
     return {'result':True,'data':data}
Пример #5
0
def DoFight(
    actors,
    deffeners,
    now_X,
    preDict={
        'extVitper': 0,
        'extStrper': 0,
        'extDexper': 0,
        'extWisper': 0,
        'extSpiper': 0,
        'preVitper': 1,
        'preStrper': 1,
        'preDexper': 1,
        'preWisper': 1,
        'preSpiper': 1
    }):
    '''进行战斗'''
    challengers = BattleSide(actors)
    defenders = BattleSide(deffeners, preDict=preDict)
    fight = Fight(challengers, defenders, now_X)
    fight.DoFight()
    return fight
Пример #6
0
    def doRaids(self, rounds, raidsfamId):
        '''开始扫荡
        @param rounds: int 扫荡回合数
        @param raidsfamId: int 目标副本
        '''
        if raidsfamId not in self._owner.instance.clearances:
            return {'result': False, 'message': Lg().g(455)}
        from app.scense.core.instance.Instance import Instance
        if not rounds:
            rounds = self._owner.attribute.getEnergy() / 5
        energyrequired = rounds * 5
        if energyrequired > self._owner.attribute.getEnergy(
        ) or energyrequired == 0:
            msg = Lg().g(456)
            return {'result': False, 'message': msg}
#        if self._owner.baseInfo.getStatus()!=1:
#            msg = u"你正处于%s状态"%self._owner.baseInfo.getStatusName()
#            return {'result':False,'message':msg}
#        self._owner.baseInfo.setStatus(3)
        messagebox = []
        monsters = []
        instance = Instance(raidsfamId)
        for scene in instance._Scenes.values():
            for mon in scene._monsters.values():
                monsters.append(mon)
        challengers = BattleSide([self._owner])
        for index in range(rounds):
            self._owner.attribute.addEnergy(-5)  #消耗活力
            msg = Lg().g(457) % (index + 1)
            messagebox.append(msg)
            for monindex in range(len(monsters)):
                msg = self.doFightBound(challengers, monsters[monindex],
                                        monindex)
                #                self._owner.quest.killMonster(monsters[monindex].templateId)
                messagebox.append(msg)
            msg = self.doCardBound(instance)
            self._owner.quest.clearance(raidsfamId)
            self._owner.finance.updateAddMorale(2, state=True)
            messagebox.append(msg)
        self._owner.schedule.noticeSchedule(18)  #成功后的日程目标通知
        return {'result': True, 'message': u'', 'data': messagebox}
Пример #7
0
 def FightInScene(self,monsterId,now_X,playerId):
     '''副本战斗
     @param monsterId: int 怪物的id
     @param now_X: int 碰撞点的x坐标
     '''
     from app.scense.core.fight.fight_new import Fight
     if not self._monsters:
         return {'result':False,'message':u'不存在怪物实例'}
     fightInfo = {}
     fightType = 1
     sendList = self.getSendList()
     players = [PlayersManager().getPlayerByID(playerId) for playerId in self._playerlist]
     monster = self._monsters.get(monsterId,None)
     deffen = []
     if not monster:
         return {'result':False,'message':u'不存在怪物实例'}
     msgsendList = []
     for pp in players:#如果有抓宠技能则消耗相应的道具
         pp.skill.autoUnloadCatch()
         if pp.skill.checkHasEquipCatchSkill():
             level = pp.skill.getCatchPetLevel()
             itemTemplateID = pp.skill.CATCHCONSUME.get(level,0)
             msgsendList.append(pp.getDynamicId())
             if itemTemplateID:
                 pp.pack.delItemByTemplateId(itemTemplateID,1)
     
     if monster.formatInfo['difficulty']==5 and msgsendList:
         msg = Lg().g(574)
         pushPromptedMessage(msg, msgsendList)
     challengers = BattleSide(players)
     matrixId = monster.getMatrixId()
     ruleInfo = monster.getRule()
     if not ruleInfo:
         deffen.append(monster)
         defenders = BattleSide(deffen)
     else:
         temlist,rule = ruleInfo
         for tem in temlist:
             _monser = self.createMonster(tem)
             deffen.append(_monser)
         defenders = BattleSide(deffen,state = 0)
         defenders.setMatrixPositionBatch(rule)
     #获取战场中心位置
     realcenter = self._width/2
     data = Fight( challengers, defenders, realcenter)
     data.DoFight()
     
     #战后处理
     if data.battleResult == 1:
         self.dropMonster(monsterId)
     elif data.battleResult == 3:
         fightType = 3
         monster = self._monsters[monsterId]
         for player in self._playerlist:
             pl = PlayersManager().getPlayerByID(player)
             pl.baseInfo.initPosition(self.getInitPosition())
         monster.baseInfo.initPosition(monster.baseInfo.getStaticPosition())
     elif data.battleResult == 2:
         fightType = 2
         monster = self._monsters[monsterId]
         for player in self._playerlist:
             pl = PlayersManager().getPlayerByID(player)
             pl.baseInfo.initPosition(self.getInitPosition())
             self.pushFightFailHelp(pl)
         monster.baseInfo.initPosition(monster.baseInfo.getStaticPosition())
     if not self._monsters and self._type ==2:
         fightType = 4
         #print '通关副本'
     settlementData = []
     dropoutid = monster.formatInfo['dropoutid']
     for player in data.fighters.values():
         if player['characterType']==3:#宠物
             pet = PlayersManager().getPlayerByID(playerId).pet._pets.get(player['chaId'])
             pet.attribute.updateHp(int(player['chaCurrentHp']))#更新宠物的血量
             if data.battleResult == 1:
                 exp = monster.formatInfo.get('expbound',100)*len(deffen)
                 pet.level.addExp(exp)
             continue
         if player['characterType']==1:
             pp = PlayersManager().getPlayerByID(player['chaId'])
             if data.battleResult == 1:
                 dropoutIitem = dropout.getDropByid(dropoutid)
                 info = {}
                 info['id'] = player['chaId']
                 info['name'] = player['chaName']
                 info['profession'] = player['figureType']
                 info['expBonus'] = monster.formatInfo.get('expbound',100)*len(deffen)
                 info['coinBonus'] = 0
                 info['goldBonus'] = 0
                 info['itemsBonus'] = dropoutIitem#None#getDropByid(1)
                 info['popularity'] = 0
                 info['attackGoal'] = 0
                 info['defenseGoal'] = 0
                 info['slayGoal'] = 0
                 settlementData.append(info)
                 expEff = pp.attribute.getExpEff()#经验加成
                 pp.level.updateExp(pp.level.getExp()+info['expBonus']*expEff,state = 0)
                 pp.finance.updateCoin(pp.finance.getCoin()+info['coinBonus'],state = 0)
                 pp.finance.updateGold(pp.finance.getGold()+info['goldBonus'],state = 0)
                 if info['itemsBonus']:
                     pp.pack.putNewItemInPackage(info['itemsBonus'],state=0)
                 for monster in deffen:
                     pp.quest.killMonster(monster.templateId)
             pp.attribute.updateHp(int(player['chaCurrentHp']),state = 0)
             pp.effect.doEffectHot()#执行效果战后处理
         
     fightInfo['fightType'] = fightType
     fightInfo['battle'] = data
     fightInfo['sendList'] = sendList
     fightInfo['centerX'] = realcenter
     fightInfo['setData'] = settlementData
     fightInfo['centerY'] = HEIGHT
     
     return {'result':True,'data':fightInfo}
Пример #8
0
    def doFight(self):
        '''开始国战
        '''
        if not IsFightTime():
            thisRound = self.getRound()
            if thisRound == 0:
                self.ClearingFight()
            return
        RivalInfo = self.MatchRival()
        if not RivalInfo:
            reactor.callLater(30, self.doFight)
            return

        from app.scense.core.character.PlayerCharacter import PlayerCharacter
        from app.scense.core.fight.fight_new import Fight
        from app.scense.core.fight.battleSide import BattleSide
        from app.scense.netInterface import pushObjectNetInterface
        #        from app.scense.serverconfig.publicnode import publicnoderemote

        actor = RivalInfo['actor']
        defender = RivalInfo['defender']
        player = PlayerCharacter(actor['memberId'])
        player.attribute.Restoration()  #角色满状态
        toplayer = PlayerCharacter(defender['memberId'])
        toplayer.attribute.Restoration()  #角色满状态

        challengers = BattleSide([player])
        defenders = BattleSide([toplayer])
        data = Fight(challengers, defenders, 550)
        data.DoFight()
        battleResult = data.battleResult
        pplist = [actor['memberId'], defender['memberId']]
        if battleResult == 1:
            pId = player.baseInfo.getId()
            pname = player.baseInfo.getName()
            pcoin = player.level.getLevel() * 100
            pweiwang = 2
            tId = toplayer.baseInfo.getId()
            tname = toplayer.baseInfo.getName()
            tcoin = 1000
            tweiwang = 0
        else:
            pId = toplayer.baseInfo.getId()
            pname = toplayer.baseInfo.getName()
            pcoin = toplayer.level.getLevel() * 100
            pweiwang = 2
            tId = player.baseInfo.getId()
            tname = player.baseInfo.getName()
            tcoin = 1000
            tweiwang = 0
        #战后处理
        self.battleResultHandle(battleResult)
        #战斗奖励发放
        gm1 = 'player.finance.addCoin(%d);player.finance.addPrestige(%d);\
        player.guild.updateGuildBattleInfo(%d,%d,%d,%d)' % (pcoin, pweiwang, 1,
                                                            0, pcoin, pweiwang)
        gm2 = 'player.finance.addCoin(%d);\
        player.guild.updateGuildBattleInfo(%d,%d,%d,%d)' % (tcoin, 0, 1, tcoin,
                                                            0)
        #        publicnoderemote.callRemote("updateplayerInfo",pId,gm1)
        #        publicnoderemote.callRemote("updateplayerInfo",tId,gm2)
        #添加国战斗信息
        self.addBattleInfo(pId, pname, tId, tname, pcoin)
        #战斗消息推送处理
        msg = u'%s: %d金币   %d威望  \n%s: %d金币  %d威望' % (pname, pcoin, pweiwang,
                                                      tname, tcoin, tweiwang)
        zy = self.sceneId
        pushObjectNetInterface.getzudui_4308(data, pplist, msg, zy)
        reactor.callLater(30, self.doFight)
Пример #9
0
    def FightInScene(self, monsterId, now_X, playerId):
        '''副本战斗
        @param monsterId: int 怪物的id
        @param now_X: int 碰撞点的x坐标
        '''
        from app.scense.core.fight.fight_new import Fight
        if not self._monsters:
            return {'result': False, 'message': u'不存在怪物实例'}
        fightInfo = {}
        fightType = 1
        sendList = self.getSendList()
        players = [
            PlayersManager().getPlayerByID(playerId)
            for playerId in self._playerlist
        ]
        monster = self._monsters.get(monsterId, None)
        deffen = []
        if not monster:
            return {'result': False, 'message': u'不存在怪物实例'}
        msgsendList = []
        for pp in players:  #如果有抓宠技能则消耗相应的道具
            pp.skill.autoUnloadCatch()
            if pp.skill.checkHasEquipCatchSkill():
                level = pp.skill.getCatchPetLevel()
                itemTemplateID = pp.skill.CATCHCONSUME.get(level, 0)
                msgsendList.append(pp.getDynamicId())
                if itemTemplateID:
                    pp.pack.delItemByTemplateId(itemTemplateID, 1)

        if monster.formatInfo['difficulty'] == 5 and msgsendList:
            msg = Lg().g(574)
            pushPromptedMessage(msg, msgsendList)
        challengers = BattleSide(players)
        matrixId = monster.getMatrixId()
        ruleInfo = monster.getRule()
        if not ruleInfo:
            deffen.append(monster)
            defenders = BattleSide(deffen)
        else:
            temlist, rule = ruleInfo
            for tem in temlist:
                _monser = self.createMonster(tem)
                deffen.append(_monser)
            defenders = BattleSide(deffen, state=0)
            defenders.setMatrixPositionBatch(rule)
        #获取战场中心位置
        realcenter = self._width / 2
        data = Fight(challengers, defenders, realcenter)
        data.DoFight()

        #战后处理
        if data.battleResult == 1:
            self.dropMonster(monsterId)
        elif data.battleResult == 3:
            fightType = 3
            monster = self._monsters[monsterId]
            for player in self._playerlist:
                pl = PlayersManager().getPlayerByID(player)
                pl.baseInfo.initPosition(self.getInitPosition())
            monster.baseInfo.initPosition(monster.baseInfo.getStaticPosition())
        elif data.battleResult == 2:
            fightType = 2
            monster = self._monsters[monsterId]
            for player in self._playerlist:
                pl = PlayersManager().getPlayerByID(player)
                pl.baseInfo.initPosition(self.getInitPosition())
                self.pushFightFailHelp(pl)
            monster.baseInfo.initPosition(monster.baseInfo.getStaticPosition())
        if not self._monsters and self._type == 2:
            fightType = 4
            #print '通关副本'
        settlementData = []
        dropoutid = monster.formatInfo['dropoutid']
        for player in data.fighters.values():
            if player['characterType'] == 3:  #宠物
                pet = PlayersManager().getPlayerByID(playerId).pet._pets.get(
                    player['chaId'])
                pet.attribute.updateHp(int(player['chaCurrentHp']))  #更新宠物的血量
                if data.battleResult == 1:
                    exp = monster.formatInfo.get('expbound', 100) * len(deffen)
                    pet.level.addExp(exp)
                continue
            if player['characterType'] == 1:
                pp = PlayersManager().getPlayerByID(player['chaId'])
                if data.battleResult == 1:
                    dropoutIitem = dropout.getDropByid(dropoutid)
                    info = {}
                    info['id'] = player['chaId']
                    info['name'] = player['chaName']
                    info['profession'] = player['figureType']
                    info['expBonus'] = monster.formatInfo.get(
                        'expbound', 100) * len(deffen)
                    info['coinBonus'] = 0
                    info['goldBonus'] = 0
                    info['itemsBonus'] = dropoutIitem  #None#getDropByid(1)
                    info['popularity'] = 0
                    info['attackGoal'] = 0
                    info['defenseGoal'] = 0
                    info['slayGoal'] = 0
                    settlementData.append(info)
                    expEff = pp.attribute.getExpEff()  #经验加成
                    pp.level.updateExp(pp.level.getExp() +
                                       info['expBonus'] * expEff,
                                       state=0)
                    pp.finance.updateCoin(pp.finance.getCoin() +
                                          info['coinBonus'],
                                          state=0)
                    pp.finance.updateGold(pp.finance.getGold() +
                                          info['goldBonus'],
                                          state=0)
                    if info['itemsBonus']:
                        pp.pack.putNewItemInPackage(info['itemsBonus'],
                                                    state=0)
                    for monster in deffen:
                        pp.quest.killMonster(monster.templateId)
                pp.attribute.updateHp(int(player['chaCurrentHp']), state=0)
                pp.effect.doEffectHot()  #执行效果战后处理

        fightInfo['fightType'] = fightType
        fightInfo['battle'] = data
        fightInfo['sendList'] = sendList
        fightInfo['centerX'] = realcenter
        fightInfo['setData'] = settlementData
        fightInfo['centerY'] = HEIGHT

        return {'result': True, 'data': fightInfo}