/usr/share/games/balder2d/scripts/balderai.py is in balder2d-data 1.0-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | import balder
from balderutil import entity, probe
import math, random
try:
import psyco
except ImportError:
# no psyco, so don't use it
pass
else:
psyco.full()
controlled_probes = {}
class probe_tracker:
def __init__(self):
self.lastfire = 0
self.pushtimer = 0
self.fireAtTarget = True
def incrementFrame(self):
self.lastfire += 1
def DestroyClosestProbe(probe_id, probe_dict):
inputs = 0
# first, lets find out where we are and where we are aiming
xloc = probe_dict[probe_id]['x']
yloc = probe_dict[probe_id]['y']
aiming = probe_dict[probe_id]['rotation_angle']
# aim for the closest probe
target = entity.FindClosestProbe(probe_id, probe_dict)
if not target in probe_dict:
return balder.INPUT_STICK
xtarget = probe_dict[target]['x']
ytarget = probe_dict[target]['y']
inputs = probe.AimProbeAt(probe_dict[probe_id], xtarget, ytarget)
if inputs == 0 and balder.IsLineOfSight((xloc,yloc),(xtarget,ytarget)):
inputs = balder.INPUT_FIRE
return inputs
def DoProbeControl(probe_id, probe_dict, projectile_list, powerup_list):
# don't try to do AI for non existant probes
if not probe_id in probe_dict:
return 0
global controlled_probes
if not probe_id in controlled_probes:
controlled_probes[probe_id] = probe_tracker()
closestprobe_id = entity.FindClosestProbe(probe_id, probe_dict)
thisprobe = controlled_probes[probe_id]
thisprobe.incrementFrame()
inputs = 0
# first, lets find out where we are and where we are aiming
xloc = probe_dict[probe_id]['x']
yloc = probe_dict[probe_id]['y']
aiming = probe_dict[probe_id]['rotation_angle']
# first look for powerups
if len(powerup_list) and probe_dict[probe_id]['stuck']:
thisprobe.fireAtTarget = False
xtarget, ytarget = entity.FindClosestEntity(xloc, yloc, powerup_list)
if not balder.IsLineOfSight((xloc,yloc),(xtarget,ytarget)):
thisprobe.fireAtTarget = True
inputs = DestroyClosestProbe(probe_id, probe_dict)
else:
inputs = probe.AimProbeAt(probe_dict[probe_id],xtarget, ytarget)
else:
# aim for the closest probe
thisprobe.fireAtTarget = True
inputs = DestroyClosestProbe(probe_id, probe_dict)
if inputs == balder.INPUT_FIRE:
if closestprobe_id in probe_dict:
closestprobe = probe_dict[closestprobe_id]
distance = entity.DistanceTo(xloc, yloc, closestprobe)
if (distance/10 - thisprobe.lastfire) < 0 \
and thisprobe.fireAtTarget:
thisprobe.lastfire = 0
else:
inputs = balder.INPUT_STICK
if probe_dict[probe_id]['stuck']:
if not thisprobe.pushtimer == 0:
inputs = inputs | balder.INPUT_STICK
thisprobe.pushtimer += 1
# push off after 20 frames
if thisprobe.pushtimer == 20:
thisprobe.pushtimer = 0
else:
inputs = inputs | balder.INPUT_STICK
return inputs
|