… | |
… | |
601 | |
601 | |
602 | if (!other_arch) |
602 | if (!other_arch) |
603 | LOG (llevError, "%s uses unknown other_arch '%s'.\n", debug_desc (), f.get_str ()); |
603 | LOG (llevError, "%s uses unknown other_arch '%s'.\n", debug_desc (), f.get_str ()); |
604 | break; |
604 | break; |
605 | |
605 | |
|
|
606 | case KW_owner: |
|
|
607 | if (const char *s = f.get_str ()) |
|
|
608 | { |
|
|
609 | unsigned int version; |
|
|
610 | unsigned long long seq; |
|
|
611 | char name[256]; |
|
|
612 | |
|
|
613 | if (3 == sscanf (s, "<%d.%llx>/%256s", &version, &seq, name) && version == 1) |
|
|
614 | { |
|
|
615 | UUID uuid = seq; |
|
|
616 | player *pl = player::find (name); |
|
|
617 | |
|
|
618 | if (pl && pl->ob->uuid == uuid) |
|
|
619 | owner = pl->ob; |
|
|
620 | } |
|
|
621 | } |
|
|
622 | break; |
|
|
623 | |
606 | case KW_animation: |
624 | case KW_animation: |
607 | { |
625 | { |
608 | CLEAR_FLAG (this, FLAG_ANIMATE); |
626 | CLEAR_FLAG (this, FLAG_ANIMATE); |
609 | animation_id = 0; |
627 | animation_id = 0; |
610 | |
628 | |
… | |
… | |
1269 | char uids[64]; |
1287 | char uids[64]; |
1270 | snprintf (uids, sizeof (uids), "<1.%llx>", (unsigned long long)op->uuid.seq); |
1288 | snprintf (uids, sizeof (uids), "<1.%llx>", (unsigned long long)op->uuid.seq); |
1271 | f.put (KW_uuid, (const char *)uids); |
1289 | f.put (KW_uuid, (const char *)uids); |
1272 | } |
1290 | } |
1273 | |
1291 | |
1274 | #define CMP_OUT(v) if (op->v != tmp->v) f.put (KW_ ## v, op->v) |
1292 | #define CMP_OUT(v) if (expect_false (op->v != tmp->v)) f.put (KW_ ## v, op->v) |
1275 | #define CMP_OUT2(k,v) if (op->v != tmp->v) f.put (KW_ ## k, op->v) |
1293 | #define CMP_OUT2(k,v) if (expect_false (op->v != tmp->v)) f.put (KW_ ## k, op->v) |
|
|
1294 | |
|
|
1295 | if (object *pl = op->owner) |
|
|
1296 | if (pl->contr) |
|
|
1297 | { |
|
|
1298 | char owner[256]; |
|
|
1299 | snprintf (owner, sizeof (owner), "<1.%llx>/%s", (unsigned long long)pl->uuid.seq, &pl->name); |
|
|
1300 | f.put (KW_owner, (const char *)owner); |
|
|
1301 | } |
1276 | |
1302 | |
1277 | CMP_OUT (name); |
1303 | CMP_OUT (name); |
1278 | CMP_OUT (name_pl); |
1304 | CMP_OUT (name_pl); |
1279 | CMP_OUT (custom_name); |
1305 | CMP_OUT (custom_name); |
1280 | CMP_OUT (title); |
1306 | CMP_OUT (title); |
… | |
… | |
1337 | CMP_OUT (type); |
1363 | CMP_OUT (type); |
1338 | CMP_OUT (subtype); |
1364 | CMP_OUT (subtype); |
1339 | CMP_OUT (attacktype); |
1365 | CMP_OUT (attacktype); |
1340 | |
1366 | |
1341 | for (i = 0; i < NROFATTACKS; i++) |
1367 | for (i = 0; i < NROFATTACKS; i++) |
1342 | if (op->resist[i] != tmp->resist[i]) |
1368 | if (expect_false (op->resist[i] != tmp->resist[i])) |
1343 | f.put (resist_save[i], op->resist[i]); |
1369 | f.put (resist_save[i], op->resist[i]); |
1344 | |
1370 | |
1345 | CMP_OUT (path_attuned); |
1371 | CMP_OUT (path_attuned); |
1346 | CMP_OUT (path_repelled); |
1372 | CMP_OUT (path_repelled); |
1347 | CMP_OUT (path_denied); |
1373 | CMP_OUT (path_denied); |
… | |
… | |
1389 | CMP_OUT (move_slow); |
1415 | CMP_OUT (move_slow); |
1390 | CMP_OUT (move_slow_penalty); |
1416 | CMP_OUT (move_slow_penalty); |
1391 | |
1417 | |
1392 | if (op->flag != tmp->flag) |
1418 | if (op->flag != tmp->flag) |
1393 | for (i = 0; i <= NUM_FLAGS; i++) |
1419 | for (i = 0; i <= NUM_FLAGS; i++) |
1394 | if (flag_names [i] && op->flag [i] != tmp->flag [i]) |
1420 | if (expect_false (flag_names [i] && op->flag [i] != tmp->flag [i])) |
1395 | f.put (flag_names [i], op->flag [i] ? "1" : "0"); |
1421 | f.put (flag_names [i], op->flag [i] ? "1" : "0"); |
1396 | |
1422 | |
1397 | // save body locations |
1423 | // save body locations |
1398 | for (i = 0; i < NUM_BODY_LOCATIONS; i++) |
1424 | for (i = 0; i < NUM_BODY_LOCATIONS; i++) |
1399 | if (op->slot[i].info != tmp->slot[i].info) |
1425 | if (expect_false (op->slot[i].info != tmp->slot[i].info)) |
1400 | f.put (body_locations[i].save_name, op->slot[i].info); |
1426 | f.put (body_locations[i].save_name, op->slot[i].info); |
1401 | } |
1427 | } |
1402 | |
1428 | |
1403 | /* |
1429 | /* |
1404 | * Dumps all variables in an object to a file. |
1430 | * Dumps all variables in an object to a file. |
… | |
… | |
1406 | * the only place this is not set is when saving the player. |
1432 | * the only place this is not set is when saving the player. |
1407 | */ |
1433 | */ |
1408 | bool |
1434 | bool |
1409 | object::write (object_freezer &f) |
1435 | object::write (object_freezer &f) |
1410 | { |
1436 | { |
1411 | /* Even if the object does have an owner, it would seem that we should |
|
|
1412 | * still save it. |
|
|
1413 | */ |
|
|
1414 | if (owner) |
|
|
1415 | return true; |
|
|
1416 | |
|
|
1417 | archetype *at = arch ? (archetype *)arch : empty_archetype; |
1437 | archetype *at = arch ? (archetype *)arch : empty_archetype; |
1418 | |
1438 | |
1419 | f.put (KW_arch, at->archname); |
1439 | f.put (KW_arch, at->archname); |
1420 | write_diff (f, this, at); |
1440 | write_diff (f, this, at); |
1421 | |
1441 | |