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
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package NPCAI.AIType_3
#
# @todo:ÎïÆ·ÕÙ»½ÊÞAI
# @author hxp
# @date 2015-4-16
# @version 1.0
#
# ÏêϸÃèÊö: ÎïÆ·ÕÙ»½ÊÞAI, ÓгðºÞʱ½øÐз´»÷
#
#---------------------------------------------------------------------
"""Version = 2015-04-16 15:00"""
#---------------------------------------------------------------------
 
import IPY_GameWorld
import GameWorld
import NPCCommon
import BaseAttack
import ChConfig
import AICommon
import GameObj
#---------------------------------------------------------------------
 
## ³õʼ³ðºÞ
#  @param curNPC ÊµÀý
#  @return None
def DoInit(curNPC):
    curNPC.GetNPCAngry().Init(ChConfig.Def_BossAngryCount)
    return
 
 
## AIÑ­»·µ÷ÓÃ
#  @param curNPC ÊµÀý
#  @return None
def ProcessAI(curNPC, tick):
    
    if not curNPC.IsAlive():
        #NPCËÀÍö
        return
    
    curNPCControl = NPCCommon.NPCControl(curNPC)
    if curNPC.GetLastTime() != 0 and tick - curNPC.GetBornTime() >= curNPC.GetLastTime():
        #ÕÙ»½ÊÞ³¬¹ý´æ»îʱ¼ä, ÉèÖÃËÀÍö
        curNPCControl.SetKilled()
        return
 
    if not curNPC.GetCanAttack():
        curNPC.SetCanAttack(True)
        
    #Ë¢ÐÂ×Ô¼ºµÄbuff
    curNPCControl.RefreshBuffState(tick)
    if GameObj.GetHP(curNPC) == 0 :
        # BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö
        return
    
    if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove and curNPC.GetCurMoveType() == IPY_GameWorld.mtRun:
        return
 
    #Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁбí
    curNPCControl.RefreshAngryList(tick)
    
    if not curNPC.GetIsNeedProcess():
        return
    
    curAngry = curNPCControl.GetMaxAngryTag()
    if curAngry == None:
        return
    
    #¹¥»÷Âß¼­
    __NPCFight(curNPC, curAngry.GetObjID(), curAngry.GetObjType(), tick)
    return
 
 
## Õ½¶·
#  @param curNPC ÊµÀý
#  @param tagID ¹¥»÷Ä¿±êID
#  @param tagType ¹¥»÷Ä¿±êÀàÐÍ
#  @param tick µ±Ç°Ê±¼ä
#  @return None
def __NPCFight(curNPC, tagID, tagType, tick):
    curNPCControl = NPCCommon.NPCControl(curNPC)
    
    #¿ªÊ¼¹¥»÷
    curTag = GameWorld.GetObj(tagID, tagType)
    
    if curTag == None or GameObj.GetHP(curTag) <= 0:
        return
    
    tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
    
    #---ÓÅÏÈÊͷż¼ÄÜ---
    if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):
        return
 
    #---ÊÍ·ÅÆÕͨ¹¥»÷---
    if tagDist > curNPC.GetAtkDist():
        curNPCControl.MoveToObj_Detel(curTag)
        return
    
    #¹¥»÷Âß¼­
    if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
        #¹¥»÷¼ä¸ôûÓе½, ·µ»Ø
        return
    
    if curNPCControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
        #ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»ÖÃ
        return
    
    #ÆÕͨ¹¥»÷
    BaseAttack.Attack(curNPC, curTag, None, tick)
    return