xdh
2019-03-02 0f297a5b66b91751d8342624db871efeca7ed94e
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
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package Event.EventSrc.Operate_EquipStar
#
# @todo:¹«¹²²¿Î»ÐÇÊý
# @author xdh
# @date 2019-3-1
# @version 1.0
#
# ÏêϸÃèÊö: ¹«¹²²¿Î»ÐÇÊý
#
#
#---------------------------------------------------------------------
#"""Version = 2019-3-1 18:00"""
#---------------------------------------------------------------------
import ItemCommon
import ShareDefine
import PlayerControl
import IPY_GameWorld
import DataRecordPack
import IpyGameDataPY
import GameWorld
import ChConfig
import ChEquip
#-------------------------------------------------------------------------------------------
 
 
#===============================================================================
#// A5 C5 ×°±¸²¿Î»ÉýÐÇ #tagCMEquipPartStarUp
#struct    tagCMEquipPartStarUp
#{
#    tagHead        Head;
#    WORD    EquipPackIndex;    // ²¿Î»¸ñ×ÓË÷Òý
#    BYTE    CostEquipCnt;    // ×°±¸¸öÊý
#    WORD    CostEquipIndex[CostEquipCnt];    // ×°±¸Ë÷Òý
#    DWORD    CostEquipID[CostEquipCnt];    // ×°±¸ÎïÆ·ID
#};
#===============================================================================
## ²¿Î»ÉýÐÇ
#  @param playerIndex: Íæ¼Ò
#  @param clientData: ·â°ü
#  @param tick: µ±Ç°Ê±¼ä
#  @return None
def OnEquipPartStarUp(playerIndex, clientData, tick):    
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    playerID = curPlayer.GetPlayerID()
    
    equipPackIndex = clientData.EquipPackIndex
    packType = IPY_GameWorld.rptEquip
    
    if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
        return
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex})
    if not ipyData:
        return
    classLV = ipyData.GetClassLV()
    equipPlace = ipyData.GetEquipPlace()
    placeList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
    if equipPlace not in placeList:
        GameWorld.Log("    equipPlace %s not in ChConfig.Pack_EquipPart_CanPlusStar" % equipPlace, playerID)
        return
    
    # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶
    curPack = curPlayer.GetItemManager().GetPack(packType)
    curEquip = curPack.GetAt(equipPackIndex)
    if not curEquip or curEquip.IsEmpty():
        GameWorld.DebugLog("OnEquipPartStarUp() equip is empty")
        return
    
    maxStar = ItemCommon.GetItemMaxStar(curEquip)
    curPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
    if curPartStar >= maxStar:
        GameWorld.Log("OnEquipPartStarUp:curPartStar(%s) >= maxStar(%s)" % (curPartStar, maxStar), playerID)
        return
 
    # ÉýÐÇ´¦Àí
    result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData)
    
    updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
    GameWorld.DebugLog("   ×°±¸ÉýÐÇ equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID)
    if result == ChConfig.Def_ComposeState_Sucess:
        # ÐǼ¶±ä¸üʱ´¦Àí
        #Ë¢ÐÂÊôÐÔ
        ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
        playControl = PlayerControl.PlayerControl(curPlayer)
        playControl.RefreshPlayerAttrState()
  
        if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'):
            PlayerControl.WorldNotify(0, "StarLevelUp", [curPlayer.GetPlayerName(), curEquip.GetItemTypeID(), updPartStar])
        #EventShell.EventRespons_EquipPlus(curPlayer)
    return
     
 
## ¿ªÊ¼×°±¸ÉýÐÇ
#  @param index Îª×°±¸Î»
#  @return 
def DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData):
    result = ChConfig.Def_ComposeState_None
    nextStar = curPartStar + 1
    ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar)
    if not ipyData:
        return result
    
    costEquipCnt = ipyData.GetCostEquipCnt()
    if clientData.CostEquipCnt < costEquipCnt:
        GameWorld.DebugLog(' ¿ªÊ¼×°±¸ÉýÐÇ,×°±¸²ÄÁϲ»×ã %s' % costEquipCnt)
        return result
    costEquipPlaceList = ipyData.GetCostEquipPlace()
    costEquipColorList = ipyData.GetCostEquipColor()
    suitTotalRate = ipyData.GetSuitTotalRate()
    singleSuitRate = float(suitTotalRate) / costEquipCnt
    curRate = 0  #³É¹¦¸ÅÂÊ
    delEquipIndexList = []
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    for i, index in enumerate(clientData.CostEquipIndex):
        costEquip = itemPack.GetAt(index)
        if not costEquip or costEquip.IsEmpty():
            return result
        equipID = costEquip.GetItemTypeID()
        if equipID != clientData.CostEquipID[i]:
            GameWorld.ErrLog('   ×°±¸ÉýÐÇ ¿Í»§¶Ë·¢µÄÎïÆ·Ë÷ÒýÓëʵ¼ÊÎïÆ·ID²»¶ÔÓ¦  index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, clientData.CostEquipID[i]))
            return result
        if costEquip.GetItemColor() not in costEquipColorList:
            return result
        if costEquip.GetEquipPlace() not in costEquipPlaceList:
            return result
        delEquipIndexList.append(index)
        isSuite = costEquip.GetSuiteID()
        addRate = singleSuitRate if isSuite else singleSuitRate / 2
        curRate += addRate
    if curRate <= 0:
        GameWorld.Log('×°±¸ÉýÐÇÒì³£ ¸ÅÂÊΪ0£¡£¡equipPackIndex=%s'%equipPackIndex)
        return result
    #ÅÐ¶ÏÆÕͨÎïÆ·²ÄÁÏ
    costItemDict = ipyData.GetCostItemDict()
    if costItemDict:
        delItemDict = {}
        for itemID, itemCnt in costItemDict.items():
            hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
            if not hasEnough:
                return result
            delItemDict[tuple(indexList)] = itemCnt
        for itemIndexList, delCnt in delItemDict.items():
            ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipStarUp)
    #¿Û×°±¸
    ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp)
    isOK = GameWorld.CanHappen(curRate, 100)
    if isOK:
        ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, nextStar)
        ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex)
        result = ChConfig.Def_ComposeState_Sucess
    else:
        result = ChConfig.Def_ComposeState_Fail
    curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipStarUp, result)
    drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK,
              "curRate":curRate, "nextStar":nextStar}
    DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer)
    return result