Temple of The Roguelike Forums
Development => Programming => Topic started by: MisterMoxxie on April 24, 2012, 02:01:23 AM
-
Hello! I've been following the 'complete roguelike tutorial using Python and Libtcod' tutorial, and it's been wonderful.
I finished the whole of the tutorial, and have since begun rewriting the AI. I want to create a need-driven AI, but I'm having a bit of trouble. I'm trying to use the FOV kit within libtcod to create a field of view from the creature, and then create a list of all of the objects that creature can see.
Here's what I have so far.
class AI_Evaluate
#AI Component - Creature is evaluating it's situation
objects = [] #a list of all the objects the creature can see
#get an FOV for the creature
my_fov = libtcod.map_new(MAP_WIDTH, MAP_HEIGHT)
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
libtcod.map_set_properties(my_fov, self.x, self.y, not map[x][y].block_sight, not map[x][y].blocked)
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
#visible = libtcod.map_is_in_fov(my_fov, x, y)
#if visible:
#if there is an object here:
#objects.append(object)
any ideas?
-
Is there an error here? Or is it just not working? What is the behavior? What's the problem specifically?
EDIT: I guess your algorithm seems sound. I don't know enough about this language though, sorry.
-
Well the last few lines, after 'for x in range(MAP_HEIGHT_:' are all pseudo-code, commented out. I think I may have figured it out though, trying this where 'objects' is a global list of all the objects on the current dungeon level.
class AI_Evaluate:
#AI Component - Creature is evaluating it's situation
creature = self.owner
myobjects = [] #a list of all the objects the creature can see
#get an FOV for the creature
my_fov = libtcod.map_new(MAP_WIDTH, MAP_HEIGHT)
for y in range(MAP_HEIGHT):
for x in range(MAP_WIDTH):
for object in objects:
if self.x = x:
if self.y = y:
myobjects.append(object)
for object in myobjects:
if object != None:
#assign need values
-
So after working on this for a while, I've come up with a solution (possibly). Libtcod has a built in line-drawing function. So I was thinking during the AI loop, draw a line from the creature to each object in the dungeon. If there are no obstructions then that creature can see that item. Here's what I have so far, but when I run it, the game freezes. I'm not sure if the loop is infinite maybe, or if it's just THAT much overhead?! Sorry, I'm still very new to Python.
def CanSee(self, o):
#Returns true if this fighter can see the object
monster = self.owner
if o.fighter:
Object = o.owner
else:
Object = o
libtcod.line_init(monster.x, monster.y, Object.x, Object.y)
x,y=libtcod.line_step()
while (not x is None ):
for object in objects:
if map[x][y].blocked == False:
if object.x == x and object.y == y:
return True
x,y=libtcod.line_step()
return False