/* * Auxilliary Wizard routine for creating objects * * Hack -- this routine always makes a "dungeon object", and applies * magic to it, and attempts to decline cursed items. XXX XXX XXX */ static void wiz_create_item_aux(int k_idx) { int py = p_ptr->py; int px = p_ptr->px; object_type *i_ptr; object_type object_type_body; /* Get local object */ i_ptr = &object_type_body; /* Create the item */ object_prep(i_ptr, k_idx); /* Apply magic (no messages, no artefacts) */ apply_magic(i_ptr, p_ptr->depth, FALSE, FALSE, FALSE, FALSE); // apply the autoinscription (if any) apply_autoinscription(i_ptr); if (i_ptr->tval == TV_ARROW) i_ptr->number = 24; /* Drop the object from heaven */ drop_near(i_ptr, -1, py, px); }
/** * Put an autoinscription on all the player's carried objects */ void autoinscribe_pack(void) { struct object *obj; /* Autoinscribe each object in the inventory */ for (obj = player->gear; obj; obj = obj->next) apply_autoinscription(obj); }
/** * Put an autoinscription on all objects on the floor beneath the player */ void autoinscribe_ground(void) { int py = player->py; int px = player->px; struct object *obj; /* Autoinscribe each object in the pile */ for (obj = square_object(cave, py, px); obj; obj = obj->next) apply_autoinscription(obj); }
void autoinscribe_pack(void) { int i; /* Cycle through the inventory */ for (i = INVEN_PACK; i >= 0; i--) { /* Skip empty items */ if (!p_ptr->inventory[i].kind) continue; /* Apply the inscription */ apply_autoinscription(&p_ptr->inventory[i]); } return; }
void autoinscribe_ground(void) { int py = p_ptr->py; int px = p_ptr->px; s16b this_o_idx, next_o_idx = 0; /* Scan the pile of objects */ for (this_o_idx = cave->o_idx[py][px]; this_o_idx; this_o_idx = next_o_idx) { /* Get the next object */ next_o_idx = object_byid(this_o_idx)->next_o_idx; /* Apply an autoinscription */ apply_autoinscription(object_byid(this_o_idx)); } }
/** * Mark an object's flavour as as one the player is aware of. * * \param o_ptr is the object whose flavour should be marked as aware */ void object_flavor_aware(object_type *o_ptr) { int i; if (o_ptr->kind->aware) return; o_ptr->kind->aware = TRUE; /* Fix squelch/autoinscribe */ p_ptr->notice |= PN_SQUELCH; apply_autoinscription(o_ptr); for (i = 1; i < o_max; i++) { const object_type *floor_o_ptr = &o_list[i]; /* Some objects change tile on awareness */ /* So update display for all floor objects of this kind */ if (!floor_o_ptr->held_m_idx && floor_o_ptr->k_idx == o_ptr->k_idx) light_spot(floor_o_ptr->iy, floor_o_ptr->ix); } }
/** * Add an item to the players inventory. * * If the new item can combine with an existing item in the inventory, * it will do so, using object_similar() and object_absorb(), else, * the item will be placed into the first available gear array index. * * This function can be used to "over-fill" the player's pack, but only * once, and such an action must trigger the "overflow" code immediately. * Note that when the pack is being "over-filled", the new item must be * placed into the "overflow" slot, and the "overflow" must take place * before the pack is reordered, but (optionally) after the pack is * combined. This may be tricky. See "dungeon.c" for info. * * Note that this code removes any location information from the object once * it is placed into the inventory, but takes no responsibility for removing * the object from any other pile it was in. */ void inven_carry(struct player *p, struct object *obj, bool absorb, bool message) { struct object *gear_obj; char o_name[80]; /* Check for combining, if appropriate */ if (absorb) { for (gear_obj = p->gear; gear_obj; gear_obj = gear_obj->next) { /* Can't stack equipment */ if (object_is_equipped(p->body, gear_obj)) continue; /* Check if the two items can be combined */ if (object_similar(gear_obj, obj, OSTACK_PACK)) { /* Increase the weight */ p->upkeep->total_weight += (obj->number * obj->weight); /* Combine the items, and their known versions */ object_absorb(gear_obj->known, obj->known); obj->known = NULL; object_absorb(gear_obj, obj); /* Describe the combined object */ object_desc(o_name, sizeof(o_name), gear_obj, ODESC_PREFIX | ODESC_FULL); /* Recalculate bonuses */ p->upkeep->update |= (PU_BONUS | PU_INVEN); /* Redraw stuff */ p->upkeep->redraw |= (PR_INVEN); /* Inventory will need updating */ update_stuff(player); /* Optionally, display a message */ if (message) msg("You have %s (%c).", o_name, gear_to_label(gear_obj)); /* Sound for quiver objects */ if (object_is_in_quiver(p, gear_obj)) sound(MSG_QUIVER); /* Success */ return; } } } /* Paranoia */ assert(pack_slots_used(p) <= z_info->pack_size); /* Add to the end of the list */ gear_insert_end(obj); /* Apply an autoinscription */ apply_autoinscription(obj); /* Remove cave object details */ obj->held_m_idx = 0; obj->iy = obj->ix = 0; obj->known->iy = obj->known->ix = 0; /* Update the inventory */ p->upkeep->total_weight += (obj->number * obj->weight); p->upkeep->update |= (PU_BONUS | PU_INVEN); p->upkeep->notice |= (PN_COMBINE); p->upkeep->redraw |= (PR_INVEN); /* Inventory will need updating */ update_stuff(player); /* Hobbits ID mushrooms on pickup, gnomes ID wands and staffs on pickup */ if (!object_flavor_is_aware(obj)) { if (player_has(player, PF_KNOW_MUSHROOM) && tval_is_mushroom(obj)) { object_flavor_aware(obj); msg("Mushrooms for breakfast!"); } else if (player_has(player, PF_KNOW_ZAPPER) && tval_is_zapper(obj)) object_flavor_aware(obj); } /* Optionally, display a message */ if (message) { /* Describe the object */ object_desc(o_name, sizeof(o_name), obj, ODESC_PREFIX | ODESC_FULL); /* Message */ msg("You have %s (%c).", o_name, gear_to_label(obj)); } /* Sound for quiver objects */ if (object_is_in_quiver(p, obj)) sound(MSG_QUIVER); }
/** * Add an item to the players inventory. * * If the new item can combine with an existing item in the inventory, * it will do so, using object_similar() and object_absorb(), else, * the item will be placed into the first available gear array index. * * This function can be used to "over-fill" the player's pack, but only * once, and such an action must trigger the "overflow" code immediately. * Note that when the pack is being "over-filled", the new item must be * placed into the "overflow" slot, and the "overflow" must take place * before the pack is reordered, but (optionally) after the pack is * combined. This may be tricky. See "dungeon.c" for info. * * Note that this code removes any location information from the object once * it is placed into the inventory, but takes no responsibility for removing * the object from any other pile it was in. */ void inven_carry(struct player *p, struct object *obj, bool absorb, bool message) { bool combining = false; /* Check for combining, if appropriate */ if (absorb) { struct object *combine_item = NULL; struct object *gear_obj = p->gear; while (combine_item == false && gear_obj) { if (!object_is_equipped(p->body, gear_obj) && object_similar(gear_obj, obj, OSTACK_PACK)) { combine_item = gear_obj; } gear_obj = gear_obj->next; } if (combine_item) { /* Increase the weight */ p->upkeep->total_weight += (obj->number * obj->weight); /* Combine the items, and their known versions */ object_absorb(combine_item->known, obj->known); obj->known = NULL; object_absorb(combine_item, obj); obj = combine_item; combining = true; } } /* We didn't manage the find an object to combine with */ if (!combining) { /* Paranoia */ assert(pack_slots_used(p) <= z_info->pack_size); gear_insert_end(obj); apply_autoinscription(obj); /* Remove cave object details */ obj->held_m_idx = 0; obj->grid = loc(0, 0); obj->known->grid = loc(0, 0); /* Update the inventory */ p->upkeep->total_weight += (obj->number * obj->weight); p->upkeep->notice |= (PN_COMBINE); /* Hobbits ID mushrooms on pickup, gnomes ID wands and staffs on pickup */ if (!object_flavor_is_aware(obj)) { if (player_has(player, PF_KNOW_MUSHROOM) && tval_is_mushroom(obj)) { object_flavor_aware(obj); msg("Mushrooms for breakfast!"); } else if (player_has(player, PF_KNOW_ZAPPER) && tval_is_zapper(obj)) object_flavor_aware(obj); } } p->upkeep->update |= (PU_BONUS | PU_INVEN); p->upkeep->redraw |= (PR_INVEN); update_stuff(player); if (message) { char o_name[80]; object_desc(o_name, sizeof(o_name), obj, ODESC_PREFIX | ODESC_FULL); msg("You have %s (%c).", o_name, gear_to_label(obj)); } if (object_is_in_quiver(p, obj)) sound(MSG_QUIVER); }