/** * Adding artifacts to the history list is trickier than other operations. * This is a wrapper function that gets some of the logic out of places * where it really doesn't belong. Call this to add an artifact to the history * list or make the history entry visible--history_add_artifact will make that * determination depending on what object_is_known returns for the artifact. */ bool history_add_artifact(struct artifact *artifact, bool known, bool found) { struct object body = { 0 }, known_body = { 0 }; struct object *fake = &body, *known_obj = &known_body; char o_name[80]; char buf[80]; assert(artifact); /* Make fake artifact for description purposes */ make_fake_artifact(fake, artifact); fake->known = known_obj; known_obj->artifact = (struct artifact *) 1; known_obj->kind = fake->kind; object_desc(o_name, sizeof(o_name), fake, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); object_wipe(known_obj); object_wipe(fake); strnfmt(buf, sizeof(buf), (found)?"Found %s":"Missed %s", o_name); /* Known objects gets different treatment */ if (known) { /* Try revealing any existing artifact, otherwise log it */ if (history_is_artifact_logged(artifact)) history_know_artifact(artifact); else history_add(buf, HIST_ARTIFACT_KNOWN, artifact); } else { if (!history_is_artifact_logged(artifact)) { bitflag type[HIST_SIZE]; hist_wipe(type); hist_on(type, HIST_ARTIFACT_UNKNOWN); if (!found) hist_on(type, HIST_ARTIFACT_LOST); history_add_full(type, artifact, player->depth, player->lev, player->total_energy / 100, buf); } else { return false; } } return true; }
/* * Adding artifacts to the history list is trickier than other operations. * This is a wrapper function that gets some of the logic out of places * where it really doesn't belong. Call this to add an artifact to the history * list or make the history entry visible--history_add_artifact will make that * determination depending on what object_is_known returns for the artifact. */ bool history_add_artifact(byte a_idx, bool known, bool found) { object_type object_type_body; object_type *o_ptr = &object_type_body; char o_name[80]; char buf[80]; u16b type; /* Make fake artifact for description purposes */ object_wipe(o_ptr); make_fake_artifact(o_ptr, a_idx); object_desc(o_name, sizeof(o_name), o_ptr, ODESC_PREFIX | ODESC_BASE | ODESC_SPOIL); strnfmt(buf, sizeof(buf), (found)?"Found %s":"Missed %s", o_name); /* Known objects gets different treatment */ if (known) { /* Try revealing any existing artifact, otherwise log it */ if (history_is_artifact_logged(a_idx)) history_know_artifact(a_idx); else history_add(buf, HISTORY_ARTIFACT_KNOWN, a_idx); } else { if (!history_is_artifact_logged(a_idx)) { type = HISTORY_ARTIFACT_UNKNOWN | (found ? 0 : HISTORY_ARTIFACT_LOST); history_add(buf, type, a_idx); } else { return FALSE; } } return TRUE; }