#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldLogic.FBProcess.GameLogic_XMZZ
|
#
|
# @todo:ÏÉħ֮Õù
|
# @author xdh
|
# @date 2018-01-31
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÏÉħ֮Õù
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-01-31 15:00"""
|
#-------------------------------------------------------------------------------
|
|
import FBCommon
|
import PlayerControl
|
import IPY_GameWorld
|
import GameWorld
|
import ChConfig
|
import IpyGameDataPY
|
import ShareDefine
|
import ItemControler
|
import DataRecordPack
|
import ItemCommon
|
import FormulaControl
|
import NPCCustomRefresh
|
import PlayerWeekParty
|
import PlayerSuccess
|
import PyGameData
|
import EventReport
|
import SkillCommon
|
import GameObj
|
|
import time
|
import math
|
|
(
|
Def_TotalTime, #µ¥³¡×Üʱ¼ä
|
Def_PrepareTime, #×¼±¸Ê±¼ä
|
Def_LeaveTime, #Í˳öʱ¼ä
|
) = range(3)
|
|
(
|
Bet_StartTime, #Ͷע¿ªÊ¼Ê±¼ä
|
Bet_EndTime, #Ͷע½áÊøÊ±¼ä
|
Bet_ResultTime, #Ͷע½áËãʱ¼ä
|
Bet_NeedMoney, #ͶעÐèҪǮ
|
) = range(4)
|
|
#µ±Ç°¸±±¾µØÍ¼µÄ״̬
|
(
|
FB_Step_Open, # ¸±±¾¿ªÆô
|
FB_Step_Prepare, # ¸±±¾µÈ´ý
|
FB_Step_Fighting, # ¸±±¾½øÐÐÖÐ
|
FB_Step_Over, # ¸±±¾½áÊø
|
FB_Step_Close, # ¸±±¾¹Ø±Õ
|
) = range(5)
|
|
XMZZ_WinCnt = 'XMZZ_WinCnt' # ʤ³¡Êý
|
XMZZ_TotalExp = 'XMZZ_TotalExp' # »ñµÃµÄ×ܾÑé
|
XMZZ_TotalExpPoint = 'XMZZ_TotalExpPoint' # »ñµÃµÄ×ܾÑéµã
|
XMZZ_ExtraExp = 'XMZZ_ExtraExp' # »ñµÃµÄ¶îÍâ×ܾÑé
|
XMZZ_ExtraExpPoint = 'XMZZ_ExtraExpPoint' # »ñµÃµÄ¶îÍâ×ܾÑéµã
|
XMZZ_TotalScore = 'XMZZ_TotalScore' # »ñµÃµÄ×Ü»ý·Ö
|
XMZZ_ExtraScore = 'XMZZ_ExtraScore' # »ñµÃµÄ¶îÍâ»ý·Ö
|
XMZZ_NeedKillNPCID = 'XMZZ_NeedKillNPCID' # ÐèÒª»÷ɱµÄNPCID
|
|
def __GetFightTime():return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_XMZZ)
|
|
def OnXMZZLogin(curPlayer):
|
#Íæ¼ÒµÇ¼Èç¹û»¹ÔÚPKÖÐÔò֪ͨÐÅÏ¢ ¼ÌÐøPK
|
# if not FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_XMZZ):
|
# return
|
# curtime = int(time.time())
|
# lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
# fightTime = __GetFightTime()
|
# if lastStartTime and curtime - lastStartTime < fightTime:
|
# #»¹ÔÚPKÖÐ
|
# msgInfo = str([0])
|
# GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))
|
#
|
# remainTime = fightTime - (curtime - lastStartTime)
|
# curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, remainTime * 1000, True)
|
|
return
|
|
## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param mapID µØÍ¼ID
|
# @param lineID Ïß·id
|
# @param tick ʱ¼ä´Á
|
# @return ²¼¶ûÖµ
|
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
|
return True
|
|
|
|
##¸±±¾Íæ¼Ò½øÈëµã
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param mapID µØÍ¼ID
|
# @param lineId ·ÖÏßID
|
# @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢
|
# @param tick ʱ¼ä´Á
|
# @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡)
|
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
|
return ipyEnterPosInfo
|
|
|
|
##ÊÇ·ñ¿ÉÒÔ½øÈë
|
# @param ask ÇëÇó½á¹¹Ìå
|
# @param tick ʱ¼ä´Á
|
# @return TChangeMapError
|
# @remarks
|
def OnChangeMapAsk(ask, tick):
|
return IPY_GameWorld.cmeAccept
|
|
def __ResetPos(curPlayer):
|
startPosX, startPosY = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_XMZZ, 0)[:2]
|
GameWorld.ResetPlayerPos(curPlayer, startPosX, startPosY, isResetPet=True)
|
return
|
|
##Íæ¼Ò½øÈ븱±¾
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks Íæ¼Ò½øÈ븱±¾
|
def DoEnterFB(curPlayer, tick):
|
#gameFB = GameWorld.GetGameFB()
|
curtime = int(time.time())
|
hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
|
if not hadDelTicket:
|
FBCommon.SetHadDelTicket(curPlayer)
|
FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_XMZZ, 1)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, curtime)
|
#FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
#PrepareXMZZPK(curPlayer, tick)
|
PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_XMZZ, 1)
|
msgInfo = str([1]) # ÊÇ·ñ¸Õ¿ªÊ¼
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))
|
GameObj.SetHPFull(curPlayer)
|
skillManager = curPlayer.GetSkillManager()
|
for i in range(0, skillManager.GetSkillCount()):
|
curSkill = skillManager.GetSkillByIndex(i)
|
if curSkill.GetRemainTime() != 0:
|
curSkill.SetRemainTime(0)
|
curSkill.Sync_Skill()
|
for buffType in range(IPY_GameWorld.bfProcessDeBuff, IPY_GameWorld.bfDeBuff):
|
buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
|
if buffTuple:
|
buffState = buffTuple[0]
|
buffState.Clear()
|
PlayerControl.PlayerControl(curPlayer).RefreshAllState()
|
EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_XMZZ, 0, ChConfig.CME_Log_Start)
|
|
|
lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
fightTime = __GetFightTime()[Def_TotalTime]
|
remainTime = fightTime - (curtime - lastStartTime)
|
if remainTime <= 0:
|
PlayerControl.PlayerLeaveFB(curPlayer)
|
return
|
curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, remainTime * 1000, True)
|
DoFBHelp(curPlayer, tick)
|
# fbStep = gameFB.GetFBStep()
|
PlayerControl.DelLimitSuperBuff(curPlayer, tick)
|
return
|
|
##---¸±±¾×ÜÂß¼¼ÆÊ±Æ÷---
|
# @param tick:ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷
|
def OnProcess(tick):
|
fbStep = GameWorld.GetGameFB().GetFBStep()
|
|
# # ¸±±¾×¼±¸
|
if fbStep == FB_Step_Prepare:
|
ResetPos(tick)
|
|
# PrepareXMZZPK(tick)
|
# # ¸±±¾½øÐÐÖÐ
|
if fbStep == FB_Step_Fighting:
|
StartXMZZPK(tick)
|
# # ¸±±¾½áÊø
|
# elif fbStep == FB_Step_Over:
|
# __DoLogic_FB_Over(tick)
|
|
|
return
|
|
def ResetPos(tick):
|
if tick - GameWorld.GetGameFB().GetFBStepTick() < 1 * 1000:
|
return
|
FBCommon.SetFBStep(FB_Step_Fighting, tick)
|
curPlayer = FBCommon.GetCurSingleFBPlayer()
|
if curPlayer:
|
__ResetPos(curPlayer)
|
return
|
|
def __ChcekFBOver(tick):
|
curPlayer = FBCommon.GetCurSingleFBPlayer()
|
if not curPlayer:
|
return
|
curtime = int(time.time())
|
lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
fightTime = __GetFightTime()[Def_TotalTime]
|
remainTime = fightTime - (curtime - lastStartTime)
|
if remainTime > 0:
|
return
|
FBCommon.SetFBStep(FB_Step_Over, tick)
|
npcList = FBCommon.GetMapNPCList()
|
if not npcList:
|
return
|
curNPC = npcList[0]
|
npcHPPer = __GetHPPer(curNPC)
|
HPPer = __GetHPPer(curPlayer)
|
if not npcHPPer or not HPPer:
|
return
|
GameWorld.DebugLog(' ÏÉħ֮Õùʱ¼äµ½£¬·¢ËͽáËã', curPlayer.GetID())
|
isWin = HPPer > npcHPPer
|
__SendPKResult(curPlayer, isWin, 1, HPPer)
|
return
|
|
def __GetHPPer(gameObj):
|
maxHP = GameObj.GetMaxHP(gameObj)
|
return GameObj.GetHP(gameObj)*100/maxHP if maxHP else 0
|
|
def __SendPKResult(curPlayer, isWin, isEnd, HPPer):
|
vsName = ''
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
if lineID in PyGameData.g_xmzzVSPlayerData:
|
vsPlayerPropData = PyGameData.g_xmzzVSPlayerData.pop(lineID)
|
vsName = vsPlayerPropData.get("Name", "")
|
if not vsName:
|
npcID = GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_NeedKillNPCID)
|
npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)
|
if npcData:
|
vsName = npcData.GetName()
|
vsName = vsName.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
|
msgInfo = str([vsName, isWin, isEnd, HPPer]) #Ãû×Ö,ÊÇ·ñʤÀû,ÊÇ·ñ½áÊø,Ê£ÓàѪÁ¿°Ù·Ö±È
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZPKOver', msgInfo, len(msgInfo))
|
GameWorld.DebugLog("__SendPKResult vsName=%s, isWin=%s, isEnd=%s, HPPer=%s" % (vsName, isWin, isEnd, HPPer), curPlayer.GetID())
|
return
|
|
def PrepareXMZZPK(curPlayer, tick, vsPlayerInfo=[]):
|
#===============================================================================================
|
# fbStep = GameWorld.GetGameFB().GetFBStep()
|
# if fbStep != FB_Step_Prepare:
|
# return
|
#===============================================================================================
|
FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
#ÖØÖÃ×ø±ê
|
#__ResetPos(curPlayer)
|
|
FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, __GetFightTime()[Def_PrepareTime] * 1000)
|
#FBCommon.SetFBStep(FB_Step_Fighting, tick)
|
|
if not vsPlayerInfo:
|
return
|
|
pkPlayerID, pkPlayerPropData = vsPlayerInfo
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
PyGameData.g_xmzzVSPlayerData[lineID] = pkPlayerPropData
|
|
robotIDList = IpyGameDataPY.GetFuncEvalCfg("XMZZRobot", 1)
|
if pkPlayerID >= len(robotIDList):
|
npcID = IpyGameDataPY.GetFuncCfg("XMZZRobot", 2)
|
else:
|
npcID = robotIDList[pkPlayerID]
|
GameWorld.DebugLog("¶ÔÊÖÐÅÏ¢: pkPlayerID=%s,npcID=%s,%s" % (pkPlayerID, npcID, pkPlayerPropData), curPlayer.GetID())
|
|
#Ë¢¹Ö
|
NPCCustomRefresh.SetNPCRefresh(101, [npcID])
|
GameWorld.GetGameFB().SetGameFBDict(XMZZ_NeedKillNPCID, npcID)
|
return
|
|
def GetFBNPCStrengthenAttr(curNPC, isReborn):
|
## »ñÈ¡¸±±¾NPCÖ¸¶¨³É³¤ÊôÐÔ×Öµä
|
npcID = curNPC.GetNPCID()
|
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
if lineID not in PyGameData.g_xmzzVSPlayerData:
|
return {}
|
vsPlayerPropData = PyGameData.g_xmzzVSPlayerData[lineID]
|
if not vsPlayerPropData:
|
return {}
|
|
robotIDList = IpyGameDataPY.GetFuncEvalCfg("XMZZRobot", 1)
|
playerNPCID = IpyGameDataPY.GetFuncCfg("XMZZRobot", 2)
|
if npcID not in robotIDList and npcID != playerNPCID:
|
return {}
|
|
job = vsPlayerPropData["Job"]
|
npcLV = vsPlayerPropData["LV"]
|
|
npcAttrDict = {}
|
# È¡¶ÔÊÖÍæ¼ÒÊôÐÔÐÅÏ¢¸³ÓèNPC
|
if npcID == playerNPCID:
|
npcAttrDict = vsPlayerPropData
|
|
if isReborn:
|
__DoGiveVSPlayerNPCSkill(curNPC, job, npcLV)
|
|
return npcAttrDict
|
|
def __DoGiveVSPlayerNPCSkill(curNPC, job, npcLV):
|
skillManager = curNPC.GetSkillManager()
|
jobSkillDict = IpyGameDataPY.GetFuncEvalCfg("XMZZRobotSkill", 1)
|
if job not in jobSkillDict:
|
return
|
skillInfoDict = jobSkillDict[job]
|
#{1:{(100, 101, 102, 103):1, 50000:100, 50100:200, 50400:300}, 2:{(200, 201, 202, 203):1, 55000:100, 55100:200, 55200:300}}
|
skillIDList = []
|
for skillInfo, needLV in skillInfoDict.items():
|
if npcLV < needLV:
|
continue
|
if isinstance(skillInfo, int):
|
skillIDList.append(skillInfo)
|
else:
|
skillIDList += list(skillInfo)
|
GameWorld.DebugLog("¸øNPC¼¼ÄÜ: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))
|
for skillID in skillIDList:
|
skillManager.LearnSkillByID(skillID)
|
return
|
|
def StartXMZZPK(tick):
|
__ChcekFBOver(tick)
|
# ¼ä¸ôδµ½
|
if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetFightTime()[Def_PrepareTime] * 1000:
|
return
|
|
return
|
|
## Ö´Ðи±±¾É±¹ÖÂß¼
|
# @param curPlayer ɱ¹ÖµÄÈË
|
# @param curNPC ±»É±µÄ¹Ö
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
|
if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:
|
return
|
if curNPC.GetNPCID() != GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_NeedKillNPCID):
|
return
|
|
#¾àÀë½áÊøÊ±¼ä´óÓÚ10Ãë
|
curtime = int(time.time())
|
lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
fightTime = __GetFightTime()[Def_TotalTime]
|
remainTime = fightTime - (curtime - lastStartTime)
|
if remainTime < 10:
|
#½áÊø
|
isEnd = True
|
|
else:
|
#FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
#PrepareXMZZPK(curPlayer, tick)
|
isEnd = False
|
HPPer = __GetHPPer(curPlayer)
|
__SendPKResult(curPlayer, 1, isEnd, HPPer)
|
return
|
|
##Íæ¼ÒËÀÍö.
|
# @param curPlayer:ËÀÍöµÄÍæ¼Ò
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.
|
def DoPlayerDead(curPlayer):
|
# if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:
|
# return
|
|
HPPer = __GetHPPer(curPlayer)
|
__SendPKResult(curPlayer, 0, 1, HPPer)
|
return
|
#
|
## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨
|
# @param attacker ¹¥»÷·½
|
# @param defender ·ÀÊØ·½
|
# @return bool
|
def CheckCanAttackTagObjInFB(attacker, defender):
|
gameFB = GameWorld.GetGameFB()
|
if gameFB.GetFBStep() != FB_Step_Fighting:
|
return False
|
return True
|
|
|
#def XMZZStartFight(curPlayer):
|
# #ÏÉħ֮Õù¿ªÊ¼Æ¥Åä
|
# #ÊÇ·ñÕýÔÚPKÖÐ
|
# curtime = int(time.time())
|
# lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
# fightTime = __GetFightTime()
|
# if lastStartTime and curtime - lastStartTime < fightTime:
|
# GameWorld.DebugLog(' ÏÉħ֮Õù¿ªÊ¼Æ¥Åä »¹ÔÚPKÖÐ!', curPlayer.GetID())
|
# return
|
#
|
# msgInfo = str([1]) # ÊÇ·ñ¸Õ¿ªÊ¼
|
# #Ôö¼Ó´ÎÊý
|
# GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZStartFight', msgInfo, len(msgInfo))
|
# return
|
#
|
#def XMZZStartFightResult(curPlayer, result):
|
# if not result:
|
# return
|
# FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_XMZZ, 1)
|
# curtime = int(time.time())
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, curtime)
|
# fightTime = __GetFightTime()
|
# curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime * 1000, True)
|
# return
|
|
|
|
def GetXMZZWinPrize(curPlayer, prizeEx):
|
'''
|
@todo: ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø
|
@param prizeEx:³¡Êý
|
'''
|
if not prizeEx:
|
GameWorld.DebugLog("ÁìÈ¡ÏÉħ֮ÕùʤÀû³¡Êý½±Àø: prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())
|
return
|
winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})
|
if str(prizeEx) not in winCntAwardDict:
|
GameWorld.DebugLog("²»ÄÜÁìÏÉħ֮ÕùʤÀû³¡Êý½±Àø! prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())
|
return
|
prizeItemList = winCntAwardDict[str(prizeEx)]
|
needSpace = len(prizeItemList)
|
emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if needSpace > emptySpace:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
|
return
|
|
msg = str([prizeEx])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "GetXMZZWinPrize", msg, len(msg))
|
return
|
|
|
|
def OnGetXMZZPrizeResult(curPlayer, funResult):
|
## ÏÉħ֮ÕùʤÀû³¡Êý½±Àø¸ø½±Àø
|
resultList = eval(funResult)
|
if len(resultList) != 1:
|
return
|
prizeEx = resultList[0]
|
winCntAwardDict = IpyGameDataPY.GetFuncEvalCfg('XMZZAward', 1, {})
|
if str(prizeEx) not in winCntAwardDict:
|
GameWorld.DebugLog("²»ÄÜÁìÏÉħ֮ÕùʤÀû³¡Êý½±Àø! prizeEx=%s" % (prizeEx), curPlayer.GetPlayerID())
|
return
|
prizeItemList = winCntAwardDict[str(prizeEx)]
|
# ¸øÎïÆ· [½±ÀøÎïÆ·id,¸öÊý,ÊÇ·ñ°ó¶¨]
|
for itemID, itemCnt, isBind in prizeItemList:
|
if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]):
|
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.ErrLog("OnGetXMZZPrizeResult(), give item itemid:%s,count:%s" % (itemID, itemCnt), playerID)
|
return False
|
|
|
# ¼Ç¼Áìȡʼþ
|
addDataDict = {"prizeEx":prizeEx, "prizeItemList":prizeItemList}
|
DataRecordPack.DR_FuncGiveItem(curPlayer, "XMZZWin", addDataDict)
|
return
|
|
def DoXMZZPKInfoLogic(curPlayer, resultList, tick):
|
'''ÏÉħ֮ÕùPKÐÅÏ¢Âß¼´¦Àí
|
@param resultList:
|
'''
|
if not resultList or len(resultList) != 2:
|
return
|
|
overInfo, vsPlayerInfo = resultList
|
|
# PK½á¹û´¦Àí
|
if overInfo:
|
DoXMZZPKOverLogic(curPlayer, overInfo)
|
|
# ¶ÔÊÖÐÅÏ¢´¦Àí
|
if vsPlayerInfo:
|
PrepareXMZZPK(curPlayer, tick, vsPlayerInfo)
|
|
return
|
|
def DoXMZZPKOverLogic(curPlayer, resultList):
|
#PK½áÊø
|
if len(resultList) != 5:
|
return
|
isWin, isEnd, addScore, addPer, conWinCnt = resultList
|
reExp = PlayerControl.GetPlayerReExp(curPlayer)
|
if isWin:
|
winAddExpFormula = IpyGameDataPY.GetFuncCfg('XMZZPKAward', 4)
|
addExp = eval(FormulaControl.GetCompileFormula("winXMZZAddExp", winAddExpFormula))
|
else:
|
failAddExpFormula = IpyGameDataPY.GetFuncCfg('XMZZPKAward', 5)
|
addExp = eval(FormulaControl.GetCompileFormula("failXMZZAddExp", failAddExpFormula))
|
PlayerControl.PlayerControl(curPlayer).AddExp(addExp)
|
|
playerID = curPlayer.GetID()
|
gameFB = GameWorld.GetGameFB()
|
exp = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalExp)
|
expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalExpPoint)
|
totalExp = expPoint * ChConfig.Def_PerPointValue + exp
|
updTotalExp = totalExp + addExp
|
updExp = updTotalExp % ChConfig.Def_PerPointValue
|
updExpPoint = updTotalExp / ChConfig.Def_PerPointValue
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalExp, updExp)
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalExpPoint, updExpPoint)
|
|
addExtraExp = int(addExp / float(addPer + 100) * addPer)
|
extraExp = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraExp)
|
extraExpPoint = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraExpPoint)
|
extraTotalExp = extraExpPoint * ChConfig.Def_PerPointValue + extraExp
|
updExtraTotalExp = extraTotalExp + addExtraExp
|
updExtraExp = updExtraTotalExp % ChConfig.Def_PerPointValue
|
updExtraExpPoint = updExtraTotalExp / ChConfig.Def_PerPointValue
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraExp, updExtraExp)
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraExpPoint, updExtraExpPoint)
|
|
tatalScore = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_TotalScore)
|
updScore = tatalScore + addScore
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_TotalScore, updScore)
|
addExtraScore = int(addScore / float(addPer + 100) * addPer)
|
extraScore = gameFB.GetPlayerGameFBDictByKey(playerID, XMZZ_ExtraScore)
|
updExtraScore = extraScore + addExtraScore
|
gameFB.SetPlayerGameFBDict(playerID, XMZZ_ExtraScore, updExtraScore)
|
|
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZGetScore, addScore)
|
if isWin:
|
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XMZZWinCnt, 1)
|
gameFB.SetGameFBDict(XMZZ_WinCnt, gameFB.GetGameFBDictByKey(XMZZ_WinCnt)+1)
|
DoFBHelp(curPlayer, 0)
|
if isEnd or not isWin:
|
lastStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XMZZLastStartTime)
|
curTime = int(time.time())
|
costTime = (curTime-lastStartTime)*1000
|
overDict = {FBCommon.Over_score:updScore, FBCommon.Over_extrScore:updExtraScore,
|
FBCommon.Over_extraExp:updExtraExp, FBCommon.Over_extraExpPoint:updExtraExpPoint,
|
FBCommon.Over_exp:updExp, FBCommon.Over_expPoint:updExpPoint, FBCommon.Over_costTime:costTime,
|
'conWinCnt':conWinCnt}
|
FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_XMZZ, 0, isWin, overDict)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XMZZLastStartTime, 0)
|
curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, __GetFightTime()[Def_LeaveTime] * 1000, True)
|
FBCommon.SetFBStep(FB_Step_Over, GameWorld.GetGameWorld().GetTick())
|
|
return
|
|
|
|
## »ñµÃ¸±±¾°ïÖúÐÅÏ¢
|
# @param curPlayer µ±Ç°Íæ¼Ò£¨±»Í¨Öª¶ÔÏó£©
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
def DoFBHelp(curPlayer, tick):
|
winCnt = GameWorld.GetGameFB().GetGameFBDictByKey(XMZZ_WinCnt)
|
FBCommon.Notify_FBHelp(curPlayer, {'winCnt':winCnt})
|
return
|
|
|
|
|
# {"0":["17:00", "19:57", "20:30", 2000000],}
|
#// AB 03 ÏÉħ֮ÕùѺע #tagCMXMZZBet
|
#
|
#struct tagCMXMZZBet
|
#{
|
# tagHead Head;
|
# BYTE BetIndex; // ѺעË÷Òý
|
# BYTE BetResult; // ½á¹û 1-ÏÉ×åÓ® 2-ħ×åÓ®
|
#};
|
def OnXMZZBet(index, clientData, tick):
|
## ÏÉħ֮ÕùͶע
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
betIndex = clientData.BetIndex
|
betResult = clientData.BetResult
|
betTimeDict = IpyGameDataPY.GetFuncEvalCfg('XMZZBetCfg')
|
if str(betIndex) not in betTimeDict:
|
GameWorld.DebugLog(' ÏÉħ֮ÕùͶע XMZZBetTime ÅäÖÃÀïûÓÐË÷Òý %s' % betIndex)
|
return
|
#Åжϻ״̬
|
key = ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_XMZZ
|
if GameWorld.GetGameWorld().GetGameWorldDictByKey(key) in [0]:
|
GameWorld.DebugLog(' ÏÉħ֮ÕùͶע ²»ÔÚͶעʱ¼äÄÚ Ë÷Òý %s' % betIndex)
|
return
|
|
|
betInfo = betTimeDict[str(betIndex)]
|
# ÅжÏʱ¼ä
|
curTime = str(GameWorld.GetCurrentDataTimeStr())[11:16]
|
startTime, endTime = betInfo[Bet_StartTime], betInfo[Bet_EndTime]
|
if not (startTime <= curTime <= endTime):
|
GameWorld.DebugLog(' ÏÉħ֮ÕùͶע ²»ÔÚͶעʱ¼äÄÚ Ë÷Òý %s' % betIndex)
|
return
|
|
#ÅжÏÇ®
|
needMoneyDict = betInfo[Bet_NeedMoney]
|
keyList = needMoneyDict.keys()
|
keyList.sort()
|
worldLv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
findLv = keyList[-1]
|
for lv in keyList:
|
if worldLv < int(lv):
|
findLv = lv
|
break
|
needMoney = needMoneyDict[findLv]
|
if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, needMoney):
|
GameWorld.DebugLog(' ÏÉħ֮ÕùͶע Ç®²»¹» Ë÷Òý %s' % betIndex)
|
return
|
|
#·¢ÖÁGameServer
|
msgInfo = str([betIndex, betResult, needMoney])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'XMZZBet', msgInfo, len(msgInfo))
|
return
|
|
|
|
def DoXMZZBetCost(curPlayer, needMoney):
|
#ÏÉħ֮ÕùѺע¿ÛÇ®
|
PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, needMoney)
|
return
|