Beispiel #1
0
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);
    }
}
Beispiel #3
0
int _race_exp_factor(void)
{
    if (p_ptr->prace == RACE_DOPPELGANGER)
        return get_race()->exp;
    return get_true_race()->exp;
}