def grep_users(self): '''匹配用户,生成战斗对象。''' while self._arena_started: #竞技场开放 try: gevent.sleep(0) #避免hog cpu,切换协程。 typ = random.choice([1, 2, 3]) #三种类型房间中,随机选一个。 #如果房间人数小于(2 * 类型),人数不足。 if len(self._arena_members[typ]) < 2 * typ: continue all_fighters = self.choice_users(typ) #匹配结果 if all_fighters == False: #匹配失败 continue except Exception, e: print str(e) print '程序运行错误' else: #生成战斗对象 print '所有参加战斗的人', all_fighters print '生成一场战斗%s vs %s' % (str( all_fighters[0:typ]), str(all_fighters[typ:])) print '战斗类型是', typ, 'vs', typ ArmyInfo = {} UserInfo = {} PosId = 1 for ind, pair in enumerate(all_fighters): gid = 1 if ind < typ else 2 uid, sid = pair Generals = self._arena_members[typ][pair]['info'][ 'Generals'] Techs = self._arena_members[typ][pair]['info']['Techs'] army = pvp_common.getArmyInfo(typ, sid, uid, gid, PosId, Generals, Techs) ArmyInfo.update(army) UserInfo[pair] = self._arena_members[typ][pair]['info'][ 'User'] UserInfo[pair]['BeginX'] = cr.get_cfg( 'tb_cfg_pvp_pos', (typ, PosId), 'BeginX') UserInfo[pair]['BeginY'] = cr.get_cfg( 'tb_cfg_pvp_pos', (typ, PosId), 'BeginY') UserInfo[pair]['GroupId'] = gid PosId += 1 ao = ArenaObj(typ, ArmyInfo, UserInfo) #生成一个公共的战斗对象 for pair in all_fighters: self._arena_objs[pair] = ao #这场战斗的参战人员,可以操作这个战斗对象。 del self._arena_members[typ][pair] #从房间中移除
def grep_users(self): '''匹配用户,生成战斗对象。''' while self._arena_started: #竞技场开放 try: gevent.sleep(0) #避免hog cpu,切换协程。 typ = random.choice([1, 2, 3]) #三种类型房间中,随机选一个。 #如果房间人数小于(2 * 类型),人数不足。 if len(self._arena_members[typ]) < 2 * typ: continue all_fighters = self.choice_users(typ) #匹配结果 if all_fighters == False: #匹配失败 continue except Exception, e: print str(e) print '程序运行错误' else: #生成战斗对象 print '所有参加战斗的人', all_fighters print '生成一场战斗%s vs %s' % (str(all_fighters[0:typ]), str(all_fighters[typ:])) print '战斗类型是', typ, 'vs', typ ArmyInfo = {} UserInfo = {} PosId = 1 for ind, pair in enumerate(all_fighters): gid = 1 if ind < typ else 2 uid, sid = pair Generals = self._arena_members[typ][pair]['info']['Generals'] Techs = self._arena_members[typ][pair]['info']['Techs'] army = pvp_common.getArmyInfo(typ, sid, uid, gid, PosId, Generals, Techs) ArmyInfo.update(army) UserInfo[pair] = self._arena_members[typ][pair]['info']['User'] UserInfo[pair]['BeginX'] = cr.get_cfg('tb_cfg_pvp_pos', (typ, PosId), 'BeginX') UserInfo[pair]['BeginY'] = cr.get_cfg('tb_cfg_pvp_pos', (typ, PosId), 'BeginY') UserInfo[pair]['GroupId'] = gid PosId += 1 ao = ArenaObj(typ, ArmyInfo, UserInfo) #生成一个公共的战斗对象 for pair in all_fighters: self._arena_objs[pair] = ao #这场战斗的参战人员,可以操作这个战斗对象。 del self._arena_members[typ][pair] #从房间中移除
def getArmyAttack(**kw): '''计算方阵(军队)初始攻击力 未加技能加成 初始攻击力 = 方阵初始士兵数量*兵种攻击*(1+α*武力)*军团科技加成*地形系数 ''' A = {1: 0.000145, 2: 0.000145} #间接变量 generalType = kw['generalType'] #武将类型 soldierType = kw['soldierType'] #兵种类型 landForm = kw.get('landForm', 0) #地形 #直接变量 soldierAttack = kw['soldierAttack'] #兵种攻击 (已加成军团科技) soldierNum = kw['soldierNum'] #士兵数量 forceValue = kw['forceValue'] #武将武力 #缺省变量 clubTechAdd = kw.get('clubTechAdd', 1) #军团科技加成 job = cr.get_cfg('tb_cfg_general', generalType, 'Job') m = M if cr.get_cfg('tb_cfg_soldier', soldierType, 'LandForm') == landForm else 1 a = A[job] if 0: print 'soldierAttack', soldierAttack print 'clubTechAdd', clubTechAdd print 'forceValue', forceValue print 'soldierNum', soldierNum print 'm', m print 'forceValue', forceValue print 'a', a result = soldierAttack * clubTechAdd * (1 + a * forceValue) * soldierNum * m return int(result)
def getArmyAttack(**kw): '''计算方阵(军队)初始攻击力 未加技能加成 初始攻击力 = 方阵初始士兵数量*兵种攻击*(1+α*武力)*军团科技加成*地形系数 ''' A = {1:0.000145,2:0.000145} #间接变量 generalType = kw['generalType'] #武将类型 soldierType = kw['soldierType'] #兵种类型 landForm = kw.get('landForm',0) #地形 #直接变量 soldierAttack = kw['soldierAttack'] #兵种攻击 (已加成军团科技) soldierNum = kw['soldierNum'] #士兵数量 forceValue = kw['forceValue'] #武将武力 #缺省变量 clubTechAdd = kw.get('clubTechAdd',1) #军团科技加成 job = cr.get_cfg('tb_cfg_general', generalType, 'Job') m = M if cr.get_cfg('tb_cfg_soldier',soldierType,'LandForm')==landForm else 1 a = A[job] if 0: print 'soldierAttack',soldierAttack print 'clubTechAdd',clubTechAdd print 'forceValue',forceValue print 'soldierNum',soldierNum print 'm',m print 'forceValue',forceValue print 'a',a result = soldierAttack * clubTechAdd * (1+a*forceValue) * soldierNum * m return int(result)
def gain_honour(self, groupid): '''计算获得的荣誉''' if not groupid in [1, 2]: return False diff = self.user_level_diff() diff = diff if groupid == 1 else -diff print 'diff', diff base_honour = cr.get_cfg('tb_cfg_honour', diff, 'P%sv%s' % (self._typ, self._typ)) print 'P%dv%d' % (self._typ, self._typ) print 'base_honour', base_honour modify = self.army_avg_lv['general_avg_level'][groupid] / \ self.army_avg_lv['general_avg_level'][0] * \ self.army_avg_lv['soldier_avg_level'][groupid] / \ self.army_avg_lv['soldier_avg_level'][0] honour = base_honour * (2 - modify) return 2 if honour <= 2 else honour
def gain_honour(self, groupid): '''计算获得的荣誉''' if not groupid in [1, 2]: return False diff = self.user_level_diff() diff = diff if groupid == 1 else -diff print 'diff', diff base_honour = cr.get_cfg('tb_cfg_honour', diff, 'P%sv%s'%(self._typ, self._typ)) print 'P%dv%d'%(self._typ, self._typ) print 'base_honour', base_honour modify = self.army_avg_lv['general_avg_level'][groupid] / \ self.army_avg_lv['general_avg_level'][0] * \ self.army_avg_lv['soldier_avg_level'][groupid] / \ self.army_avg_lv['soldier_avg_level'][0] honour = base_honour * (2 - modify) return 2 if honour <= 2 else honour
def getArmyInfo(pvpType,serverId,userId,groupId,posId, generalRows, SoldiersTech): '''获取参战军队信息 refer:BattleMod.getMyArmy @param pvpType: 竞技类型 1:1v1 2:2v2 3:3v3 @param serverId: 服务器ID @param userId: 用户DI @param groupId: 分组ID(1组 2组) @param posId: 组内成员ID(1,2,3,4,5,6) ''' assert pvpType in (1,2,3) assert groupId in (1,2) assert posId in (1,2,3,4,5,6) MyArmy = {} MapId = pvpType #row_map = Gcore.getCfg('tb_cfg_pve_map',MapId) row_map = cr.get_cfg('tb_cfg_pvp_pos',(MapId,posId)) CoordSet = Get9Coord(row_map['CenterX'], row_map['CenterY'], row_map['ArmySpace'], False) armyId = 100*posId armyNum = 0 for row in generalRows: armyId += 1 i = row['PosId'] SoldierType = row['TakeType'] SoldierNum = row['TakeNum'] if SoldierNum == 0 or SoldierType == 0: #没有带兵不能上场,带兵类型是0也不能上场 continue SoldierLevel = SoldiersTech.get(SoldierType,0) GeneralId = row['GeneralId'] #row_soldier = cr.get_cfg('tb_cfg_soldier',SoldierType) row_soldier_up = cr.get_cfg('tb_cfg_soldier_up',(SoldierType,SoldierLevel)) SoldierLife = row_soldier_up['Life'] army = {} army['armyId'] = armyId army['armyUserId'] = '%s.%s' % (serverId, userId) army['armyType'] = groupId #军队类型: 分组类型 1或2 #army['__armySizeL'] = 3 #军队尺寸的长 #army['__armySizeW'] = 3 #军队尺寸的宽 army['armyLife'] = SoldierLife * SoldierNum #军队的生命 #按校场布阵 地图9宫格而定 army['initPointX'] = CoordSet[i][0] #初始位置X army['initPointY'] = CoordSet[i][1] #初始位置Y army['generalId'] = GeneralId #武将ID 用于损兵 army['generalType'] = row['GeneralType'] #武将技能种类 , 军队需要显示武将的名称 来源于武将类型配置 army['generalLevel'] = row['GeneralLevel'] #武将技能等级 SkillId = cr.get_cfg('tb_cfg_general',row['GeneralType'],'SkillId') #武将技能ID 暂定每个武将只有一个技能 if SkillId: ChanceAdd = int( row['WitValue'] * 0.000055 ) Chance = cr.get_cfg('tb_cfg_skill',SkillId,'SkillChance')+ChanceAdd army['SkillDict'] = gen01Dict(Chance,SkillId) else: army['SkillDict'] = {} army['generalForce'] = row['ForceValue'] army['generalWit'] = row['WitValue'] army['generalSpeed'] = row['SpeedValue'] army['generalLeader'] = row['LeaderValue'] army['soldierType'] = SoldierType #army['__soldierSort'] = row_soldier['SoldierSort'] #分类 步弓骑 army['soldierLevel'] = SoldierLevel #army['__soldierLife'] = SoldierLife army['soldierNum'] = SoldierNum #army['__soldierAttackNum'] = row_soldier_up['Attack'] #army['__soldierDefenseNum'] = row_soldier_up['Defense'] #SumDefense += row_soldier_up['Defense'] #army['__attackDistance'] = row_soldier['AttackDistance'] #攻击距离 #army['__attackAngle'] = row_soldier['AttackRange'] #攻击角度 #army['__attackFre'] = row_soldier['AttackFre'] #攻击频率 #army['__armySpeed'] = row_soldier['Speed'] #移动速度 #army['__warnRadius'] = row_soldier['WarnRadius'] #警戒距离 (半径 角度360度固定) army['face'] = 2 #面向 army['cur_armyLife'] = army['armyLife'] #当前军队生命 战斗中减少 r = army ArmyAttack = getArmyAttack( generalType = r['generalType'], soldierType = r['soldierType'], soldierAttack = row_soldier_up['Attack'], soldierNum = r['soldierNum'], forceValue = r['generalForce'], ) army['armyInitAttack'] = ArmyAttack armyNum += 1 MyArmy[armyId] = army data = { 'ArmyInfo':MyArmy, 'armyNum':armyNum } return MyArmy
def getArmyInfo(pvpType, serverId, userId, groupId, posId, generalRows, SoldiersTech): '''获取参战军队信息 refer:BattleMod.getMyArmy @param pvpType: 竞技类型 1:1v1 2:2v2 3:3v3 @param serverId: 服务器ID @param userId: 用户DI @param groupId: 分组ID(1组 2组) @param posId: 组内成员ID(1,2,3,4,5,6) ''' assert pvpType in (1, 2, 3) assert groupId in (1, 2) assert posId in (1, 2, 3, 4, 5, 6) MyArmy = {} MapId = pvpType #row_map = Gcore.getCfg('tb_cfg_pve_map',MapId) row_map = cr.get_cfg('tb_cfg_pvp_pos', (MapId, posId)) CoordSet = Get9Coord(row_map['CenterX'], row_map['CenterY'], row_map['ArmySpace'], False) armyId = 100 * posId armyNum = 0 for row in generalRows: armyId += 1 i = row['PosId'] SoldierType = row['TakeType'] SoldierNum = row['TakeNum'] if SoldierNum == 0 or SoldierType == 0: #没有带兵不能上场,带兵类型是0也不能上场 continue SoldierLevel = SoldiersTech.get(SoldierType, 0) GeneralId = row['GeneralId'] #row_soldier = cr.get_cfg('tb_cfg_soldier',SoldierType) row_soldier_up = cr.get_cfg('tb_cfg_soldier_up', (SoldierType, SoldierLevel)) SoldierLife = row_soldier_up['Life'] army = {} army['armyId'] = armyId army['armyUserId'] = '%s.%s' % (serverId, userId) army['armyType'] = groupId #军队类型: 分组类型 1或2 #army['__armySizeL'] = 3 #军队尺寸的长 #army['__armySizeW'] = 3 #军队尺寸的宽 army['armyLife'] = SoldierLife * SoldierNum #军队的生命 #按校场布阵 地图9宫格而定 army['initPointX'] = CoordSet[i][0] #初始位置X army['initPointY'] = CoordSet[i][1] #初始位置Y army['generalId'] = GeneralId #武将ID 用于损兵 army['generalType'] = row[ 'GeneralType'] #武将技能种类 , 军队需要显示武将的名称 来源于武将类型配置 army['generalLevel'] = row['GeneralLevel'] #武将技能等级 SkillId = cr.get_cfg('tb_cfg_general', row['GeneralType'], 'SkillId') #武将技能ID 暂定每个武将只有一个技能 if SkillId: ChanceAdd = int(row['WitValue'] * 0.000055) Chance = cr.get_cfg('tb_cfg_skill', SkillId, 'SkillChance') + ChanceAdd army['SkillDict'] = gen01Dict(Chance, SkillId) else: army['SkillDict'] = {} army['generalForce'] = row['ForceValue'] army['generalWit'] = row['WitValue'] army['generalSpeed'] = row['SpeedValue'] army['generalLeader'] = row['LeaderValue'] army['soldierType'] = SoldierType #army['__soldierSort'] = row_soldier['SoldierSort'] #分类 步弓骑 army['soldierLevel'] = SoldierLevel #army['__soldierLife'] = SoldierLife army['soldierNum'] = SoldierNum #army['__soldierAttackNum'] = row_soldier_up['Attack'] #army['__soldierDefenseNum'] = row_soldier_up['Defense'] #SumDefense += row_soldier_up['Defense'] #army['__attackDistance'] = row_soldier['AttackDistance'] #攻击距离 #army['__attackAngle'] = row_soldier['AttackRange'] #攻击角度 #army['__attackFre'] = row_soldier['AttackFre'] #攻击频率 #army['__armySpeed'] = row_soldier['Speed'] #移动速度 #army['__warnRadius'] = row_soldier['WarnRadius'] #警戒距离 (半径 角度360度固定) army['face'] = 2 #面向 army['cur_armyLife'] = army['armyLife'] #当前军队生命 战斗中减少 r = army ArmyAttack = getArmyAttack( generalType=r['generalType'], soldierType=r['soldierType'], soldierAttack=row_soldier_up['Attack'], soldierNum=r['soldierNum'], forceValue=r['generalForce'], ) army['armyInitAttack'] = ArmyAttack armyNum += 1 MyArmy[armyId] = army data = {'ArmyInfo': MyArmy, 'armyNum': armyNum} return MyArmy