/** * Determine which equipment slot (if any) an item likes. The slot might (or * might not) be open, but it is a slot which the object could be equipped in. * * For items where multiple slots could work (e.g. rings), the function * will try to return an open slot if possible. */ int wield_slot(const struct object *obj) { /* Slot for equipment */ switch (obj->tval) { case TV_BOW: return slot_by_type(player, EQUIP_BOW, false); case TV_AMULET: return slot_by_type(player, EQUIP_AMULET, false); case TV_CLOAK: return slot_by_type(player, EQUIP_CLOAK, false); case TV_SHIELD: return slot_by_type(player, EQUIP_SHIELD, false); case TV_GLOVES: return slot_by_type(player, EQUIP_GLOVES, false); case TV_BOOTS: return slot_by_type(player, EQUIP_BOOTS, false); } if (tval_is_melee_weapon(obj)) return slot_by_type(player, EQUIP_WEAPON, false); else if (tval_is_ring(obj)) return slot_by_type(player, EQUIP_RING, false); else if (tval_is_light(obj)) return slot_by_type(player, EQUIP_LIGHT, false); else if (tval_is_body_armor(obj)) return slot_by_type(player, EQUIP_BODY_ARMOR, false); else if (tval_is_head_armor(obj)) return slot_by_type(player, EQUIP_HAT, false); /* No slot available */ return (-1); }
/** * Applying magic to an object, which includes creating ego-items, and applying * random bonuses, * * The `good` argument forces the item to be at least `good`, and the `great` * argument does likewise. Setting `allow_artifacts` to true allows artifacts * to be created here. * * If `good` or `great` are not set, then the `lev` argument controls the * quality of item. * * Returns 0 if a normal object, 1 if a good object, 2 if an ego item, 3 if an * artifact. */ int apply_magic(struct object *obj, int lev, bool allow_artifacts, bool good, bool great, bool extra_roll) { int i; s16b power = 0; /* Chance of being `good` and `great` */ /* This has changed over the years: * 3.0.0: good = MIN(75, lev + 10); great = MIN(20, lev / 2); * 3.3.0: good = (lev + 2) * 3; great = MIN(lev / 4 + lev, 50); * 3.4.0: good = (2 * lev) + 5 * 3.4 was in between 3.0 and 3.3, 3.5 attempts to keep the same * area under the curve as 3.4, but make the generation chances * flatter. This depresses good items overall since more items * are created deeper. * This change is meant to go in conjunction with the changes * to ego item allocation levels. (-fizzix) */ int good_chance = (33 + lev); int great_chance = 30; /* Roll for "good" */ if (good || (randint0(100) < good_chance)) { power = 1; /* Roll for "great" */ if (great || (randint0(100) < great_chance)) power = 2; } /* Roll for artifact creation */ if (allow_artifacts) { int rolls = 0; /* Get one roll if excellent */ if (power >= 2) rolls = 1; /* Get two rolls if forced great */ if (great) rolls = 2; /* Give some extra rolls for uniques and acq scrolls */ if (extra_roll) rolls += 2; /* Roll for artifacts if allowed */ for (i = 0; i < rolls; i++) if (make_artifact(obj)) return 3; } /* Try to make an ego item */ if (power == 2) make_ego_item(obj, lev); /* Apply magic */ if (tval_is_weapon(obj)) { apply_magic_weapon(obj, lev, power); } else if (tval_is_armor(obj)) { apply_magic_armour(obj, lev, power); } else if (tval_is_ring(obj)) { if (obj->sval == lookup_sval(obj->tval, "Speed")) { /* Super-charge the ring */ while (one_in_(2)) obj->modifiers[OBJ_MOD_SPEED]++; } } else if (tval_is_chest(obj)) { /* Hack -- skip ruined chests */ if (obj->kind->level > 0) { /* Hack -- pick a "difficulty" */ obj->pval = randint1(obj->kind->level); /* Never exceed "difficulty" of 55 to 59 */ if (obj->pval > 55) obj->pval = (s16b)(55 + randint0(5)); } } /* Apply minima from ego items if necessary */ ego_apply_minima(obj); return power; }