… | |
… | |
374 | /* |
374 | /* |
375 | * get_nearest_part(multi-object, object 2) returns the part of the |
375 | * get_nearest_part(multi-object, object 2) returns the part of the |
376 | * multi-object 1 which is closest to the second object. |
376 | * multi-object 1 which is closest to the second object. |
377 | * If it's not a multi-object, it is returned. |
377 | * If it's not a multi-object, it is returned. |
378 | */ |
378 | */ |
379 | |
|
|
380 | object * |
379 | object * |
381 | get_nearest_part (object *op, const object *pl) |
380 | get_nearest_part (object *op, const object *pl) |
382 | { |
381 | { |
383 | object *tmp, *closest; |
382 | object *tmp, *closest; |
384 | int last_dist, i; |
383 | int last_dist, i; |
… | |
… | |
579 | object::copy_to (object *dst) |
578 | object::copy_to (object *dst) |
580 | { |
579 | { |
581 | *dst = *this; |
580 | *dst = *this; |
582 | |
581 | |
583 | if (speed < 0) |
582 | if (speed < 0) |
584 | dst->speed_left = speed_left - rndm (); |
583 | dst->speed_left -= rndm (); |
585 | |
584 | |
586 | dst->set_speed (dst->speed); |
585 | dst->set_speed (dst->speed); |
587 | } |
586 | } |
588 | |
587 | |
589 | void |
588 | void |
… | |
… | |
916 | |
915 | |
917 | if (!freed_map) |
916 | if (!freed_map) |
918 | { |
917 | { |
919 | freed_map = new maptile; |
918 | freed_map = new maptile; |
920 | |
919 | |
|
|
920 | freed_map->path = "<freed objects map>"; |
921 | freed_map->name = "/internal/freed_objects_map"; |
921 | freed_map->name = "/internal/freed_objects_map"; |
922 | freed_map->width = 3; |
922 | freed_map->width = 3; |
923 | freed_map->height = 3; |
923 | freed_map->height = 3; |
924 | |
924 | |
925 | freed_map->alloc (); |
925 | freed_map->alloc (); |
… | |
… | |
1231 | |
1231 | |
1232 | object *top, *floor = NULL; |
1232 | object *top, *floor = NULL; |
1233 | |
1233 | |
1234 | op->remove (); |
1234 | op->remove (); |
1235 | |
1235 | |
1236 | if (out_of_map (m, op->x, op->y)) |
|
|
1237 | { |
|
|
1238 | LOG (llevError, "Trying to insert object outside the map.\n%s\n", op->debug_desc ()); |
|
|
1239 | #ifdef MANY_CORES |
|
|
1240 | /* Better to catch this here, as otherwise the next use of this object |
|
|
1241 | * is likely to cause a crash. Better to find out where it is getting |
|
|
1242 | * improperly inserted. |
|
|
1243 | */ |
|
|
1244 | abort (); |
|
|
1245 | #endif |
|
|
1246 | return op; |
|
|
1247 | } |
|
|
1248 | |
|
|
1249 | if (object *more = op->more) |
|
|
1250 | if (!insert_ob_in_map (more, m, originator, flag)) |
|
|
1251 | return 0; |
|
|
1252 | |
|
|
1253 | CLEAR_FLAG (op, FLAG_REMOVED); |
|
|
1254 | |
|
|
1255 | /* Ideally, the caller figures this out. However, it complicates a lot |
1236 | /* Ideally, the caller figures this out. However, it complicates a lot |
1256 | * of areas of callers (eg, anything that uses find_free_spot would now |
1237 | * of areas of callers (eg, anything that uses find_free_spot would now |
1257 | * need extra work |
1238 | * need extra work |
1258 | */ |
1239 | */ |
1259 | if (!xy_normalise (m, op->x, op->y)) |
1240 | if (!xy_normalise (m, op->x, op->y)) |
|
|
1241 | { |
|
|
1242 | op->destroy (); |
1260 | return 0; |
1243 | return 0; |
|
|
1244 | } |
|
|
1245 | |
|
|
1246 | if (object *more = op->more) |
|
|
1247 | if (!insert_ob_in_map (more, m, originator, flag)) |
|
|
1248 | return 0; |
|
|
1249 | |
|
|
1250 | CLEAR_FLAG (op, FLAG_REMOVED); |
1261 | |
1251 | |
1262 | op->map = m; |
1252 | op->map = m; |
1263 | mapspace &ms = op->ms (); |
1253 | mapspace &ms = op->ms (); |
1264 | |
1254 | |
1265 | /* this has to be done after we translate the coordinates. |
1255 | /* this has to be done after we translate the coordinates. |