import bge
import math
def main():
cont = bge.logic.getCurrentController()
own = cont.owner
on = cont.sensors['On']
if own['Health']<=1:
own.scene.addObject('Explode',own,30)
for child in own.childrenRecursive:
if not child.invalid:
child.endObject()
own.endObject()
else:
if cont.sensors['Near'].positive:
d=100
for hit in cont.sensors['Near'].hitObjectList:
dist = own.getDistanceTo(hit)
if dist<d:
own['Target']=hit
own['Reset']=60
own['On']=True
d = dist
if 'parts' not in own:
p = []
c = []
for child in own.childrenRecursive:
if 'B_Tag' in child:
p.append( [ child, own.children[child['B_Tag'] ] ] )
if 'c' in child:
c.append(child)
child.color = [.25,.25,.25,1]
own['parts']=p
own['colorParts']=c
else:
for p in own['parts']:
p[1].removeParent()
p[1].worldPosition =p[0].worldPosition
p[1].worldOrientation = p[0].worldOrientation
p[1].setParent(own,1,0)
if on.positive:
if own['init']<=34:
cont.activate(cont.actuators['Wake'])
own['init']+=1
else:
cont.deactivate(cont.actuators['Wake'])
if own['BombTime']<15:
if own.localAngularVelocity.z < own.localLinearVelocity.magnitude:
if own.localLinearVelocity.magnitude>.15:
if abs(own.localLinearVelocity.x)>abs(own.localLinearVelocity.y):
own.children['Spider']['W']+=own.localLinearVelocity.x*.25
if own.children['Spider']['W']>40:
own.children['Spider']['W']=0
elif own.children['Spider']['W']<0:
own.children['Spider']['W']=40
cont.activate(cont.actuators['Walk'])
cont.deactivate(cont.actuators['Idle'])
cont.deactivate(cont.actuators['Wake'])
else:
#crab walk state
cont.deactivate(cont.actuators['Walk'])
cont.deactivate(cont.actuators['Idle'])
else:
#idle state
own['W']=0
cont.deactivate(cont.actuators['Walk'])
cont.activate(cont.actuators['Idle'])
elif abs(own.localAngularVelocity.z) >.25 :
#rotate in place state
pass
if 'Target' in own and own['init']>14:
if 'Path' not in own:
if own.getDistanceTo(own['Target'])>3:
own['Path'] = cont.actuators['Steering'].navmesh.findPath(own.worldPosition,own['Target'].worldPosition)
else:
v2 = own.getVectTo(own['Target'])
own.applyForce(v2[1] *( 5 + (15*v2[0]*v2[0]*v2[0])))
own.localLinearVelocity.y*=.25
own.localLinearVelocity.x*=.25
cont.activate(cont.actuators['Blow'])
cont.deactivate(cont.actuators['Walk'])
cont.deactivate(cont.actuators['Idle'])
cont.deactivate(cont.actuators['Wake'])
own.applyForce((0,0,9.9),0)
own.applyTorque((0,0,2),0)
if own['BombTime']<=99:
own['BombTime']+=1
for part in own['colorParts']:
part.color = [ .5+ math.cos((own['BombTime']*own['BombTime'])*.0125),0,0,1 ]
elif len(own['Path'])>=1:
if own.getDistanceTo(own['Target'])>=4:
p1 = own['Path'][0].copy()
p1.z = own.worldPosition.z
local = own.worldOrientation.inverted()*(p1 - own.worldPosition)
if local.magnitude>.75:
if local.x>0:
own.localLinearVelocity.y*=.75
own.alignAxisToVect(own.getVectTo(p1)[1],0,.125)
if abs(local.y) < local.x:
if own.localLinearVelocity.x<5:
own.applyForce((25,0,0),1)
else:
if local.y>0:
own.applyRotation((0,0,.1),0)
else:
own.applyRotation((0,0,-.1),0)
else:
own['Path'].pop(0)
else:
del own['Path']
else:
del own['Path']
if own['Reset']>=1:
own['Reset']-=1
elif 'Target' in own:
del own['Target']
if 'Target' in own:
if own.getDistanceTo(own['Target'])>6 and own['BombTime']>=1:
cont.deactivate(cont.actuators['Blow'])
own['BombTime']-=1
for p in own['colorParts']:
p.color = p.color.lerp([.25,.25,.25,1],.1)
elif own.getDistanceTo(own['Target'])<=2:
own.scene.addObject('Explode',own,15)
own.endObject()
if own['BombTime']>=100:
own.scene.addObject('Explode',own,15)
own.endObject()
main()
This is my ai for our recent bgmc 28 Lost star tribe
nothing fancey
turn in place if next point is behind -> run to path -> get to player -> explode.