void demigod_rechoose_powers(void) { int i, idx; for (i = 0; i < MAX_DEMIGOD_POWERS; i++) { idx = p_ptr->demigod_power[i]; if (idx >= 0) { mut_unlock(idx); mut_lose(idx); p_ptr->demigod_power[i] = -1; } } _gain_level(p_ptr->lev); }
void mimic_race(int new_race, const char *msg) { int old_race = p_ptr->mimic_form; if (p_ptr->prace != RACE_DOPPELGANGER) return; if (p_ptr->tim_mimic) return; if (new_race == old_race) return; if (msg) msg_print(msg); if (old_race == RACE_HUMAN || old_race == RACE_DEMIGOD) { int i, idx; for (i = 0; i < MAX_DEMIGOD_POWERS; i++) { idx = p_ptr->demigod_power[i]; if (idx >= 0) { mut_unlock(idx); mut_lose(idx); /* Lose the mutation, but not the choice! p_ptr->demigod_power[i] = -1; */ } } } /* Shifting form causes mutations to vanish! */ mut_lose_all(); if (new_race == MIMIC_NONE) msg_print("You resume your true form."); else { race_t *race_ptr = get_race_t_aux(new_race, 0); if (is_a_vowel(race_ptr->name[0])) msg_format("You turn into an %s!", race_ptr->name); else msg_format("You turn into a %s!", race_ptr->name); } p_ptr->mimic_form = new_race; p_ptr->expfact = calc_exp_factor(); check_experience(); if (new_race == RACE_HUMAN || new_race == RACE_DEMIGOD) { get_race_t()->gain_level(p_ptr->lev); /* This is OK ... Just make sure we get to choose racial powers on mimicry */ } if (new_race == RACE_BEASTMAN) { int i; mut_gain_random(mut_good_pred); for (i = 2; i <= p_ptr->lev; i++) { if (one_in_(5)) mut_gain_random(NULL); } } p_ptr->redraw |= (PR_BASIC | PR_STATUS | PR_MAP); p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA); equip_on_change_race(); reset_visuals(); handle_stuff(); }