/** * Complete object creation by applying magic to it. * * Magic includes rolling for random bonuses, applying flags to ego-items, * charging charged items, fuelling lights, and trapping chests. * * 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. See the function itself for the specifics of the * calculations involved. */ void apply_magic(object_type *o_ptr, int lev, bool allow_artifacts, bool good, bool great) { int power = 0; /*u32b xtra = 0;*/ /*bool new = FALSE;*/ /* Chance of being `good` and `great` */ int good_chance = (lev+2) * 3; int great_chance = MIN(lev/4 + lev, 50); /* Limit depth */ if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1; /* Roll for "good" */ if (good || (randint0(100) < good_chance)) { /* Assume "good" */ power = 1; /* Roll for "great" */ if (great || (randint0(100) < great_chance)) power = 2; } /* Roll for "cursed" */ else if (randint0(100) < good_chance) { /* Assume "cursed" */ power = -1; /* Roll for "broken" */ if (randint0(100) < great_chance) power = -2; } /* Roll for artifact creation */ if (allow_artifacts) { int i; int rolls = 0; /* Get one roll if excellent */ if (power >= 2) rolls = 1; /* Get four rolls if forced great */ if (great) rolls = 4; /* Roll for artifacts if allowed */ for (i = 0; i < rolls; i++) { if (make_artifact(o_ptr)) return; } } /* Apply magic */ switch (o_ptr->tval) { case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_BOW: case TV_SHOT: case TV_ARROW: case TV_BOLT: { if (power == 2 || power == -2) { int ego_power; ego_power = make_ego_item(o_ptr, lev, (bool)(power > 0)); if (ego_power) power = ego_power; } if (power) a_m_aux_1(o_ptr, lev, power); break; } case TV_DRAG_ARMOR: case TV_HARD_ARMOR: case TV_SOFT_ARMOR: case TV_SHIELD: case TV_HELM: case TV_CROWN: case TV_CLOAK: case TV_GLOVES: case TV_BOOTS: { if (power == 2 || power == -2) { int ego_power; ego_power = make_ego_item(o_ptr, lev, (bool)(power > 0)); if (ego_power) power = ego_power; } if (power) a_m_aux_2(o_ptr, lev, power); break; } case TV_RING: case TV_AMULET: { if (!power && (randint0(100) < 50)) power = -1; a_m_aux_3(o_ptr, lev, power); break; } case TV_LIGHT: { if (power == 2 || power == -2) make_ego_item(o_ptr, lev, (bool)(power > 0)); /* Fuel it */ a_m_aux_4(o_ptr, lev, power); break; } default: { a_m_aux_4(o_ptr, lev, power); break; } } /* Hack -- analyze ego-items */ if (o_ptr->name2) { ego_item_type *e_ptr = &e_info[o_ptr->name2]; bitflag flags[OF_SIZE]; object_flags(o_ptr, flags); /* Extra powers */ if (e_ptr->xtra == OBJECT_XTRA_TYPE_SUSTAIN) of_on(o_ptr->flags, get_new_attr(flags, ego_sustains, N_ELEMENTS(ego_sustains))); else if (e_ptr->xtra == OBJECT_XTRA_TYPE_RESIST) of_on(o_ptr->flags, get_new_attr(flags, ego_resists, N_ELEMENTS(ego_resists))); else if (e_ptr->xtra == OBJECT_XTRA_TYPE_POWER) of_on(o_ptr->flags, get_new_attr(flags, ego_powers, N_ELEMENTS(ego_powers))); /* Hack -- acquire "cursed" flags */ if (cursed_p(e_ptr)) { bitflag curse_flags[OF_SIZE]; of_copy(curse_flags, e_ptr->flags); flags_mask(curse_flags, OF_SIZE, OF_CURSE_MASK, FLAG_END); of_union(o_ptr->flags, curse_flags); } /* Hack -- apply extra penalties if needed */ if (cursed_p(o_ptr)) { /* Apply extra ego bonuses */ o_ptr->to_h -= randcalc(e_ptr->to_h, lev, RANDOMISE); o_ptr->to_d -= randcalc(e_ptr->to_d, lev, RANDOMISE); o_ptr->to_a -= randcalc(e_ptr->to_a, lev, RANDOMISE); /* Apply ego pval */ o_ptr->pval -= randcalc(e_ptr->pval, lev, RANDOMISE); /* Apply minimums */ if (o_ptr->to_h > -1 * e_ptr->min_to_h) o_ptr->to_h = -1 * e_ptr->min_to_h; if (o_ptr->to_d > -1 * e_ptr->min_to_d) o_ptr->to_d = -1 * e_ptr->min_to_d; if (o_ptr->to_a > -1 * e_ptr->min_to_a) o_ptr->to_a = -1 * e_ptr->min_to_a; if (o_ptr->pval > -1 * e_ptr->min_pval) o_ptr->pval = -1 * e_ptr->min_pval; } /* Hack -- apply extra bonuses if needed */ else { /* Apply extra ego bonuses */ o_ptr->to_h += randcalc(e_ptr->to_h, lev, RANDOMISE); o_ptr->to_d += randcalc(e_ptr->to_d, lev, RANDOMISE); o_ptr->to_a += randcalc(e_ptr->to_a, lev, RANDOMISE); /* Apply ego pval */ o_ptr->pval += randcalc(e_ptr->pval, lev, RANDOMISE); /* Apply minimums */ if (o_ptr->to_h < e_ptr->min_to_h) o_ptr->to_h = e_ptr->min_to_h; if (o_ptr->to_d < e_ptr->min_to_d) o_ptr->to_d = e_ptr->min_to_d; if (o_ptr->to_a < e_ptr->min_to_a) o_ptr->to_a = e_ptr->min_to_a; if (o_ptr->pval < e_ptr->min_pval) o_ptr->pval = e_ptr->min_pval; } /* Hack -- apply rating bonus */ rating += e_ptr->rating; /* Cheat -- describe the item */ if (OPT(cheat_peek)) object_mention(o_ptr); /* Done */ return; } /* Examine real objects */ if (o_ptr->k_idx) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Hack -- acquire "cursed" flag */ if (cursed_p(k_ptr)) { bitflag curse_flags[OF_SIZE]; of_copy(curse_flags, k_ptr->flags); flags_mask(curse_flags, OF_SIZE, OF_CURSE_MASK, FLAG_END); of_union(o_ptr->flags, curse_flags); } } }
void WizardModeDialog::wiz_winners_kit(void) { if (!character_dungeon) return; if (game_mode == GAME_NPPMORIA) { // Make 2 rings of speed int k_idx = lookup_kind(TV_RING, SV_RING_SPEED); object_type object_type_body; object_type *i_ptr = &object_type_body; i_ptr->object_wipe(); if (k_idx) { object_prep(i_ptr, k_idx); apply_magic(i_ptr, k_info[k_idx].k_level, FALSE, TRUE, TRUE, TRUE); i_ptr->number = 2; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } //Give an amulet of the magi; k_idx = lookup_kind(TV_AMULET, SV_AMULET_THE_MAGI); if (k_idx) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); apply_magic(i_ptr, k_info[k_idx].k_level, FALSE, TRUE, TRUE, TRUE); i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } //boots of speed k_idx = lookup_kind(TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS); int ego_num = lookup_ego(TV_BOOTS, SV_PAIR_OF_SOFT_LEATHER_BOOTS, "speed"); if (k_idx && ego_num) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); i_ptr->ego_num = ego_num; a_m_aux_2(i_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(i_ptr, k_info[k_idx].k_level); i_ptr->to_a = 25; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } // Robe of Resistance k_idx = lookup_kind(TV_SOFT_ARMOR, SV_ROBE); ego_num = lookup_ego(TV_SOFT_ARMOR, SV_ROBE, "resistance"); if (k_idx && ego_num) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); i_ptr->ego_num = ego_num; a_m_aux_2(i_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(i_ptr, k_info[k_idx].k_level); i_ptr->to_a = 25; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } // super-charged holy avenger dagger k_idx = lookup_kind(TV_SWORD, SV_DAGGER); ego_num = lookup_ego(TV_SWORD, SV_DAGGER, "holy avenger"); if (k_idx && ego_num) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); i_ptr->ego_num = ego_num; a_m_aux_1(i_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(i_ptr, k_info[k_idx].k_level); i_ptr->to_a = i_ptr->to_h = i_ptr->to_d = 25; i_ptr->dd = i_ptr->ds = 9; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } // crown of the magi k_idx = lookup_kind(TV_CROWN, SV_SILVER_CROWN); ego_num = lookup_ego(TV_CROWN, SV_SILVER_CROWN, "magi"); if (k_idx && ego_num) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); i_ptr->ego_num = ego_num; a_m_aux_2(i_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(i_ptr, k_info[k_idx].k_level); i_ptr->to_a = 25; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } // super charged gloves of slaying k_idx = lookup_kind(TV_GLOVES, SV_SET_OF_LEATHER_GLOVES); ego_num = lookup_ego(TV_GLOVES, SV_SET_OF_LEATHER_GLOVES, "slaying"); if (k_idx && ego_num) { i_ptr->object_wipe(); object_prep(i_ptr, k_idx); i_ptr->ego_num = ego_num; a_m_aux_2(i_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(i_ptr, k_info[k_idx].k_level); i_ptr->to_a = i_ptr->to_h = i_ptr->to_d = 25; i_ptr->mark_fully_known(TRUE); object_history(i_ptr, ORIGIN_CHEAT, 0); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } //finally the Phial if (TRUE) { i_ptr->object_wipe(); if (wiz_alloc_artifact(i_ptr, 1)) { object_history(i_ptr, ORIGIN_CHEAT, 0); identify_object(i_ptr, true); if(inven_carry(i_ptr) < 0) { drop_near(i_ptr, -1, p_ptr->py, p_ptr->px); } } } handle_stuff(); this->accept(); return; } else if (game_mode != GAME_NPPANGBAND) return; int artis[] = { 47, // RINGIL 124, // CUBRAGOL 13, // NARYA 14, // NENYA 10, // ELESSAR 12, // GEM OF AMON SUL 38, // BLADETUNDER 113, // COLANNON 33, // THORIN 110, // NUMENOR 129, // CAMBELEG 127, // FEANOR 0 }; object_type obj; object_type *o_ptr = &obj; for (int i = 0; artis[i]; i++) { o_ptr->object_wipe(); if (!wiz_alloc_artifact(o_ptr, artis[i])) continue; object_history(o_ptr, ORIGIN_CHEAT, 0); identify_object(o_ptr, true); if (inven_carry(o_ptr) < 0) { drop_near(o_ptr, -1, p_ptr->py, p_ptr->px); } QString name = object_desc(o_ptr, ODESC_PREFIX | ODESC_FULL); message("Allocated " + name); } //Some amazing ammo; int k_idx = lookup_kind(TV_BOLT, SV_AMMO_MITHRIL); int ego_num = lookup_ego(TV_BOLT, SV_AMMO_MITHRIL, "holy might"); if (k_idx && ego_num) { o_ptr->object_wipe(); object_prep(o_ptr, k_idx); o_ptr->ego_num = ego_num; a_m_aux_1(o_ptr, k_info[k_idx].k_level, 2); apply_ego_item_magic(o_ptr, k_info[k_idx].k_level); o_ptr->to_h = 99; o_ptr->to_d = 99; o_ptr->dd = 25; o_ptr->ds = 25; o_ptr->number = 99; o_ptr->mark_fully_known(TRUE); object_history(o_ptr, ORIGIN_CHEAT, 0); if(inven_carry(o_ptr) < 0) { drop_near(o_ptr, -1, p_ptr->py, p_ptr->px); } } handle_stuff(); this->accept(); }