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; }
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; }
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; }
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(); }
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(); }
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(); }
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; }
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(); }
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; }
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; }
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)); }
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); }