comparison gamelib/gameboard.py @ 556:46f6f1a98f3f

Add warning dialogs for dangerous operations
author Neil Muller <drnlmuller@gmail.com>
date Sat, 28 Nov 2009 18:04:28 +0000
parents 7963fc09fac2
children 50d6c68ce267
comparison
equal deleted inserted replaced
555:296c73dcd286 556:46f6f1a98f3f
421 if building and building.HENHOUSE: 421 if building and building.HENHOUSE:
422 self.open_building_dialog(building, False, do_sell) 422 self.open_building_dialog(building, False, do_sell)
423 return 423 return
424 do_sell(chick) 424 do_sell(chick)
425 else: 425 else:
426 for chick in self.selected_chickens[:]: 426 def sure(val):
427 do_sell(chick) 427 if val:
428 for chick in self.selected_chickens[:]:
429 do_sell(chick)
430 if self._check_dangerous_sale():
431 dialog = misc.CheckDialog(sure,
432 "These chickens have equipment or eggs. Do you want to sell?",
433 "Yes, Sell Them", "No, Don't Sell", None)
434 self.disp.open(dialog)
435 else:
436 sure(1)
428 437
429 def sell_one_egg(self, chicken): 438 def sell_one_egg(self, chicken):
430 if chicken.eggs: 439 if chicken.eggs:
431 self.add_cash(self.level.sell_price_egg) 440 self.add_cash(self.level.sell_price_egg)
432 chicken.remove_one_egg() 441 chicken.remove_one_egg()
454 self.open_building_dialog(building, False, do_sell) 463 self.open_building_dialog(building, False, do_sell)
455 else: 464 else:
456 for chicken in self.selected_chickens: 465 for chicken in self.selected_chickens:
457 do_sell(chicken) 466 do_sell(chicken)
458 467
468 def _check_dangerous_sale(self):
469 # Dangerous sales are: selling chickens with equipment & selling
470 # chickens with eggs
471 for chick in self.selected_chickens:
472 if chick.eggs or chick.weapons() or chick.armour():
473 return True
474 return False
475
476 def _check_dangerous_move(self, building=None):
477 # Dangerous move involves moving chickens WITH eggs out of their
478 # current building
479 for chick in self.selected_chickens:
480 if chick.eggs and chick.abode and \
481 chick.abode.building is not building:
482 return True
483 return False # safe move
484
459 def select_animal(self, animal): 485 def select_animal(self, animal):
460 self.selected_chickens.append(animal) 486 self.selected_chickens.append(animal)
461 animal.equip(equipment.Spotlight()) 487 animal.equip(equipment.Spotlight())
462 488
463 def unselect_all(self): 489 def unselect_all(self):
487 return # do nothing 513 return # do nothing
488 elif chicken in self.selected_chickens: 514 elif chicken in self.selected_chickens:
489 self.unselect_animal(chicken) 515 self.unselect_animal(chicken)
490 else: 516 else:
491 self.select_animal(chicken) 517 self.select_animal(chicken)
518
519 def _do_move_selected(self, building, tile_pos):
520 """Internal helper function for place_animal"""
521 if building and building.ABODE:
522 for chicken in self.selected_chickens[:]:
523 try:
524 place = building.first_empty_place()
525 self.relocate_animal(chicken, place=place)
526 chicken.equip(equipment.Nest())
527 self.unselect_animal(chicken)
528 except buildings.BuildingFullError:
529 pass
530 try:
531 # if there's a space left, open the building
532 building.first_empty_place()
533 self.open_building_dialog(building, True)
534 except buildings.BuildingFullError:
535 pass
536 if not self.selected_chickens:
537 # if we placed all the chickens, switch to select cursor
538 pygame.mouse.set_cursor(*cursors.cursors['select'])
539 elif self.tv.get(tile_pos) == self.GRASSLAND:
540 for chicken in self.selected_chickens:
541 try_pos = tile_pos
542 cur_chick = self.get_outside_chicken(try_pos)
543 if cur_chick == chicken:
544 continue
545 if cur_chick:
546 try_pos = None
547 # find a free square nearby
548 poss = [(tile_pos[0] + x, tile_pos[1] + y)
549 for x in range(-1, 2) for y in range(-1, 2)
550 if (x, y) != (0, 0)]
551 poss.extend([(tile_pos[0] + x, tile_pos[1] + y)
552 for x in range(-2, 3, 2) for y in range(-2, 3)
553 if (x, y) != (0, 0)])
554 for cand in poss:
555 if self.tv.get(cand) == self.GRASSLAND and \
556 not self.get_outside_chicken(cand):
557 try_pos = cand
558 break
559 if try_pos:
560 chicken.unequip_by_name("Nest")
561 self.relocate_animal(chicken, tile_pos=try_pos)
562 chicken.remove_eggs()
563
492 564
493 def place_animal(self, tile_pos): 565 def place_animal(self, tile_pos):
494 """Handle an TOOL_PLACE_ANIMALS click. 566 """Handle an TOOL_PLACE_ANIMALS click.
495 567
496 This will either select an animal or 568 This will either select an animal or
503 self.select_animal(chicken) 575 self.select_animal(chicken)
504 pygame.mouse.set_cursor(*cursors.cursors['chicken']) 576 pygame.mouse.set_cursor(*cursors.cursors['chicken'])
505 return 577 return
506 elif tile_pos: 578 elif tile_pos:
507 building = self.get_building(tile_pos) 579 building = self.get_building(tile_pos)
508 if building and building.ABODE: 580 def sure(val):
509 for chicken in self.selected_chickens[:]: 581 if val:
510 try: 582 self._do_move_selected(building, tile_pos)
511 place = building.first_empty_place() 583
512 self.relocate_animal(chicken, place=place) 584 if self._check_dangerous_move(building):
513 chicken.equip(equipment.Nest()) 585 dialog = misc.CheckDialog(sure,
514 self.unselect_animal(chicken) 586 "These chickens have eggs. Do you want to move them?",
515 except buildings.BuildingFullError: 587 "Yes, Move Them", "No, Don't Move", None)
516 pass 588 self.disp.open(dialog)
517 try: 589 else:
518 # if there's a space left, open the building 590 sure(1)
519 building.first_empty_place()
520 self.open_building_dialog(building, True)
521 except buildings.BuildingFullError:
522 pass
523 if not self.selected_chickens:
524 # if we placed all the chickens, switch to select cursor
525 pygame.mouse.set_cursor(*cursors.cursors['select'])
526 return
527 if self.tv.get(tile_pos) == self.GRASSLAND:
528 for chicken in self.selected_chickens:
529 try_pos = tile_pos
530 cur_chick = self.get_outside_chicken(try_pos)
531 if cur_chick == chicken:
532 continue
533 if cur_chick:
534 try_pos = None
535 # find a free square nearby
536 poss = [(tile_pos[0] + x, tile_pos[1] + y)
537 for x in range(-1, 2) for y in range(-1, 2)
538 if (x, y) != (0, 0)]
539 poss.extend([(tile_pos[0] + x, tile_pos[1] + y)
540 for x in range(-2, 3, 2) for y in range(-2, 3)
541 if (x, y) != (0, 0)])
542 for cand in poss:
543 if self.tv.get(cand) == self.GRASSLAND and \
544 not self.get_outside_chicken(cand):
545 try_pos = cand
546 break
547 if try_pos:
548 chicken.unequip_by_name("Nest")
549 self.relocate_animal(chicken, tile_pos=try_pos)
550 chicken.remove_eggs()
551 591
552 def relocate_animal(self, chicken, tile_pos=None, place=None): 592 def relocate_animal(self, chicken, tile_pos=None, place=None):
553 assert((tile_pos, place) != (None, None)) 593 assert((tile_pos, place) != (None, None))
554 if chicken.abode is not None: 594 if chicken.abode is not None:
555 chicken.abode.clear_occupant() 595 chicken.abode.clear_occupant()