Example #1
0
int sp_berserk(struct castorder * co)
{
    fighter * fi = co->magician.fig;
    int level = co->level;
    double power = co->force;
    const spell * sp = co->sp;
    battle *b = fi->side->battle;
    int at_bonus = 0;
    int df_malus = 0;
    int force = 0;
    int allies = 0;
    int targets = 0;
    message *m;

    switch (sp->id) {
    case SPL_BERSERK:
    case SPL_BLOODTHIRST:
        at_bonus = _max(1, level / 3);
        df_malus = 2;
        force = (int)get_force(power, 2);
        break;

    default:
        at_bonus = 1;
        df_malus = 0;
        force = (int)power;
    }

    allies =
        count_allies(fi->side, FIGHT_ROW, BEHIND_ROW - 1, SELECT_ADVANCE, ALLY_ANY);
    /* maximal 2*allies Versuche ein Opfer zu finden, ansonsten best�nde
     * die Gefahr eine Endlosschleife*/
    allies *= 2;

    while (force && allies) {
        troop dt = select_ally(fi, FIGHT_ROW, BEHIND_ROW - 1, ALLY_ANY);
        fighter *df = dt.fighter;
        --allies;

        if (df) {
            if (!(df->person[dt.index].flags & FL_COURAGE)) {
                df->person[dt.index].attack += at_bonus;
                df->person[dt.index].defence -= df_malus;
                df->person[dt.index].flags = df->person[dt.index].flags | FL_COURAGE;
                targets++;
                --force;
            }
        }
    }

    m =
        msg_message("cast_berserk_effect", "mage spell amount", fi->unit, sp,
        targets);
    message_all(b, m);
    msg_release(m);
    return level;
}
Example #2
0
/* Heldenmut */
int sp_hero(struct castorder * co)
{
    fighter * fi = co->magician.fig;
    int level = co->level;
    double power = co->force;
    const spell * sp = co->sp;
    battle *b = fi->side->battle;
    int df_bonus = 0;
    int force = 0;
    int allies;
    int targets = 0;
    message *m;

    df_bonus = (int)(power / 5);
    force = lovar(get_force(power, 4));
    if (force < 1) force = 1;

    allies =
        count_allies(fi->side, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE, ALLY_ANY);
    /* maximal 2*allies Versuche ein Opfer zu finden, ansonsten bestuende
     * die Gefahr eine Endlosschleife*/
    allies *= 2;

    while (force && allies) {
        troop dt = select_ally(fi, FIGHT_ROW, BEHIND_ROW, ALLY_ANY);
        fighter *df = dt.fighter;
        --allies;

        if (df) {
            if (!(df->person[dt.index].flags & FL_COURAGE)) {
                df->person[dt.index].defense += df_bonus;
                df->person[dt.index].flags = df->person[dt.index].flags | FL_COURAGE;
                targets++;
                --force;
            }
        }
    }

    m =
        msg_message("cast_hero_effect", "mage spell amount", fi->unit, sp, targets);
    message_all(b, m);
    msg_release(m);

    return level;
}
Example #3
0
int sp_speed(struct castorder * co)
{
    fighter * fi = co->magician.fig;
    double power = co->force;
    const spell * sp = co->sp;
    battle *b = fi->side->battle;
    int force;
    int allies;
    int targets = 0;
    message *m;

    force = lovar(power * power * 5);

    allies =
        count_allies(fi->side, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE, ALLY_ANY);
    /* maximal 2*allies Versuche ein Opfer zu finden, ansonsten bestuende
     * die Gefahr eine Endlosschleife*/
    allies *= 2;

    while (force && allies) {
        troop dt = select_ally(fi, FIGHT_ROW, BEHIND_ROW, ALLY_ANY);
        fighter *df = dt.fighter;
        --allies;

        if (df) {
            if (df->person[dt.index].speed == 1) {
                df->person[dt.index].speed++;
                targets++;
                --force;
            }
        }
    }

    m =
        msg_message("cast_speed_effect", "mage spell amount", fi->unit, sp,
        targets);
    message_all(b, m);
    msg_release(m);
    return 1;
}