void do_cmd_power(void) { spell_info spells[MAX_SPELLS]; int ct = 0; int choice = 0; race_t *race_ptr = get_race(); class_t *class_ptr = get_class(); if (p_ptr->confused) { msg_print("You are too confused!"); return; } /* Hack ... Rethink this a bit, but the alternative of hacking into the 'm' command is a million times worse! Doppelgangers need to be able to cancel their current mimicry. Also, add Mimic power back first so it always stays in the 'a' slot. */ if (race_ptr->mimic && p_ptr->prace == RACE_DOPPELGANGER) { ct += (get_true_race()->get_powers)(spells + ct, MAX_SPELLS - ct); } if (race_ptr->get_powers != NULL) { ct += (race_ptr->get_powers)(spells + ct, MAX_SPELLS - ct); } if (class_ptr != NULL && class_ptr->get_powers != NULL) { ct += (class_ptr->get_powers)(spells + ct, MAX_SPELLS - ct); } ct += mut_get_powers(spells + ct, MAX_SPELLS - ct); if (ct == 0) { msg_print("You have no powers."); return; } _add_extra_costs_powers(spells, ct); choice = choose_spell(spells, ct, "power", p_ptr->csp + p_ptr->chp); if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN)) { set_action(ACTION_NONE); } if (choice >= 0 && choice < ct) { spell_info *spell = &spells[choice]; if (spell->level > p_ptr->lev) { msg_print("You can't use that power yet!"); return; } if (spell->cost > p_ptr->chp + p_ptr->csp) { msg_print("Using this power will kill you! Why not rest a bit first?"); return; } /* Check for Failure */ if (randint0(100) < spell->fail) { spell_stats_on_fail(spell); sound(SOUND_FAIL); /* Doh! */ fail_spell(spell->fn); if (flush_failure) flush(); msg_print("You failed to concentrate hard enough!"); } else { if (!cast_spell(spell->fn)) return; spell_stats_on_cast(spell); sound(SOUND_ZAP); /* Wahoo! */ } energy_use = get_spell_energy(spell->fn); /* Casting costs spill over into hit points */ if (p_ptr->csp < spell->cost) { int cost = spell->cost - p_ptr->csp; p_ptr->csp = 0; take_hit(DAMAGE_USELIFE, cost, "concentrating too hard", -1); } else p_ptr->csp -= spell->cost; p_ptr->redraw |= (PR_MANA); p_ptr->redraw |= (PR_HP); p_ptr->window |= (PW_SPELL); } }
static void wr_extra(savefile_ptr file) { int i,j; byte tmp8u; savefile_write_cptr(file, player_name); savefile_write_cptr(file, p_ptr->died_from); savefile_write_cptr(file, p_ptr->last_message ? p_ptr->last_message : ""); wr_quick_start(file); savefile_write_s32b(file, game_mode); savefile_write_byte(file, p_ptr->prace); savefile_write_byte(file, p_ptr->pclass); savefile_write_byte(file, p_ptr->personality); savefile_write_byte(file, p_ptr->psex); savefile_write_byte(file, p_ptr->realm1); savefile_write_byte(file, p_ptr->realm2); savefile_write_byte(file, p_ptr->dragon_realm); savefile_write_byte(file, p_ptr->psubclass); savefile_write_byte(file, p_ptr->psubrace); savefile_write_s16b(file, p_ptr->current_r_idx); savefile_write_u16b(file, p_ptr->expfact); for (i = 0; i < 6; ++i) savefile_write_s16b(file, p_ptr->stat_max[i]); for (i = 0; i < 6; ++i) savefile_write_s16b(file, p_ptr->stat_max_max[i]); for (i = 0; i < 6; ++i) savefile_write_s16b(file, p_ptr->stat_cur[i]); savefile_write_u32b(file, p_ptr->au); savefile_write_s16b(file, p_ptr->fame); savefile_write_u32b(file, p_ptr->max_exp); savefile_write_u32b(file, p_ptr->max_max_exp); savefile_write_u32b(file, p_ptr->exp); savefile_write_u32b(file, p_ptr->exp_frac); savefile_write_s16b(file, p_ptr->lev); for (i = 0; i < 64; i++) savefile_write_s16b(file, p_ptr->spell_exp[i]); for (i = 0; i < 5; i++) for (j = 0; j < 64; j++) savefile_write_s16b(file, p_ptr->weapon_exp[i][j]); for (i = 0; i < 10; i++) savefile_write_s16b(file, p_ptr->skill_exp[i]); for (i = 0; i < MAX_MAGIC_NUM; i++) savefile_write_s32b(file, p_ptr->magic_num1[i]); for (i = 0; i < MAX_MAGIC_NUM; i++) savefile_write_byte(file, p_ptr->magic_num2[i]); savefile_write_byte(file, p_ptr->start_race); savefile_write_s32b(file, p_ptr->old_race1); savefile_write_s32b(file, p_ptr->old_race2); savefile_write_s16b(file, p_ptr->old_realm); for (i = 0; i < MAX_MANE; i++) { savefile_write_s16b(file, p_ptr->mane_spell[i]); savefile_write_s16b(file, p_ptr->mane_dam[i]); } savefile_write_s16b(file, p_ptr->mane_num); for (i = 0; i < MAX_KUBI; i++) savefile_write_s16b(file, kubi_r_idx[i]); for (i = 0; i < 4; i++) { savefile_write_s16b(file, battle_mon[i]); savefile_write_u32b(file, mon_odds[i]); } savefile_write_s16b(file, p_ptr->town_num); savefile_write_s16b(file, p_ptr->arena_number); savefile_write_s16b(file, p_ptr->inside_arena); savefile_write_s16b(file, p_ptr->inside_battle); savefile_write_byte(file, p_ptr->exit_bldg); savefile_write_s16b(file, p_ptr->oldpx); savefile_write_s16b(file, p_ptr->oldpy); savefile_write_s32b(file, p_ptr->mhp); savefile_write_s32b(file, p_ptr->chp); savefile_write_u32b(file, p_ptr->chp_frac); savefile_write_s32b(file, p_ptr->msp); savefile_write_s32b(file, p_ptr->csp); savefile_write_u32b(file, p_ptr->csp_frac); savefile_write_s16b(file, p_ptr->max_plv); tmp8u = (byte)max_d_idx; savefile_write_byte(file, tmp8u); for (i = 0; i < tmp8u; i++) savefile_write_s16b(file, max_dlv[i]); for (i = 0; i < tmp8u; i++) savefile_write_u32b(file, dungeon_flags[i]); savefile_write_s16b(file, p_ptr->concent); savefile_write_s16b(file, p_ptr->blind); savefile_write_s16b(file, p_ptr->paralyzed); savefile_write_s16b(file, p_ptr->confused); savefile_write_s16b(file, p_ptr->food); savefile_write_s16b(file, p_ptr->energy_need); savefile_write_s16b(file, p_ptr->fast); savefile_write_s16b(file, p_ptr->slow); savefile_write_s16b(file, p_ptr->afraid); savefile_write_s16b(file, p_ptr->cut); savefile_write_s16b(file, p_ptr->stun); savefile_write_s16b(file, p_ptr->poisoned); savefile_write_s16b(file, p_ptr->image); savefile_write_s16b(file, p_ptr->protevil); savefile_write_s16b(file, p_ptr->invuln); savefile_write_s16b(file, p_ptr->ult_res); savefile_write_s16b(file, p_ptr->hero); savefile_write_s16b(file, p_ptr->shero); savefile_write_s16b(file, p_ptr->shield); savefile_write_s16b(file, p_ptr->blessed); savefile_write_s16b(file, p_ptr->tim_invis); savefile_write_s16b(file, p_ptr->word_recall); savefile_write_s16b(file, p_ptr->recall_dungeon); savefile_write_s16b(file, p_ptr->alter_reality); savefile_write_s16b(file, p_ptr->see_infra); savefile_write_s16b(file, p_ptr->tim_infra); savefile_write_s16b(file, p_ptr->oppose_fire); savefile_write_s16b(file, p_ptr->oppose_cold); savefile_write_s16b(file, p_ptr->oppose_acid); savefile_write_s16b(file, p_ptr->oppose_elec); savefile_write_s16b(file, p_ptr->oppose_pois); savefile_write_s16b(file, p_ptr->tsuyoshi); savefile_write_s16b(file, p_ptr->tim_esp); savefile_write_s16b(file, p_ptr->tim_esp_magical); savefile_write_s16b(file, p_ptr->wraith_form); savefile_write_s16b(file, p_ptr->resist_magic); savefile_write_s16b(file, p_ptr->tim_regen); savefile_write_s16b(file, p_ptr->kabenuke); savefile_write_s16b(file, p_ptr->tim_stealth); savefile_write_s16b(file, p_ptr->tim_levitation); savefile_write_s16b(file, p_ptr->tim_sh_touki); savefile_write_s16b(file, p_ptr->lightspeed); savefile_write_s16b(file, p_ptr->tsubureru); savefile_write_s16b(file, p_ptr->magicdef); savefile_write_s16b(file, p_ptr->tim_res_nether); savefile_write_s16b(file, p_ptr->tim_res_time); savefile_write_s16b(file, p_ptr->tim_res_disenchantment); savefile_write_s16b(file, p_ptr->mimic_form); savefile_write_s16b(file, p_ptr->tim_mimic); savefile_write_s16b(file, p_ptr->tim_sh_fire); savefile_write_s16b(file, p_ptr->tim_sh_elements); savefile_write_s16b(file, p_ptr->tim_sh_shards); savefile_write_s16b(file, p_ptr->tim_sh_domination); savefile_write_s16b(file, p_ptr->tim_weaponmastery); savefile_write_s16b(file, p_ptr->tim_sh_holy); savefile_write_s16b(file, p_ptr->tim_eyeeye); savefile_write_s16b(file, p_ptr->tim_spurt); savefile_write_s16b(file, p_ptr->tim_no_spells); savefile_write_s16b(file, p_ptr->tim_no_device); savefile_write_s16b(file, p_ptr->tim_blood_shield); savefile_write_s16b(file, p_ptr->tim_blood_sight); savefile_write_s16b(file, p_ptr->tim_blood_feast); savefile_write_s16b(file, p_ptr->tim_blood_revenge); savefile_write_s16b(file, p_ptr->tim_blood_seek); savefile_write_s16b(file, p_ptr->tim_blood_rite); savefile_write_s16b(file, p_ptr->tim_force); savefile_write_s16b(file, p_ptr->tim_building_up); savefile_write_s16b(file, p_ptr->tim_vicious_strike); savefile_write_s16b(file, p_ptr->tim_enlarge_weapon); savefile_write_s16b(file, p_ptr->tim_spell_reaction); savefile_write_s16b(file, p_ptr->tim_resist_curses); savefile_write_s16b(file, p_ptr->tim_armor_of_fury); savefile_write_s16b(file, p_ptr->tim_spell_turning); savefile_write_s16b(file, p_ptr->tim_dark_stalker); savefile_write_s16b(file, p_ptr->tim_nimble_dodge); savefile_write_s16b(file, p_ptr->tim_stealthy_snipe); savefile_write_s16b(file, p_ptr->tim_killing_spree); savefile_write_s16b(file, p_ptr->tim_slay_sentient); { int i; savefile_write_s16b(file, MAX_WILD_COUNTERS); for (i = 0; i < MAX_WILD_COUNTERS; i++) { savefile_write_s16b(file, p_ptr->wild_counters[i].type); savefile_write_s16b(file, p_ptr->wild_counters[i].counter); } } /* Remember the Monkey Clone */ { int i; monster_race *r_ptr = &r_info[MON_MONKEY_CLONE]; savefile_write_byte(file, r_ptr->cur_num); if (r_ptr->cur_num) { savefile_write_byte(file, r_ptr->hdice); /* Probably not required ... */ savefile_write_byte(file, r_ptr->hside); /* Probably not required ... */ savefile_write_s16b(file, r_ptr->ac); savefile_write_byte(file, r_ptr->speed); /* Probably not required ... */ for (i = 0; i < 4; i++) { savefile_write_byte(file, r_ptr->blow[i].method); savefile_write_byte(file, r_ptr->blow[i].effect); savefile_write_byte(file, r_ptr->blow[i].d_dice); savefile_write_byte(file, r_ptr->blow[i].d_side); } savefile_write_u32b(file, r_ptr->flags3); savefile_write_u32b(file, r_ptr->flagsr); savefile_write_u32b(file, r_ptr->flags2); savefile_write_u32b(file, r_ptr->flags7); } } savefile_write_s16b(file, p_ptr->entrench_x); savefile_write_s16b(file, p_ptr->entrench_y); savefile_write_s16b(file, p_ptr->entrench_ct); savefile_write_byte(file, p_ptr->sense_artifact); savefile_write_s16b(file, p_ptr->duelist_target_idx); /* by henkma */ savefile_write_s16b(file, p_ptr->tim_reflect); savefile_write_s16b(file, p_ptr->multishadow); savefile_write_s16b(file, p_ptr->dustrobe); savefile_write_s16b(file, p_ptr->tim_superstealth); savefile_write_bool(file, p_ptr->fasting); savefile_write_s16b(file, p_ptr->tim_sustain_str); savefile_write_s16b(file, p_ptr->tim_sustain_int); savefile_write_s16b(file, p_ptr->tim_sustain_wis); savefile_write_s16b(file, p_ptr->tim_sustain_dex); savefile_write_s16b(file, p_ptr->tim_sustain_con); savefile_write_s16b(file, p_ptr->tim_sustain_chr); savefile_write_s16b(file, p_ptr->tim_hold_life); savefile_write_s16b(file, p_ptr->tim_transcendence); savefile_write_s16b(file, p_ptr->tim_quick_walk); savefile_write_s16b(file, p_ptr->tim_inven_prot); savefile_write_s16b(file, p_ptr->tim_device_power); savefile_write_s16b(file, p_ptr->tim_sh_time); savefile_write_s16b(file, p_ptr->free_turns); savefile_write_s16b(file, p_ptr->tim_foresight); savefile_write_s16b(file, p_ptr->chaos_patron); for (i = 0; i < MUT_FLAG_SIZE; ++i) savefile_write_u32b(file, p_ptr->muta[i]); for (i = 0; i < MUT_FLAG_SIZE; ++i) savefile_write_u32b(file, p_ptr->muta_lock[i]); for (i = 0; i < MAX_DEMIGOD_POWERS; ++i) savefile_write_s16b(file, p_ptr->demigod_power[i]); savefile_write_s16b(file, p_ptr->draconian_power); for (i = 0; i<8; i++) savefile_write_s16b(file, p_ptr->virtues[i]); for (i = 0; i<8; i++) savefile_write_s16b(file, p_ptr->vir_types[i]); savefile_write_s16b(file, p_ptr->ele_attack); savefile_write_u32b(file, p_ptr->special_attack); savefile_write_s16b(file, p_ptr->ele_immune); savefile_write_u32b(file, p_ptr->special_defense); savefile_write_byte(file, p_ptr->knowledge); savefile_write_byte(file, p_ptr->autopick_autoregister); savefile_write_byte(file, p_ptr->action); savefile_write_byte(file, preserve_mode); savefile_write_byte(file, p_ptr->wait_report_score); savefile_write_u32b(file, seed_flavor); savefile_write_u32b(file, seed_town); savefile_write_u16b(file, p_ptr->panic_save); savefile_write_u16b(file, p_ptr->total_winner); savefile_write_u16b(file, p_ptr->noscore); savefile_write_byte(file, p_ptr->is_dead); savefile_write_byte(file, p_ptr->feeling); savefile_write_s32b(file, old_turn); savefile_write_s32b(file, p_ptr->feeling_turn); savefile_write_s32b(file, game_turn); savefile_write_s32b(file, player_turn); savefile_write_s32b(file, dungeon_turn); savefile_write_s32b(file, old_battle); savefile_write_s16b(file, today_mon); savefile_write_s16b(file, p_ptr->today_mon); savefile_write_s16b(file, p_ptr->riding); savefile_write_s16b(file, p_ptr->floor_id); savefile_write_u32b(file, playtime); savefile_write_u32b(file, p_ptr->count); { race_t *race_ptr = get_true_race(); class_t *class_ptr = get_class(); if (race_ptr->save_player) race_ptr->save_player(file); if (class_ptr->save_player) class_ptr->save_player(file); } }
int _race_exp_factor(void) { if (p_ptr->prace == RACE_DOPPELGANGER) return get_race()->exp; return get_true_race()->exp; }