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
|
Unit = class(AIBase)
function Unit:SetEngineRepresentation(engineUnit)
self.engineUnit = engineUnit
self.engineID = engineUnit:ID()
end
function Unit:Internal()
return self.engineUnit
end
function Unit:Init()
if self.engineUnit == nil then
game:SendToConsole("nil engineUnit?!")
end
self.behaviours = {}
self.behaviourvalues = {}
end
function Unit:Update()
if self.behaviours == nil then
self.behaviours = {}
end
for k,v in pairs(self.behaviours) do
v:Update()
end
end
function Unit:GameEnd()
for k,v in pairs(self.behaviours) do
v:GameEnd()
end
end
function Unit:UnitCreated(unit)
for k,v in pairs(self.behaviours) do
v:UnitCreated(unit)
end
end
function Unit:UnitBuilt(unit)
self:ElectBehaviour()
for k,v in pairs(self.behaviours) do
v:UnitBuilt(unit)
end
end
function Unit:UnitDead(unit)
for k,v in pairs(self.behaviours) do
v:UnitDead(unit)
end
if unit.engineID == self.engineID then
if self.behaviours then
for k,v in pairs(self.behaviours) do
self.behaviours[k]:OwnerDied()
self.behaviours[k] = nil
end
self.behaviours = nil
end
self.engineUnit = nil
end
end
function Unit:UnitDamaged(unit,attacker,damage)
for k,v in pairs(self.behaviours) do
v:UnitDamaged(unit,attacker,damage)
end
end
function Unit:UnitIdle(unit)
for k,v in pairs(self.behaviours) do
v:UnitIdle(unit)
end
end
function Unit:UnitMoveFailed(unit)
for k,v in pairs(self.behaviours) do
v:UnitMoveFailed(unit)
end
end
function Unit:AddBehaviour(behaviour)
table.insert(self.behaviours,behaviour)
end
function Unit:ActiveBehaviour()
return self.activebeh
end
function Unit:ElectBehaviour()
if self.behaviours == nil then --probably we are dead.
return
end
local bestbeh = nil
local bestscore = -1
if #self.behaviours > 0 then
for k,v in pairs(self.behaviours) do
if bestbeh == nil then
bestbeh = v
bestscore = v:Priority()
else
local score = v:Priority()
if score > bestscore then
bestscore = score
bestbeh = v
end
end
end
if self.activebeh ~= bestbeh then
if self.activebeh ~= nil then
self.activebeh:Deactivate()
end
self.activebeh = bestbeh
self.activebeh:Activate()
end
end
end
|