b925c326e435dd507caf003744d2e8a827ad87b5
[roguelike.git] / ai.py
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # Copyright © 2008 Neil Moore <neil@s-z.org>.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #  
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20 import math
21
22 import creature
23
24 class Monster (creature.Creature):
25     def __init__(self, location=None):
26         super(Monster,self).__init__(location)
27
28     def tick(self):
29         super(Monster, self).tick()
30         if not self.dead:
31             self.act()
32     
33     def vis_creatures(self):
34         (my, mx) = (self.location.y, self.location.x)
35
36         return sorted(
37                 (critter
38                     for (cy, cx) in self.visibles()
39                     if (cy, cx) != (my, mx)
40                     for critter in self.level().loc(cy, cx)._creatures),
41                 key = lambda c: math.sqrt(
42                     (c.location.y - my)**2 + (c.location.x - mx)**2))
43
44     def act(self):
45         (my, mx) = (self.location.y, self.location.x)
46
47         for c in self.vis_creatures():
48             (dy, dx) = (c.location.y - my, c.location.x - mx)
49
50             if abs(dy) + abs(dx) <= 1:
51                 pass
52             elif abs(dy) > abs(dx):
53                 if dy < 0:
54                     self.move_north()
55                 else:
56                     self.move_south()
57             else:
58                 if dx < 0:
59                     self.move_west()
60                 else:
61                     self.move_east()
62
63             break