|  |  |  | 
|---|
|  |  |  | import ChConfig | 
|---|
|  |  |  | import PlayerFamilyRedPacket | 
|---|
|  |  |  | import PlayerTalk | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import random | 
|---|
|  |  |  |  | 
|---|
|  |  |  | FamilyPartyFB_QuestionID = 'FamilyPartyFB_QuestionID%s' #当前题ID | 
|---|
|  |  |  | FamilyPartyFB_QuestionTick = 'FamilyPartyFB_QuestionTick%s' #当前题出题时间 | 
|---|
|  |  |  | FamilyPartyFB_AnswerTick = 'FamilyPartyFB_AnswerTick%s' #答对时间 | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | g_questionIDHistory = {} #出过的题记录 {familyid:[出过的题id,..]} | 
|---|
|  |  |  | g_familyAnswerDict = {} #仙盟答题数量 {familyid:答题数量,..} | 
|---|
|  |  |  | g_heroAnswerDict = {} #个人答题数量 {playerid:答题数量,..} | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | AnswerState = 2 #开始答题活动状态 | 
|---|
|  |  |  | ## 玩家登录 | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | 
|---|
|  |  |  | NotifyFamilyPartyQuestion(curPlayer) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def OnPlayerChangeMap(curPlayer, tick): | 
|---|
|  |  |  | if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyParty: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | playerID = curPlayer.GetID() | 
|---|
|  |  |  | if playerID not in PyGameData.g_partyheroAnswerDict: | 
|---|
|  |  |  | PyGameData.g_partyheroAnswerDict[playerID] = 0 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def NotifyFamilyPartyQuestion(curPlayer): | 
|---|
|  |  |  | #刚登录的或刚进仙盟的补发最近的题目 | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty) | 
|---|
|  |  |  | if state != 1: | 
|---|
|  |  |  | if state != AnswerState: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | curFamilyid = curPlayer.GetFamilyID() | 
|---|
|  |  |  | if not curFamilyid: | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def FamilyPartyStateChange(state): | 
|---|
|  |  |  | #活动状态变更 | 
|---|
|  |  |  | global g_questionIDHistory | 
|---|
|  |  |  | global g_familyAnswerDict | 
|---|
|  |  |  | global g_heroAnswerDict | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if state == 1: | 
|---|
|  |  |  | g_questionIDHistory = {} | 
|---|
|  |  |  | g_familyAnswerDict = {} | 
|---|
|  |  |  | g_heroAnswerDict = {} | 
|---|
|  |  |  | PyGameData.g_questionIDHistory = {} | 
|---|
|  |  |  | PyGameData.g_familyAnswerDict = {} | 
|---|
|  |  |  | PyGameData.g_familyPartyTopInfo = [] | 
|---|
|  |  |  | PyGameData.g_partyheroAnswerDict = {} | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | familyManager = GameWorld.GetFamilyManager() | 
|---|
|  |  |  | for i in range(0, familyManager.GetCount()): | 
|---|
|  |  |  | 
|---|
|  |  |  | familyID = family.GetID() | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionID % familyID, 0) | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_AnswerTick % familyID, 0) | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyPartyInfo, []) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if state == 0: | 
|---|
|  |  |  | #活动结算 前3名仙盟、答题王 | 
|---|
|  |  |  | GameWorld.Log(" 仙盟宴会结算 g_familyAnswerDict=%s, g_heroAnswerDict=%s"%(g_familyAnswerDict, g_heroAnswerDict)) | 
|---|
|  |  |  | GameWorld.Log(" 仙盟宴会结算 g_familyAnswerDict=%s, g_familyPartyTopInfo=%s"%(PyGameData.g_familyAnswerDict, PyGameData.g_familyPartyTopInfo)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | noneStr = 'null' | 
|---|
|  |  |  | topfamilyNameList = [noneStr,noneStr,noneStr] | 
|---|
|  |  |  | if g_familyAnswerDict: | 
|---|
|  |  |  | sortFamilyList = g_familyAnswerDict.items() | 
|---|
|  |  |  | sortFamilyList.sort(cmp=CmpFunc) | 
|---|
|  |  |  | familyIDList = [familyInfo[0] for familyInfo in sortFamilyList][:3] | 
|---|
|  |  |  | GameWorld.DebugLog("    宴会结束 familyIDList=%s"%familyIDList) | 
|---|
|  |  |  | if PyGameData.g_familyAnswerDict: | 
|---|
|  |  |  | sortFamilyList = __GetFamilyAnswerRankList() | 
|---|
|  |  |  | GameWorld.DebugLog("    宴会结束 sortFamilyList=%s"%sortFamilyList) | 
|---|
|  |  |  | redPackID = IpyGameDataPY.GetFuncCfg('PartyReward', 4) | 
|---|
|  |  |  | for i, familyID in enumerate(familyIDList): | 
|---|
|  |  |  | familyName = PlayerFamily.GetFamilyName_ByID(familyID) | 
|---|
|  |  |  | for i, familyInfo in enumerate(sortFamilyList): | 
|---|
|  |  |  | familyID, familyName = familyInfo[:2] | 
|---|
|  |  |  | topfamilyNameList[i] = familyName | 
|---|
|  |  |  | #发红包 | 
|---|
|  |  |  | family = GameWorld.GetFamilyManager().FindFamily(familyID) | 
|---|
|  |  |  | 
|---|
|  |  |  | PlayerFamilyRedPacket.CreatNewFamilyRedPacket(family, family.GetLeaderID(), redPackID) | 
|---|
|  |  |  | PlayerControl.WorldNotify(0, 'Party_TopThree', topfamilyNameList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | topHeroName = noneStr | 
|---|
|  |  |  | if g_heroAnswerDict: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if PyGameData.g_familyPartyTopInfo: | 
|---|
|  |  |  | topHeroID, topHeroName = PyGameData.g_familyPartyTopInfo[:2] | 
|---|
|  |  |  | rewardInfo = IpyGameDataPY.GetFuncEvalCfg('PartyReward', 3) | 
|---|
|  |  |  | sortHeroList = g_heroAnswerDict.items() | 
|---|
|  |  |  | sortHeroList.sort(cmp=CmpFunc) | 
|---|
|  |  |  | sortHeroidList = [heroInfo[0] for heroInfo in sortHeroList] | 
|---|
|  |  |  | GameWorld.DebugLog("    宴会结束 sortHeroidList=%s"%sortHeroidList) | 
|---|
|  |  |  | playerManager = GameWorld.GetPlayerManager() | 
|---|
|  |  |  | for playerID in sortHeroidList: | 
|---|
|  |  |  | curPlayer = playerManager.FindPlayerByID(playerID) | 
|---|
|  |  |  | if not curPlayer: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | #                if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyParty: | 
|---|
|  |  |  | #                    #不在副本 | 
|---|
|  |  |  | #                    continue | 
|---|
|  |  |  | topHeroName = curPlayer.GetName() | 
|---|
|  |  |  | #给奖励 | 
|---|
|  |  |  | mailKey, day, itemList = rewardInfo | 
|---|
|  |  |  | content = ShareDefine.Def_MailFormat % (mailKey, '') | 
|---|
|  |  |  | GameWorld.DebugLog('发送仙盟宴会答题王邮件   itemList=%s' % (itemList)) | 
|---|
|  |  |  | PlayerCompensation.SendPersonalItemMailEx('', content, day, [playerID], itemList) | 
|---|
|  |  |  | break | 
|---|
|  |  |  | PlayerControl.WorldNotify(0, 'Party_TopPlayer', [topHeroName]) | 
|---|
|  |  |  | #给奖励 | 
|---|
|  |  |  | mailKey, day, itemList = rewardInfo | 
|---|
|  |  |  | content = ShareDefine.Def_MailFormat % (mailKey, '') | 
|---|
|  |  |  | GameWorld.DebugLog('发送仙盟宴会答题王邮件   itemList=%s' % (itemList)) | 
|---|
|  |  |  | PlayerCompensation.SendPersonalItemMailEx('', content, day, [topHeroID], itemList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerControl.WorldNotify(0, 'Party_TopPlayer', [topHeroName]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #给参与奖励 | 
|---|
|  |  |  | joinPlayerIDList = PyGameData.g_partyheroAnswerDict.keys() | 
|---|
|  |  |  | if joinPlayerIDList: | 
|---|
|  |  |  | joinReward = IpyGameDataPY.GetFuncEvalCfg('PartyReward') | 
|---|
|  |  |  | if joinReward: | 
|---|
|  |  |  | PlayerCompensation.SendMailByKey('FamilyParty', joinPlayerIDList, joinReward) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetFamilyAnswerRankList(): | 
|---|
|  |  |  | if not PyGameData.g_familyAnswerDict: | 
|---|
|  |  |  | return [] | 
|---|
|  |  |  | sortFamilyList = PyGameData.g_familyAnswerDict.items() | 
|---|
|  |  |  | sortFamilyList.sort(cmp=CmpFunc) | 
|---|
|  |  |  | rankList = [] #[[familyID, familyName, 答题数量]] | 
|---|
|  |  |  | for familyID, info in sortFamilyList[:3]: | 
|---|
|  |  |  | rankList.append([familyID, info[2], info[0]]) | 
|---|
|  |  |  | return rankList | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 排序函数 | 
|---|
|  |  |  | #  @param elem1 元素1 | 
|---|
|  |  |  | 
|---|
|  |  |  | return result | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def FamilyParty_Process(tick): | 
|---|
|  |  |  | global g_questionIDHistory | 
|---|
|  |  |  | #开始出题 | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty) | 
|---|
|  |  |  | if state != 1: | 
|---|
|  |  |  | if state != AnswerState: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | allQuestionIDList = IpyGameDataPY.GetConfigEx('AllQuestionID') | 
|---|
|  |  |  | ipyMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | if not allQuestionIDList: | 
|---|
|  |  |  | allQuestionIDList = [] | 
|---|
|  |  |  | for i in xrange(ipyMgr.GetQuestionBankCount()): | 
|---|
|  |  |  | ipyData = ipyMgr.GetQuestionBankByIndex(i) | 
|---|
|  |  |  | questionID = ipyData.GetID() | 
|---|
|  |  |  | allQuestionIDList.append(questionID) | 
|---|
|  |  |  | IpyGameDataPY.SetConfigEx('AllQuestionID', allQuestionIDList) | 
|---|
|  |  |  | if not allQuestionIDList: | 
|---|
|  |  |  | GameWorld.ErrLog('仙盟宴会题库没有题目!') | 
|---|
|  |  |  | return | 
|---|
|  |  |  | familyManager = GameWorld.GetFamilyManager() | 
|---|
|  |  |  | for i in range(0, familyManager.GetCount()): | 
|---|
|  |  |  | family = familyManager.GetAt(i) | 
|---|
|  |  |  | familyID = family.GetID() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if gameWorld.GetDictByKey(FamilyPartyFB_QuestionID % familyID): | 
|---|
|  |  |  | lastQuestionID = gameWorld.GetDictByKey(FamilyPartyFB_QuestionID % familyID) | 
|---|
|  |  |  | if lastQuestionID: | 
|---|
|  |  |  | #还有题未答 | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | maxSecond = IpyGameDataPY.GetFuncCfg('FairyCorrectAnswer') | 
|---|
|  |  |  | if tick - gameWorld.GetDictByKey(FamilyPartyFB_QuestionTick % familyID) > maxSecond*1000: | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData('QuestionBank', lastQuestionID) | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | answer = ipyData.GetAnswer() | 
|---|
|  |  |  | answer = answer.replace('[', '') | 
|---|
|  |  |  | answer = answer.replace(']', '') | 
|---|
|  |  |  | PlayerControl.FamilyNotify(familyID, 'Party_Correct', [maxSecond, GameWorld.GbkToCode(answer)]) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | answerTick = gameWorld.GetDictByKey(FamilyPartyFB_AnswerTick % familyID) | 
|---|
|  |  |  | if tick - answerTick < 5000: | 
|---|
|  |  |  | if not lastQuestionID and tick - answerTick < 5000: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #随机题目 | 
|---|
|  |  |  | historyQuestionIDList = g_questionIDHistory.get(familyID, []) | 
|---|
|  |  |  | questionCnt = IpyGameDataPY.IPY_Data().GetQuestionBankCount() | 
|---|
|  |  |  | historyQuestionIDList = PyGameData.g_questionIDHistory.get(familyID, []) | 
|---|
|  |  |  | for i in xrange(50): | 
|---|
|  |  |  | questionID = random.randint(1, questionCnt) | 
|---|
|  |  |  | questionID = random.choice(allQuestionIDList) | 
|---|
|  |  |  | # 随机到不重复的即可 | 
|---|
|  |  |  | if questionID not in historyQuestionIDList or i == 49: | 
|---|
|  |  |  | historyQuestionIDList.append(questionID) | 
|---|
|  |  |  | g_questionIDHistory[familyID] = historyQuestionIDList | 
|---|
|  |  |  | if questionID not in historyQuestionIDList: | 
|---|
|  |  |  | historyQuestionIDList.append(questionID) | 
|---|
|  |  |  | PyGameData.g_questionIDHistory[familyID] = historyQuestionIDList | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionID % familyID, questionID) | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionTick % familyID, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerControl.FamilyNotify(familyID, 'Party_Topic', [questionID]) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 仙盟频道聊天 | 
|---|
|  |  |  | def OnTalkFamily(curPlayer, content, tick): | 
|---|
|  |  |  | global g_familyAnswerDict | 
|---|
|  |  |  | global g_heroAnswerDict | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty) | 
|---|
|  |  |  | if state != 1: | 
|---|
|  |  |  | if state != AnswerState: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curFamilyid = curPlayer.GetFamilyID() | 
|---|
|  |  |  | 
|---|
|  |  |  | questionID = gameWorld.GetDictByKey(FamilyPartyFB_QuestionID % curFamilyid) | 
|---|
|  |  |  | if not questionID: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData('QuestionBank', questionID) | 
|---|
|  |  |  | if not ipyData: | 
|---|
|  |  |  | GameWorld.ErrLog('仙盟宴会答题 该题不存在,异常 questionID=%s, 重新出题'%questionID) | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionID % curFamilyid, 0) | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionTick % curFamilyid, 0) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ipyData = IpyGameDataPY.IPY_Data().GetQuestionBankByIndex(questionID-1) | 
|---|
|  |  |  | answerList = eval(ipyData.GetAnswer()) | 
|---|
|  |  |  | ChContent = PlayerTalk.ChangeVoiceChat(content) | 
|---|
|  |  |  | ChContent = ChContent.decode(GameWorld.GetCharacterEncoding()).encode(ShareDefine.Def_Game_Character_Encoding) | 
|---|
|  |  |  | ChContent = GameWorld.CodeToGBK(ChContent) | 
|---|
|  |  |  | ChContent = ChContent.strip() | 
|---|
|  |  |  | isRight = ChContent in answerList | 
|---|
|  |  |  | if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyParty: | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if isRight: | 
|---|
|  |  |  | GameWorld.DebugLog("    答对了! %s"%playerID) | 
|---|
|  |  |  | playerName = curPlayer.GetName() | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_QuestionID%curFamilyid, 0) | 
|---|
|  |  |  | gameWorld.SetDict(FamilyPartyFB_AnswerTick%curFamilyid, tick) | 
|---|
|  |  |  | PlayerControl.FamilyNotify(curFamilyid, 'Party_Answer', [curPlayer.GetName()]) | 
|---|
|  |  |  | PlayerControl.FamilyNotify(curFamilyid, 'Party_Answer', [playerName]) | 
|---|
|  |  |  | if curFamilyid in PyGameData.g_familyAnswerDict: | 
|---|
|  |  |  | PyGameData.g_familyAnswerDict[curFamilyid][0] +=1 | 
|---|
|  |  |  | PyGameData.g_familyAnswerDict[curFamilyid][1] = tick | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | familyName = PlayerFamily.GetFamilyName_ByID(curFamilyid) | 
|---|
|  |  |  | PyGameData.g_familyAnswerDict[curFamilyid] = [1, tick, familyName] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | g_familyAnswerDict[curFamilyid] = [g_familyAnswerDict.get(curFamilyid, [0])[0] + 1, tick] | 
|---|
|  |  |  | g_heroAnswerDict[playerID] = [g_heroAnswerDict.get(playerID, [0])[0] + 1, tick] | 
|---|
|  |  |  | PyGameData.g_partyheroAnswerDict[playerID] = PyGameData.g_partyheroAnswerDict.get(playerID, 0) + 1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if PyGameData.g_familyPartyTopInfo: | 
|---|
|  |  |  | if PyGameData.g_partyheroAnswerDict[playerID] > PyGameData.g_partyheroAnswerDict[PyGameData.g_familyPartyTopInfo[0]]: | 
|---|
|  |  |  | PyGameData.g_familyPartyTopInfo = [playerID, playerName] | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | PyGameData.g_familyPartyTopInfo = [playerID, playerName] | 
|---|
|  |  |  | msgList = [__GetFamilyAnswerRankList(), PyGameData.g_familyPartyTopInfo[1], PyGameData.g_partyheroAnswerDict[PyGameData.g_familyPartyTopInfo[0]]] | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FamilyPartyInfo, msgList) | 
|---|
|  |  |  | #通知玩家可获得贡献 | 
|---|
|  |  |  | curPlayer.MapServer_QueryPlayerResult(0, 0, "FamilyPartyAnswer", '', 0) | 
|---|
|  |  |  |  | 
|---|