static void test_otherfaction(CuTest *tc) { unit *u; faction *f; test_setup(); u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); f = test_create_faction(NULL); config_set("stealth.faction.other", "1"); CuAssertIntEquals(tc, true, rule_stealth_other()); CuAssertPtrEquals(tc, u->faction, visible_faction(f, u)); a_add(&u->attribs, make_otherfaction(f)); CuAssertPtrEquals(tc, f, visible_faction(f, u)); test_teardown(); }
void piracy_cmd(unit * u, order *ord) { region *r = u->region; ship *sh = u->ship, *sh2; direction_t target_dir; struct { const faction *target; int value; } aff[MAXDIRECTIONS]; int saff = 0; int *il; if (!validate_pirate(u, ord)) { return; } il = parse_ids(ord); /* Feststellen, ob schon ein anderer alliierter Pirat ein * Ziel gefunden hat. */ target_dir = find_piracy_target(u, il); /* Wenn nicht, sehen wir, ob wir ein Ziel finden. */ if (target_dir == NODIRECTION) { direction_t dir; /* Einheit ist also Kapitän. Jetzt gucken, in wievielen * Nachbarregionen potentielle Opfer sind. */ for (dir = 0; dir < MAXDIRECTIONS; dir++) { region *rc = rconnect(r, dir); aff[dir].value = 0; aff[dir].target = 0; if (rc && fval(rc->terrain, SAIL_INTO) && can_takeoff(sh, r, rc)) { for (sh2 = rc->ships; sh2; sh2 = sh2->next) { unit *cap = ship_owner(sh2); if (cap) { faction *f = visible_faction(cap->faction, cap); if (alliedunit(u, f, HELP_FIGHT)) continue; if (!il || intlist_find(il, cap->faction->no)) { // TODO: shouldn't this be f->no? ++aff[dir].value; if (rng_int() % aff[dir].value == 0) { aff[dir].target = f; } } } } /* Und aufaddieren. */ saff += aff[dir].value; } } if (saff != 0) { saff = rng_int() % saff; for (dir = 0; dir != MAXDIRECTIONS; ++dir) { if (saff < aff[dir].value) { target_dir = dir; a_add(&r->attribs, mk_piracy(u->faction, aff[dir].target, target_dir)); break; } saff -= aff[dir].value; } } } free(il); /* Wenn kein Ziel gefunden, entsprechende Meldung generieren */ if (target_dir == NODIRECTION) { ADDMSG(&u->faction->msgs, msg_message("piratenovictim", "ship region", sh, r)); return; } /* Meldung generieren */ ADDMSG(&u->faction->msgs, msg_message("piratesawvictim", "ship region dir", sh, r, target_dir)); /* Befehl konstruieren */ set_order(&u->thisorder, create_order(K_MOVE, u->faction->locale, "%s", LOC(u->faction->locale, directions[target_dir]))); /* Bewegung ausführen */ init_order(u->thisorder); move_cmd(u, true); }