… | |
… | |
778 | * Remove and free all objects in the given map. |
778 | * Remove and free all objects in the given map. |
779 | */ |
779 | */ |
780 | void |
780 | void |
781 | maptile::clear () |
781 | maptile::clear () |
782 | { |
782 | { |
783 | sfree (regions, size ()); regions = 0; |
|
|
784 | delete [] regionmap; regionmap = 0; |
|
|
785 | |
|
|
786 | if (spaces) |
783 | if (spaces) |
787 | { |
784 | { |
788 | for (mapspace *ms = spaces + size (); ms-- > spaces; ) |
785 | for (mapspace *ms = spaces + size (); ms-- > spaces; ) |
789 | while (object *op = ms->bot) |
786 | while (object *op = ms->bot) |
790 | { |
787 | { |
|
|
788 | // manually remove, as to not trigger anything |
|
|
789 | if (ms->bot = op->above) |
|
|
790 | ms->bot->below = 0; |
|
|
791 | |
|
|
792 | op->flag [FLAG_REMOVED] = true; |
|
|
793 | |
791 | op = op->head_ (); |
794 | object *head = op->head_ (); |
|
|
795 | if (op == head) |
|
|
796 | { |
792 | op->destroy_inv (false); |
797 | op->destroy_inv (false); |
793 | op->destroy (); |
798 | op->destroy (); |
|
|
799 | } |
|
|
800 | else if (head->map != op->map) |
|
|
801 | { |
|
|
802 | LOG (llevDebug, "bad luck for object crossing map borders: %s", head->debug_desc ()); |
|
|
803 | head->destroy (); |
|
|
804 | } |
794 | } |
805 | } |
795 | |
806 | |
796 | sfree (spaces, size ()), spaces = 0; |
807 | sfree (spaces, size ()), spaces = 0; |
797 | } |
808 | } |
798 | |
809 | |
799 | if (buttons) |
810 | if (buttons) |
800 | free_objectlinkpt (buttons), buttons = 0; |
811 | free_objectlinkpt (buttons), buttons = 0; |
|
|
812 | |
|
|
813 | sfree (regions, size ()); regions = 0; |
|
|
814 | delete [] regionmap; regionmap = 0; |
801 | } |
815 | } |
802 | |
816 | |
803 | void |
817 | void |
804 | maptile::clear_header () |
818 | maptile::clear_header () |
805 | { |
819 | { |
… | |
… | |
1596 | { |
1610 | { |
1597 | if (!sound) |
1611 | if (!sound) |
1598 | return; |
1612 | return; |
1599 | |
1613 | |
1600 | for_all_players (pl) |
1614 | for_all_players (pl) |
1601 | if (pl->ob->map == this) |
1615 | if (pl->observe->map == this) |
1602 | if (client *ns = pl->ns) |
1616 | if (client *ns = pl->ns) |
1603 | { |
1617 | { |
1604 | int dx = x - pl->ob->x; |
1618 | int dx = x - pl->observe->x; |
1605 | int dy = y - pl->ob->y; |
1619 | int dy = y - pl->observe->y; |
1606 | |
1620 | |
1607 | int distance = idistance (dx, dy); |
1621 | int distance = idistance (dx, dy); |
1608 | |
1622 | |
1609 | if (distance <= MAX_SOUND_DISTANCE) |
1623 | if (distance <= MAX_SOUND_DISTANCE) |
1610 | ns->play_sound (sound, dx, dy); |
1624 | ns->play_sound (sound, dx, dy); |