comparison gamelib/gameboard.py @ 474:a50b53983389

Allow moving multiple animals more easily
author Neil Muller <drnlmuller@gmail.com>
date Wed, 25 Nov 2009 16:42:28 +0000
parents 4b8ca482ea08
children d4f04d81fe54
comparison
equal deleted inserted replaced
473:4b8ca482ea08 474:a50b53983389
187 sprite_curs = None 187 sprite_curs = None
188 if buildings.is_building(tool): 188 if buildings.is_building(tool):
189 sprite_curs = sprite_cursor.SpriteCursor(tool.IMAGE, self.tv, tool.BUY_PRICE) 189 sprite_curs = sprite_cursor.SpriteCursor(tool.IMAGE, self.tv, tool.BUY_PRICE)
190 elif equipment.is_equipment(tool): 190 elif equipment.is_equipment(tool):
191 sprite_curs = sprite_cursor.SpriteCursor(tool.CHICKEN_IMAGE_FILE, self.tv) 191 sprite_curs = sprite_cursor.SpriteCursor(tool.CHICKEN_IMAGE_FILE, self.tv)
192 elif tool == constants.TOOL_PLACE_ANIMALS and self.selected_chickens:
193 cursor = cursors.cursors['chicken']
192 self.set_cursor(cursor, sprite_curs) 194 self.set_cursor(cursor, sprite_curs)
193 return True 195 return True
194 196
195 def apply_tool_to_selected(self, tool): 197 def apply_tool_to_selected(self, tool):
196 if self.selected_chickens: 198 if self.selected_chickens:
326 if tile_pos: 328 if tile_pos:
327 chick = self.get_outside_chicken(tile_pos) 329 chick = self.get_outside_chicken(tile_pos)
328 if chick is None: 330 if chick is None:
329 building = self.get_building(tile_pos) 331 building = self.get_building(tile_pos)
330 if building and building.HENHOUSE: 332 if building and building.HENHOUSE:
331 self.open_building_dialog(building, do_sell) 333 self.open_building_dialog(building, False, do_sell)
332 return 334 return
333 do_sell(chick) 335 do_sell(chick)
334 else: 336 else:
335 for chick in self.selected_chickens[:]: 337 for chick in self.selected_chickens[:]:
336 do_sell(chick) 338 do_sell(chick)
356 return False 358 return False
357 359
358 if tile_pos: 360 if tile_pos:
359 building = self.get_building(tile_pos) 361 building = self.get_building(tile_pos)
360 if building and building.HENHOUSE: 362 if building and building.HENHOUSE:
361 self.open_building_dialog(building, do_sell) 363 self.open_building_dialog(building, False, do_sell)
362 else: 364 else:
363 for chicken in self.selected_chickens: 365 for chicken in self.selected_chickens:
364 do_sell(chicken) 366 do_sell(chicken)
365 367
366 def select_animal(self, animal, extend=True): 368 def select_animal(self, animal, extend=True):
387 chicken = self.get_outside_chicken(tile_pos) 389 chicken = self.get_outside_chicken(tile_pos)
388 if chicken: 390 if chicken:
389 return chicken 391 return chicken
390 building = self.get_building(tile_pos) 392 building = self.get_building(tile_pos)
391 if building: 393 if building:
392 self.open_building_dialog(building) 394 self.open_building_dialog(building, False)
393 395
394 def select_chicken(self, tile_pos): 396 def select_chicken(self, tile_pos):
395 """Handle a select chicken event""" 397 """Handle a select chicken event"""
396 # Get the chicken at this position 398 # Get the chicken at this position
397 chicken = self.get_chicken_at_pos(tile_pos) 399 chicken = self.get_chicken_at_pos(tile_pos)
425 chicken.equip(equipment.Nest()) 427 chicken.equip(equipment.Nest())
426 pygame.mouse.set_cursor(*cursors.cursors['select']) 428 pygame.mouse.set_cursor(*cursors.cursors['select'])
427 except buildings.BuildingFullError: 429 except buildings.BuildingFullError:
428 pass 430 pass
429 else: 431 else:
430 self.open_building_dialog(building) 432 self.open_building_dialog(building, True)
431 return 433 return
432 if self.tv.get(tile_pos) == self.GRASSLAND: 434 if self.tv.get(tile_pos) == self.GRASSLAND:
433 for chicken in self.selected_chickens: 435 for chicken in self.selected_chickens:
434 # FIXME: find free square nearby 436 try_pos = tile_pos
435 if not self.get_outside_chicken(tile_pos): 437 if self.get_outside_chicken(try_pos):
438 try_pos = None
439 # find a free square nearby
440 poss = [(tile_pos[0] + x, tile_pos[1] + y)
441 for x in range(-1, 2) for y in range(-1, 2)
442 if (x, y) != (0, 0)]
443 poss.extend([(tile_pos[0] + x, tile_pos[1] + y)
444 for x in range(-2, 3, 2) for y in range(-2, 3)
445 if (x, y) != (0, 0)])
446 for cand in poss:
447 if self.tv.get(cand) == self.GRASSLAND and \
448 not self.get_outside_chicken(cand):
449 try_pos = cand
450 break
451 if try_pos:
436 chicken.unequip_by_name("Nest") 452 chicken.unequip_by_name("Nest")
437 self.relocate_animal(chicken, tile_pos=tile_pos) 453 self.relocate_animal(chicken, tile_pos=try_pos)
438 self.eggs -= chicken.get_num_eggs() 454 self.eggs -= chicken.get_num_eggs()
439 chicken.remove_eggs() 455 chicken.remove_eggs()
440 self.toolbar.update_egg_counter(self.eggs) 456 self.toolbar.update_egg_counter(self.eggs)
441 457
442 def relocate_animal(self, chicken, tile_pos=None, place=None): 458 def relocate_animal(self, chicken, tile_pos=None, place=None):
483 else: 499 else:
484 offset = None 500 offset = None
485 self.disp.open(tbl, pos=offset) 501 self.disp.open(tbl, pos=offset)
486 return tbl 502 return tbl
487 503
488 def open_building_dialog(self, building, sell_callback=None): 504 def open_building_dialog(self, building, fill_empty, sell_callback=None):
489 """Create dialog for manipulating the contents of a building.""" 505 """Create dialog for manipulating the contents of a building."""
490 506
491 place_button_map = {} 507 place_button_map = {}
492 508
493 def update_button(animal, empty=False): 509 def update_button(animal, empty=False):
511 else: 527 else:
512 # Attempt to sell the occupant 528 # Attempt to sell the occupant
513 sell_callback(place.occupant, update_button) 529 sell_callback(place.occupant, update_button)
514 else: 530 else:
515 # there is no occupant, attempt to fill the space 531 # there is no occupant, attempt to fill the space
516 if self.selected_chickens: 532 if self.selected_chickens and fill_empty:
517 # empty old nest (on button) 533 # empty old nest (on button)
518 update_button(self.selected_chickens[0], empty=True) 534 update_button(self.selected_chickens[0], empty=True)
519 self.relocate_animal(self.selected_chickens[0], place=place) 535 self.relocate_animal(self.selected_chickens[0], place=place)
520 # populate the new nest (on button) 536 # populate the new nest (on button)
521 update_button(self.selected_chickens[0]) 537 update_button(self.selected_chickens[0])
592 if chicken is None: 608 if chicken is None:
593 building = self.get_building(tile_pos) 609 building = self.get_building(tile_pos)
594 if not (building and building.ABODE): 610 if not (building and building.ABODE):
595 return 611 return
596 # Bounce through open dialog once more 612 # Bounce through open dialog once more
597 self.open_building_dialog(building, do_equip) 613 self.open_building_dialog(building, False, do_equip)
598 else: 614 else:
599 do_equip(chicken) 615 do_equip(chicken)
600 else: 616 else:
601 for chicken in self.selected_chickens: 617 for chicken in self.selected_chickens:
602 do_equip(chicken) 618 do_equip(chicken)
643 else: 659 else:
644 building = self.get_building(tile_pos) 660 building = self.get_building(tile_pos)
645 if building is None: 661 if building is None:
646 return 662 return
647 x, y = 50, 0 663 x, y = 50, 0
648 self.open_building_dialog(building, do_sell) 664 self.open_building_dialog(building, False, do_sell)
649 665
650 def open_equipment_dialog(self, chicken, x, y, update_button=None): 666 def open_equipment_dialog(self, chicken, x, y, update_button=None):
651 tbl = gui.Table() 667 tbl = gui.Table()
652 668
653 def sell_item(item, button): 669 def sell_item(item, button):