1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GameWorldLogic.FBProcess.GameLogic_AlineInvade
#
# @todo:ÒìÊÞÈëÇÖ
# @author hxp
# @date 2024-05-16
# @version 1.0
#
# ÏêϸÃèÊö: ÒìÊÞÈëÇÖ
#
#-------------------------------------------------------------------------------
#"""Version = 2024-05-16 16:00"""
#-------------------------------------------------------------------------------
 
import ChConfig
import NPCCommon
import TurnAttack
import IpyGameDataPY
import PlayerBillboard
import ItemControler
import PlayerControl
import GameWorld
import FBCommon
 
def OnFBPlayerOnDay(curPlayer):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlineInvadeHurtTotalEx, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlineInvadeHurtTotal, 0)
    return
 
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
    ## »ØºÏÕ½¶·ÇëÇó - µØÍ¼ÑéÖ¤
    weekNPCIDList = IpyGameDataPY.GetFuncEvalCfg("AlineInvade", 1)
    curTime = GameWorld.GetCurrentTime()
    curWeekday = curTime.weekday()
    bossID = weekNPCIDList[curWeekday % len(weekNPCIDList)]
    if tagType != ChConfig.TurnBattle_TagType_NPC or tagID != bossID:
        GameWorld.ErrLog("ÒìÊÞÈëÇÖÄ¿±êbossID´íÎó£¬ÎÞ·¨ÌôÕ½! curWeekday=%s,bossID=%s,tagType=%s,tagID=%s" 
                         % (curWeekday, bossID, tagType, tagID), curPlayer.GetPlayerID())
        return False
    return True
 
def OnTurnFightPlayerFactionHurt(curPlayer, mapID, funcLineID, hurtObj, hurtValue, factionHurtValue):
    ## »ØºÏÕ½¶·Íæ¼ÒÕóÓªÉ˺¦±ä¸ü
    
    tfBattle = TurnAttack.GetTurnFightBattle()
    fbData = tfBattle.fbData
    
    boxNum = fbData.get("boxNum", 0) # µ±Ç°ºÐ×ÓÊý
    fbData["boxHurt"] = boxHurt = fbData.get("boxHurt", 0) + hurtValue # µ±Ç°ºÐ×ÓÒÑÀÛ¼ÆÉ˺¦
    
    ipyData = IpyGameDataPY.GetIpyGameData("AlineInvade", boxNum)
    if not ipyData:
        return
    needHurtValue = ipyData.GetNeedHurtValue()
    
    isBoxNumChange = False
    if boxHurt >= needHurtValue:
        isBoxNumChange = True
        boxHurt = factionHurtValue
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetAlineInvadeCount()):
            ipyData = ipyDataMgr.GetAlineInvadeByIndex(index)
            boxNum = ipyData.GetBoxNum()
            needHurtValue = ipyData.GetNeedHurtValue()
            if boxHurt >= needHurtValue:
                boxHurt -= needHurtValue
            else:
                break
            
    fbData["boxNum"] = boxNum
    fbData["boxHurt"] = boxHurt
    fbData["totalHurt"] = factionHurtValue
    
    helpDict = {FBCommon.Over_dataMapID:tfBattle.mapID, FBCommon.Over_lineID:tfBattle.funcLineID}
    helpDict.update(fbData)
    FBCommon.Notify_FBHelp(curPlayer, helpDict)
    
    if not isBoxNumChange:
        return
    
    tagNPC = tfBattle.GetTagMainObj()
    if tagNPC:
        GameWorld.DebugLog("boxNum±ä¸ü: %s" % (boxNum))
        NPCCommon.NPCControl(tagNPC).RefreshNPCAttrState()
        
    return
 
def CalcFBNPCPlusAttr(curNPC):
    ## ¸±±¾NPCÔö¼ÓÊôÐÔ
    # @return: Ôö¼ÓµÄÊôÐÔÐÅÏ¢ {attrID:value, ...}
    plusAttrDict = {}
    tfBattle = TurnAttack.GetTurnFightBattle()
    boxNum = tfBattle.fbData.get("boxNum", 0)
    
    ipyData = IpyGameDataPY.GetIpyGameData("AlineInvade", boxNum)
    if ipyData:
        plusAttrDict = ipyData.GetBossAttrPlusInfo()
        
    return plusAttrDict
 
def OnTurnFightIsWin(curPlayer, mapID, funcLineID, tagType, tagID, valueList, isWin):
    ## »ØºÏÕ½¶·¸±±¾ÊÇ·ñ»ñʤ
    if isWin == False:
        return isWin
    # Ö»Òª²»±»»÷°Ü¾ÍËãÓ®
    return True
 
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## »ØºÏÕ½¶·½áÊø
    # @return: ÊÇ·ñÐèҪͬ²½GameServer, ½±ÀøÁбí, Í¬²½½á¹ûÐÅÏ¢
    needSendGameServer = False
    isWin = fightRet[0]
    
    # ÎÞÂÛʤÀûÓë·ñ¶¼Ëã²ÎÓ룬¿Û´ÎÊý
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
    FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_TFMapID_AlineInvade)
    
    tfBattle = TurnAttack.GetTurnFightBattle()
    fbData = tfBattle.fbData
    
    playerID = curPlayer.GetPlayerID()
    GameWorld.DebugLog("ÒìÊÞÈëÇÖ½áËã: isWin=%s,fbData=%s" % (isWin, fbData), playerID)
    boxNum = fbData.get("boxNum", 0) # µ±Ç°ºÐ×ÓÊý
    totalHurt = fbData.get("totalHurt", 0) # ×ÜÉ˺¦
    
    awardItemDict = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetAlineInvadeCount()):
        ipyData = ipyDataMgr.GetAlineInvadeByIndex(index)
        if boxNum < ipyData.GetBoxNum():
            break
        awardWeightList = ipyData.GetBoxAwardWeightList()
        if not awardWeightList:
            continue
        awardItem = GameWorld.GetResultByWeightList(awardWeightList)
        if not awardItem:
            continue
        itemID = awardItem[0]
        itemCount = awardItem[1]
        awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount
        
    isAuctionItem = 0
    awardItemList = []
    for itemID, itemCount in awardItemDict.items():
        awardItemList.append([itemID, itemCount, isAuctionItem])
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["AlineInvade", False, {"boxNum":boxNum, "totalHurt":totalHurt}])
    
    # Í¬²½±¾ÈÕÀÛ¼ÆÉ˺¦°ñµ¥
    totalHurtTodayEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlineInvadeHurtTotalEx)
    totalHurtToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlineInvadeHurtTotal)
    totalHurtToday += totalHurtTodayEx * ChConfig.Def_PerPointValue
    
    updTotalHurtToday = totalHurtToday + totalHurt
    updTotalHurtTodayEx = updTotalHurtToday / ChConfig.Def_PerPointValue
    updTotalHurtToday = updTotalHurtToday % ChConfig.Def_PerPointValue
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlineInvadeHurtTotalEx, updTotalHurtTodayEx)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlineInvadeHurtTotal, updTotalHurtToday)
    GameWorld.DebugLog("¸üнñÈÕÀÛÉË: totalHurtToday=%s,addHurt=%s,updTotalHurtTodayEx=%s,updTotalHurtToday=%s" 
                       % (totalHurtToday, totalHurt, updTotalHurtTodayEx, updTotalHurtToday), playerID)
    PlayerBillboard.UpdateAlineInvadeBillboard(curPlayer)
    
    overInfoEx = fbData
    return needSendGameServer, awardItemList, overInfoEx