Esempio n. 1
0
static int
useonother_trappedairelemental(struct unit *u, int shipId,
const struct item_type *itype, int amount, struct order *ord)
{
    curse *c;
    ship *sh;

    if (shipId <= 0) {
        cmistake(u, ord, 20, MSG_MOVE);
        return -1;
    }

    sh = findshipr(u->region, shipId);
    if (!sh) {
        cmistake(u, ord, 20, MSG_MOVE);
        return -1;
    }

    c =
        create_curse(u, &sh->attribs, ct_find("shipspeedup"), 20, INT_MAX, SPEEDUP,
        0);
    c_setflag(c, CURSE_NOAGE);

    ADDMSG(&u->faction->msgs, msg_message("trappedairelemental_success",
        "unit region command ship", u, u->region, ord, sh));

    use_pooled(u, itype->rtype, GET_DEFAULT, 1);

    return 0;
}
Esempio n. 2
0
int sp_strong_wall(struct castorder * co)
{
    fighter * fi = co->magician.fig;
    int level = co->level;
    double power = co->force;
    battle *b = fi->side->battle;
    unit *mage = fi->unit;
    building *burg;
    double effect;
    message *msg;

    if (!mage->building) {
        return 0;
    }
    burg = mage->building;

    effect = power / 4;
    create_curse(mage, &burg->attribs, &ct_strongwall, power, 1, effect, 0);

    msg =
        msg_message("sp_strongwalls_effect", "mage building", mage, mage->building);
    message_all(b, msg);
    msg_release(msg);

    return level;
}
Esempio n. 3
0
int sp_strong_wall(struct castorder * co)
{
  fighter * fi = co->magician.fig;
  int level = co->level;
  float power = co->force;
  battle *b = fi->side->battle;
  unit *mage = fi->unit;
  building *burg;
  float effect;
  static bool init = false;
  message *msg;
  static const curse_type *strongwall_ct;
  if (!init) {
    init = true;
    strongwall_ct = ct_find("strongwall");
  }

  if (!mage->building) {
    return 0;
  }
  burg = mage->building;

  effect = power / 4;
  create_curse(mage, &burg->attribs, strongwall_ct, power, 1, effect, 0);

  msg =
    msg_message("sp_strongwalls_effect", "mage building", mage, mage->building);
  message_all(b, msg);
  msg_release(msg);

  return level;
}
Esempio n. 4
0
static void test_shipspeed_shipspeedup(CuTest *tc) {
    ship *sh;
    unit *cap, *crew;

    test_setup();
    sh = setup_ship();
    setup_crew(sh, 0, &cap, &crew);
    register_shipcurse();
    assert(sh && cap && crew);

    create_curse(0, &sh->attribs, &ct_shipspeedup, 1, 1, 3, 0);
    CuAssertIntEquals_Msg(tc, "shipspeedup adds effect to range", sh->type->range + 3, shipspeed(sh, cap));
    test_teardown();
}
Esempio n. 5
0
static void test_shipspeed_nodrift(CuTest *tc) {
    ship *sh;
    unit *cap, *crew;

    test_cleanup();
    sh = setup_ship();
    setup_crew(sh, 0, &cap, &crew);
    register_shipcurse();
    assert(sh && cap && crew);

    create_curse(0, &sh->attribs, ct_find("nodrift"), 1, 1, 1, 0);
    CuAssertIntEquals_Msg(tc, "nodrift adds +1 to range", sh->type->range + 1, shipspeed(sh, cap));
    test_cleanup();
}
Esempio n. 6
0
static void test_shipspeed_stormwind(CuTest *tc) {
    ship *sh;
    unit *cap, *crew;

    test_cleanup();
    sh = setup_ship();
    setup_crew(sh, 0, &cap, &crew);
    register_shipcurse();
    assert(sh && cap && crew);

    create_curse(0, &sh->attribs, ct_find("stormwind"), 1, 1, 1, 0);
    CuAssertIntEquals_Msg(tc, "stormwind doubles ship range", sh->type->range * 2, shipspeed(sh, cap));
    test_cleanup();
}
Esempio n. 7
0
static void test_curse(CuTest * tc)
{
  attrib *attrs = NULL;
  curse *c, *result;
  int cid;

  curse_type ct_dummy = { "dummy", CURSETYP_NORM, 0, M_SUMEFFECT, NULL };
  c = create_curse(NULL, &attrs, &ct_dummy, 1.0, 1, 1, 1);
  cid = c->no;
  result = findcurse(cid);
  CuAssertPtrEquals(tc, c, result);
  destroy_curse(c);
  result = findcurse(cid);
  CuAssertPtrEquals(tc, NULL, result);
}
static int createcurse_handle(trigger * t, void *data)
{
    /* call an event handler on createcurse.
     * data.v -> ( variant event, int timer )
     */
    createcurse_data *td = (createcurse_data *)t->data.v;
    if (td->mage && td->target && td->mage->number && td->target->number) {
        create_curse(td->mage, &td->target->attribs,
            td->type, td->vigour, td->duration, td->effect, td->men);
    }
    else {
        log_error("could not perform createcurse::handle()\n");
    }
    unused_arg(data);
    return 0;
}
Esempio n. 9
0
static void test_shipspeed_stormwind(CuTest *tc) {
    ship *sh;
    unit *cap, *crew;

    test_setup();
    sh = setup_ship();
    setup_crew(sh, 0, &cap, &crew);
    register_shipcurse();
    assert(sh && cap && crew);

    create_curse(0, &sh->attribs, &ct_stormwind, 1, 1, 1, 0);
    CuAssertPtrNotNull(tc, sh->attribs);
    CuAssertIntEquals_Msg(tc, "stormwind doubles ship range", sh->type->range * 2, shipspeed(sh, cap));
    a_age(&sh->attribs, sh);
    CuAssertPtrEquals(tc, NULL, sh->attribs);
    test_teardown();
}
Esempio n. 10
0
static int
use_hornofdancing(struct unit *u, const struct item_type *itype,
int amount, struct order *ord)
{
    region *r;
    int regionsPacified = 0;

    for (r = regions; r; r = r->next) {
        if (distance(u->region, r) < HORNRANGE) {
            if (a_find(r->attribs, &at_peaceimmune) == NULL) {
                attrib *a;

                create_curse(u, &r->attribs, ct_find("peacezone"),
                    20, HORNDURATION, 1.0, 0);

                a = a_add(&r->attribs, a_new(&at_peaceimmune));
                a->data.i = HORNIMMUNITY;

                ADDMSG(&r->msgs, msg_message("hornofpeace_r_success",
                    "unit region", u, u->region));

                regionsPacified++;
            }
            else {
                ADDMSG(&r->msgs, msg_message("hornofpeace_r_nosuccess",
                    "unit region", u, u->region));
            }
        }
    }

    if (regionsPacified > 0) {
        ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "hornofpeace_u_success",
            "pacified", regionsPacified));
    }
    else {
        ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "hornofpeace_u_nosuccess",
            ""));
    }

    return 0;
}
Esempio n. 11
0
static curse *shipcurse_flyingship(ship * sh, unit * mage, double power, int duration)
{
    curse *c;
    if (sh->attribs) {
        if (curse_active(get_curse(sh->attribs, &ct_flyingship))) {
            return NULL;
        }
        if (is_cursed(sh->attribs, &ct_shipspeedup)) {
            return NULL;
        }
    }
    /* mit C_SHIP_NODRIFT haben wir kein Problem */
    c = create_curse(mage, &sh->attribs, &ct_flyingship, power, duration, 0.0, 0);
    if (c) {
        c->data.v = sh;
        if (c->duration > 0) {
            sh->flags |= SF_FLYING;
        }
    }
    return c;
}
Esempio n. 12
0
void alp_findet_opfer(unit * alp, region * r)
{
  curse *c;
  attrib *a = a_find(alp->attribs, &at_alp);
  alp_data *ad = (alp_data *) a->data.v;
  unit *mage = ad->mage;
  unit *opfer = ad->target;
  float effect;
  message *msg;

  assert(opfer);
  assert(mage);

  /* Magier und Opfer Bescheid geben */
  msg = msg_message("alp_success", "target", opfer);
  add_message(&mage->faction->msgs, msg);
  r_addmessage(opfer->region, opfer->faction, msg);
  msg_release(msg);

  /* Relations werden in destroy_unit(alp) automatisch gelöscht.
   * Die Aktionen, die beim Tod des Alps ausgelöst werden sollen,
   * müssen jetzt aber deaktiviert werden, sonst werden sie gleich
   * beim destroy_unit(alp) ausgelöst.
   */
  a_removeall(&alp->attribs, &at_eventhandler);

  /* Alp umwandeln in Curse */
  effect = -2;
  c =
    create_curse(mage, &opfer->attribs, ct_find("worse"), 2, 2, effect,
    opfer->number);
  /* solange es noch keine spezielle alp-Antimagie gibt, reagiert der
   * auch auf normale */
  set_number(alp, 0);

  /* wenn der Magier stirbt, wird der Curse wieder vom Opfer genommen */
  add_trigger(&mage->attribs, "destroy", trigger_removecurse(c, opfer));
}
Esempio n. 13
0
static void setup_curse(curse_fixture *fix, const char *name) {
    test_cleanup();
    fix->r = test_create_region(0, 0, NULL);
    fix->u = test_create_unit(test_create_faction(NULL), fix->r);
    fix->c = create_curse(fix->u, &fix->r->attribs, ct_find(name), 1.0, 1, 1.0, 0);
}