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