#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package PlayerFamilyParty
|
#
|
# @todo:¼Ò×åÑç»á¸±±¾
|
# @author xdh
|
# @date 2014-04-16
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¼Ò×åÑç»á¸±±¾
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2014-04-16 18:00"""
|
#---------------------------------------------------------------------
|
|
import GameWorld
|
import PlayerFamily
|
import ShareDefine
|
import PlayerControl
|
import IpyGameDataPY
|
import PlayerCompensation
|
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' #´ð¶Ôʱ¼ä
|
|
AnswerState = 2 #¿ªÊ¼´ðÌâ»î¶¯×´Ì¬
|
## Íæ¼ÒµÇ¼
|
# @param None
|
# @return None
|
def OnPlayerLogin(curPlayer):
|
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):
|
#¸ÕµÇ¼µÄ»ò¸Õ½øÏÉÃ˵IJ¹·¢×î½üµÄÌâÄ¿
|
gameWorld = GameWorld.GetGameWorld()
|
state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty)
|
if state != AnswerState:
|
return
|
curFamilyid = curPlayer.GetFamilyID()
|
if not curFamilyid:
|
return
|
questionID = gameWorld.GetDictByKey(FamilyPartyFB_QuestionID % curFamilyid)
|
if not questionID:
|
return
|
PlayerControl.NotifyCode(curPlayer, 'Party_Topic', [questionID])
|
return
|
|
def FamilyPartyStateChange(state):
|
#»î¶¯×´Ì¬±ä¸ü
|
|
if state == 1:
|
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()):
|
family = familyManager.GetAt(i)
|
familyID = family.GetID()
|
gameWorld.SetDict(FamilyPartyFB_QuestionID % familyID, 0)
|
gameWorld.SetDict(FamilyPartyFB_AnswerTick % familyID, 0)
|
|
|
if state == 0:
|
#»î¶¯½áËã ǰ3ÃûÏÉÃË¡¢´ðÌâÍõ
|
GameWorld.Log(" ÏÉÃËÑç»á½áËã g_familyAnswerDict=%s, g_familyPartyTopInfo=%s"%(PyGameData.g_familyAnswerDict, PyGameData.g_familyPartyTopInfo))
|
|
noneStr = 'null'
|
topfamilyNameList = [noneStr,noneStr,noneStr]
|
if PyGameData.g_familyAnswerDict:
|
sortFamilyList = __GetFamilyAnswerRankList()
|
GameWorld.DebugLog(" Ñç»á½áÊø sortFamilyList=%s"%sortFamilyList)
|
redPackID = IpyGameDataPY.GetFuncCfg('PartyReward', 4)
|
for i, familyInfo in enumerate(sortFamilyList):
|
familyID, familyName = familyInfo[:2]
|
topfamilyNameList[i] = familyName
|
#·¢ºì°ü
|
family = GameWorld.GetFamilyManager().FindFamily(familyID)
|
if not family:
|
continue
|
PlayerFamilyRedPacket.CreatNewFamilyRedPacket(family, family.GetLeaderID(), redPackID)
|
PlayerControl.WorldNotify(0, 'Party_TopThree', topfamilyNameList)
|
|
|
if PyGameData.g_familyPartyTopInfo:
|
topHeroID, topHeroName = PyGameData.g_familyPartyTopInfo[:2]
|
rewardInfo = IpyGameDataPY.GetFuncEvalCfg('PartyReward', 3)
|
#¸ø½±Àø
|
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
|
# @param elem2 ÔªËØ2
|
# @return ´óС
|
# @remarks ÅÅÐòº¯Êý
|
def CmpFunc(elem1, elem2):
|
result = -cmp(elem1[1][0], elem2[1][0])
|
if result == 0:
|
return cmp(elem1[1][1], elem2[1][1])
|
return result
|
|
def FamilyParty_Process(tick):
|
#¿ªÊ¼³öÌâ
|
gameWorld = GameWorld.GetGameWorld()
|
state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty)
|
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()
|
lastQuestionID = gameWorld.GetDictByKey(FamilyPartyFB_QuestionID % familyID)
|
if lastQuestionID:
|
#»¹ÓÐÌâδ´ð
|
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 not lastQuestionID and tick - answerTick < 5000:
|
continue
|
|
#Ëæ»úÌâÄ¿
|
historyQuestionIDList = PyGameData.g_questionIDHistory.get(familyID, [])
|
for i in xrange(50):
|
questionID = random.choice(allQuestionIDList)
|
# Ëæ»úµ½²»Öظ´µÄ¼´¿É
|
if questionID not in historyQuestionIDList or i == 49:
|
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):
|
|
gameWorld = GameWorld.GetGameWorld()
|
state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty)
|
if state != AnswerState:
|
return
|
|
curFamilyid = curPlayer.GetFamilyID()
|
if not curFamilyid:
|
return
|
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
|
|
answerList = eval(ipyData.GetAnswer())
|
ChContent = PlayerTalk.ChangeVoiceChat(content)
|
ChContent = GameWorld.CodeToGBK(ChContent)
|
ChContent = ChContent.strip()
|
isRight = ChContent in answerList
|
if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyParty:
|
if isRight:
|
PlayerControl.FamilyNotify(curFamilyid, 'FamilyPleaseIntoParty')
|
PlayerControl.NotifyCode(curPlayer, 'FamilyNoIntoParty')
|
return
|
|
playerID = curPlayer.GetID()
|
GameWorld.DebugLog(" answer=%s ChContent=%s"%(answerList, ChContent), playerID)
|
|
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', [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]
|
|
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)
|
|
return
|