Mercurial > rinkhals
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() |