1 | /* |
1 | /* |
2 | * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. |
2 | * This file is part of Deliantra, the Roguelike Realtime MMORPG. |
3 | * |
3 | * |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team |
4 | * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Crossfire TRT is free software: you can redistribute it and/or modify |
8 | * Deliantra is free software: you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation, either version 3 of the License, or |
10 | * the Free Software Foundation, either version 3 of the License, or |
11 | * (at your option) any later version. |
11 | * (at your option) any later version. |
12 | * |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
13 | * This program is distributed in the hope that it will be useful, |
… | |
… | |
16 | * GNU General Public License for more details. |
16 | * GNU General Public License for more details. |
17 | * |
17 | * |
18 | * You should have received a copy of the GNU General Public License |
18 | * You should have received a copy of the GNU General Public License |
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
20 | * |
20 | * |
21 | * The authors can be reached via e-mail to <crossfire@schmorp.de> |
21 | * The authors can be reached via e-mail to <support@deliantra.net> |
22 | */ |
22 | */ |
23 | |
23 | |
24 | /* Eneq(@csd.uu.se): Added weight-modifiers in environment of objects. |
24 | /* Eneq(@csd.uu.se): Added weight-modifiers in environment of objects. |
25 | sub/add_weight will transcend the environment updating the carrying |
25 | sub/add_weight will transcend the environment updating the carrying |
26 | variable. */ |
26 | variable. */ |
… | |
… | |
448 | // allow objects which own objects |
448 | // allow objects which own objects |
449 | if (owner) |
449 | if (owner) |
450 | while (owner->owner) |
450 | while (owner->owner) |
451 | owner = owner->owner; |
451 | owner = owner->owner; |
452 | |
452 | |
|
|
453 | if (flag [FLAG_FREED]) |
|
|
454 | { |
|
|
455 | LOG (llevError | logBacktrace, "tried to set owner of %s to %s\n", debug_desc (), owner->debug_desc ()); |
|
|
456 | return; |
|
|
457 | } |
|
|
458 | |
453 | this->owner = owner; |
459 | this->owner = owner; |
454 | } |
460 | } |
455 | |
461 | |
456 | int |
462 | int |
457 | object::slottype () const |
463 | object::slottype () const |
… | |
… | |
929 | |
935 | |
930 | freed_map->path = "<freed objects map>"; |
936 | freed_map->path = "<freed objects map>"; |
931 | freed_map->name = "/internal/freed_objects_map"; |
937 | freed_map->name = "/internal/freed_objects_map"; |
932 | freed_map->width = 3; |
938 | freed_map->width = 3; |
933 | freed_map->height = 3; |
939 | freed_map->height = 3; |
|
|
940 | freed_map->nodrop = 1; |
934 | |
941 | |
935 | freed_map->alloc (); |
942 | freed_map->alloc (); |
936 | freed_map->in_memory = MAP_IN_MEMORY; |
943 | freed_map->in_memory = MAP_IN_MEMORY; |
937 | } |
944 | } |
938 | |
945 | |
… | |
… | |
1952 | * activate recursively a flag on an object inventory |
1959 | * activate recursively a flag on an object inventory |
1953 | */ |
1960 | */ |
1954 | void |
1961 | void |
1955 | flag_inv (object *op, int flag) |
1962 | flag_inv (object *op, int flag) |
1956 | { |
1963 | { |
1957 | if (op->inv) |
|
|
1958 | for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below) |
1964 | for (object *tmp = op->inv; tmp; tmp = tmp->below) |
1959 | { |
1965 | { |
1960 | SET_FLAG (tmp, flag); |
1966 | SET_FLAG (tmp, flag); |
1961 | flag_inv (tmp, flag); |
1967 | flag_inv (tmp, flag); |
1962 | } |
1968 | } |
1963 | } |
1969 | } |
1964 | |
1970 | |
1965 | /* |
1971 | /* |
1966 | * deactivate recursively a flag on an object inventory |
1972 | * deactivate recursively a flag on an object inventory |
1967 | */ |
1973 | */ |
1968 | void |
1974 | void |
1969 | unflag_inv (object *op, int flag) |
1975 | unflag_inv (object *op, int flag) |
1970 | { |
1976 | { |
1971 | if (op->inv) |
|
|
1972 | for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below) |
1977 | for (object *tmp = op->inv; tmp; tmp = tmp->below) |
1973 | { |
1978 | { |
1974 | CLEAR_FLAG (tmp, flag); |
1979 | CLEAR_FLAG (tmp, flag); |
1975 | unflag_inv (tmp, flag); |
1980 | unflag_inv (tmp, flag); |
1976 | } |
1981 | } |
1977 | } |
1982 | } |
1978 | |
1983 | |
1979 | /* |
1984 | /* |
1980 | * find_free_spot(object, map, x, y, start, stop) will search for |
1985 | * find_free_spot(object, map, x, y, start, stop) will search for |
1981 | * a spot at the given map and coordinates which will be able to contain |
1986 | * a spot at the given map and coordinates which will be able to contain |
… | |
… | |
2014 | |
2019 | |
2015 | /* However, often |
2020 | /* However, often |
2016 | * ob doesn't have any move type (when used to place exits) |
2021 | * ob doesn't have any move type (when used to place exits) |
2017 | * so the AND operation in OB_TYPE_MOVE_BLOCK doesn't work. |
2022 | * so the AND operation in OB_TYPE_MOVE_BLOCK doesn't work. |
2018 | */ |
2023 | */ |
2019 | if (ob->move_type == 0 && ms.move_block != MOVE_ALL) |
2024 | if (ob && ob->move_type == 0 && ms.move_block != MOVE_ALL) |
2020 | { |
2025 | { |
2021 | altern [index++] = i; |
2026 | altern [index++] = i; |
2022 | continue; |
2027 | continue; |
2023 | } |
2028 | } |
2024 | |
2029 | |