forked from github/server
New Syntax: CONTACT [UNIT|FACTION] ...
Move everything to contact module, add tests.
This commit is contained in:
parent
0fd7906d41
commit
c48371387c
|
@ -6,9 +6,16 @@
|
||||||
|
|
||||||
#include "kernel/attrib.h"
|
#include "kernel/attrib.h"
|
||||||
#include "kernel/faction.h"
|
#include "kernel/faction.h"
|
||||||
|
#include "kernel/messages.h"
|
||||||
#include "kernel/order.h"
|
#include "kernel/order.h"
|
||||||
#include "kernel/unit.h"
|
#include "kernel/unit.h"
|
||||||
|
|
||||||
|
#include "util/base36.h"
|
||||||
|
#include "util/param.h"
|
||||||
|
#include "util/parser.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
static attrib_type at_contact_unit = {
|
static attrib_type at_contact_unit = {
|
||||||
"contact_unit",
|
"contact_unit",
|
||||||
DEFAULT_INIT,
|
DEFAULT_INIT,
|
||||||
|
@ -18,16 +25,7 @@ static attrib_type at_contact_unit = {
|
||||||
NO_READ
|
NO_READ
|
||||||
};
|
};
|
||||||
|
|
||||||
static attrib_type at_contact_faction = {
|
void contact_unit(unit * u, const unit * u2)
|
||||||
"contact_faction",
|
|
||||||
DEFAULT_INIT,
|
|
||||||
DEFAULT_FINALIZE,
|
|
||||||
DEFAULT_AGE,
|
|
||||||
NO_WRITE,
|
|
||||||
NO_READ
|
|
||||||
};
|
|
||||||
|
|
||||||
void usetcontact(unit * u, const unit * u2)
|
|
||||||
{
|
{
|
||||||
attrib *a = a_find(u->attribs, &at_contact_unit);
|
attrib *a = a_find(u->attribs, &at_contact_unit);
|
||||||
while (a && a->type == &at_contact_unit) {
|
while (a && a->type == &at_contact_unit) {
|
||||||
|
@ -39,6 +37,27 @@ void usetcontact(unit * u, const unit * u2)
|
||||||
a_add(&u->attribs, a_new(&at_contact_unit))->data.v = (void *)u2;
|
a_add(&u->attribs, a_new(&at_contact_unit))->data.v = (void *)u2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static attrib_type at_contact_faction = {
|
||||||
|
"contact_faction",
|
||||||
|
DEFAULT_INIT,
|
||||||
|
DEFAULT_FINALIZE,
|
||||||
|
DEFAULT_AGE,
|
||||||
|
NO_WRITE,
|
||||||
|
NO_READ
|
||||||
|
};
|
||||||
|
|
||||||
|
void contact_faction(unit * u, const faction * f)
|
||||||
|
{
|
||||||
|
attrib *a = a_find(u->attribs, &at_contact_faction);
|
||||||
|
while (a && a->type == &at_contact_faction) {
|
||||||
|
if (a->data.v == f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
a = a->next;
|
||||||
|
}
|
||||||
|
a_add(&u->attribs, a_new(&at_contact_faction))->data.v = (void *)f;
|
||||||
|
}
|
||||||
|
|
||||||
bool ucontact(const unit * u, const unit * u2)
|
bool ucontact(const unit * u, const unit * u2)
|
||||||
/* Prueft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */
|
/* Prueft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */
|
||||||
{
|
{
|
||||||
|
@ -65,16 +84,53 @@ bool ucontact(const unit * u, const unit * u2)
|
||||||
|
|
||||||
int contact_cmd(unit * u, order * ord)
|
int contact_cmd(unit * u, order * ord)
|
||||||
{
|
{
|
||||||
unit *u2;
|
char token[16];
|
||||||
int n;
|
const char *str;
|
||||||
|
param_t p;
|
||||||
|
|
||||||
init_order(ord, u->faction->locale);
|
init_order(ord, u->faction->locale);
|
||||||
n = read_unitid(u->faction, u->region);
|
str = gettoken(token, sizeof(token));
|
||||||
u2 = findunit(n);
|
p = findparam(str, u->faction->locale);
|
||||||
|
if (p == P_FACTION) {
|
||||||
if (u2 != NULL) {
|
/* new-style syntax, KONTAKTIERE PARTEI foo */
|
||||||
usetcontact(u, u2);
|
faction * f = getfaction();
|
||||||
|
if (!f) {
|
||||||
|
cmistake(u, ord, 66, MSG_EVENT);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
contact_faction(u, f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
else if (p == P_UNIT) {
|
||||||
|
/* new-style syntax, KONTAKTIERE EINHEIT [TEMP] foo */
|
||||||
|
unit *u2 = NULL;
|
||||||
|
if (GET_UNIT == getunit(u->region, u->faction, &u2)) {
|
||||||
|
assert(u2);
|
||||||
|
contact_unit(u, u2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord,
|
||||||
|
"feedback_unit_not_found", NULL));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* old-style syntax, KONTAKTIERE foo */
|
||||||
|
unit *u2;
|
||||||
|
int n = 0;
|
||||||
|
if (p == P_TEMP) {
|
||||||
|
n = getid();
|
||||||
|
u2 = findnewunit(u->region, u->faction, n);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n = atoi36((const char *)str);
|
||||||
|
u2 = findunit(n);
|
||||||
|
}
|
||||||
|
if (u2 != NULL) {
|
||||||
|
contact_unit(u, u2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord,
|
||||||
|
"feedback_unit_not_found", NULL));
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
struct unit;
|
|
||||||
struct faction;
|
struct faction;
|
||||||
|
struct order;
|
||||||
|
struct unit;
|
||||||
|
|
||||||
bool ucontact(const struct unit *u, const struct unit *u2);
|
bool ucontact(const struct unit *u, const struct unit *u2);
|
||||||
void usetcontact(struct unit *u, const struct unit *c);
|
void contact_unit(struct unit *u, const struct unit *c);
|
||||||
|
void contact_faction(struct unit * u, const struct faction * f);
|
||||||
|
int contact_cmd(struct unit * u, struct order * ord);
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
#include "contact.h"
|
#include "contact.h"
|
||||||
|
|
||||||
|
#include "kernel/faction.h"
|
||||||
|
#include "kernel/order.h"
|
||||||
|
#include "kernel/unit.h"
|
||||||
|
|
||||||
|
#include "util/language.h"
|
||||||
|
#include "util/param.h"
|
||||||
|
|
||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
#include <CuTest.h>
|
#include <CuTest.h>
|
||||||
|
|
||||||
struct region;
|
struct region;
|
||||||
struct unit;
|
|
||||||
struct faction;
|
|
||||||
|
|
||||||
static void test_contact(CuTest *tc) {
|
static void test_contact(CuTest *tc) {
|
||||||
struct unit *u1, *u2, *u3;
|
struct unit *u1, *u2, *u3;
|
||||||
|
@ -21,16 +26,59 @@ static void test_contact(CuTest *tc) {
|
||||||
CuAssertTrue(tc, ucontact(u1, u1));
|
CuAssertTrue(tc, ucontact(u1, u1));
|
||||||
CuAssertTrue(tc, ucontact(u1, u2));
|
CuAssertTrue(tc, ucontact(u1, u2));
|
||||||
CuAssertTrue(tc, !ucontact(u1, u3));
|
CuAssertTrue(tc, !ucontact(u1, u3));
|
||||||
usetcontact(u1, u3);
|
contact_unit(u1, u3);
|
||||||
CuAssertTrue(tc, ucontact(u1, u3));
|
CuAssertTrue(tc, ucontact(u1, u3));
|
||||||
CuAssertTrue(tc, !ucontact(u2, u3));
|
CuAssertTrue(tc, !ucontact(u2, u3));
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_contact_cmd(CuTest *tc) {
|
||||||
|
struct unit *u, *u2;
|
||||||
|
struct region *r;
|
||||||
|
const struct locale *lang;
|
||||||
|
struct order *ord;
|
||||||
|
|
||||||
|
test_setup();
|
||||||
|
r = test_create_plain(0, 0);
|
||||||
|
u = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
lang = u->faction->locale;
|
||||||
|
|
||||||
|
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
ord = create_order(K_CONTACT, u->faction->locale, "%s %i",
|
||||||
|
LOC(lang, parameters[P_UNIT]), u2->no);
|
||||||
|
contact_cmd(u, ord);
|
||||||
|
CuAssertTrue(tc, ucontact(u, u2));
|
||||||
|
free_order(ord);
|
||||||
|
|
||||||
|
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
ord = create_order(K_CONTACT, u->faction->locale, "%s %i",
|
||||||
|
LOC(lang, parameters[P_FACTION]), u2->faction->no);
|
||||||
|
contact_cmd(u, ord);
|
||||||
|
CuAssertTrue(tc, ucontact(u, u2));
|
||||||
|
free_order(ord);
|
||||||
|
|
||||||
|
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
ord = create_order(K_CONTACT, u->faction->locale, "%i", u2->no);
|
||||||
|
contact_cmd(u, ord);
|
||||||
|
CuAssertTrue(tc, ucontact(u, u2));
|
||||||
|
free_order(ord);
|
||||||
|
|
||||||
|
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
usetalias(u2, 42);
|
||||||
|
ord = create_order(K_CONTACT, u->faction->locale, "%s %i",
|
||||||
|
LOC(lang, parameters[P_TEMP]), ualias(u2));
|
||||||
|
contact_cmd(u, ord);
|
||||||
|
CuAssertTrue(tc, ucontact(u, u2));
|
||||||
|
free_order(ord);
|
||||||
|
|
||||||
|
test_teardown();
|
||||||
|
}
|
||||||
|
|
||||||
CuSuite *get_contact_suite(void)
|
CuSuite *get_contact_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
SUITE_ADD_TEST(suite, test_contact);
|
SUITE_ADD_TEST(suite, test_contact);
|
||||||
|
SUITE_ADD_TEST(suite, test_contact_cmd);
|
||||||
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ static void test_give_men_limit(CuTest * tc) {
|
||||||
config_set("rules.give.max_men", "1");
|
config_set("rules.give.max_men", "1");
|
||||||
|
|
||||||
/* below the limit, give men, increase newbies counter */
|
/* below the limit, give men, increase newbies counter */
|
||||||
usetcontact(env.dst, env.src);
|
contact_unit(env.dst, env.src);
|
||||||
msg = give_men(1, env.src, env.dst, NULL);
|
msg = give_men(1, env.src, env.dst, NULL);
|
||||||
CuAssertStrEquals(tc, "give_person", test_get_messagetype(msg));
|
CuAssertStrEquals(tc, "give_person", test_get_messagetype(msg));
|
||||||
CuAssertIntEquals(tc, 2, env.dst->number);
|
CuAssertIntEquals(tc, 2, env.dst->number);
|
||||||
|
@ -204,7 +204,7 @@ static void test_give_men_limit(CuTest * tc) {
|
||||||
msg_release(msg);
|
msg_release(msg);
|
||||||
|
|
||||||
/* beyond the limit, do nothing */
|
/* beyond the limit, do nothing */
|
||||||
usetcontact(env.src, env.dst);
|
contact_unit(env.src, env.dst);
|
||||||
msg = give_men(2, env.dst, env.src, NULL);
|
msg = give_men(2, env.dst, env.src, NULL);
|
||||||
CuAssertStrEquals(tc, "error129", test_get_messagetype(msg));
|
CuAssertStrEquals(tc, "error129", test_get_messagetype(msg));
|
||||||
CuAssertIntEquals(tc, 2, env.dst->number);
|
CuAssertIntEquals(tc, 2, env.dst->number);
|
||||||
|
@ -283,7 +283,7 @@ static void test_give_men_other_faction(CuTest * tc) {
|
||||||
env.f1 = test_create_faction(NULL);
|
env.f1 = test_create_faction(NULL);
|
||||||
env.f2 = test_create_faction(NULL);
|
env.f2 = test_create_faction(NULL);
|
||||||
setup_give(&env);
|
setup_give(&env);
|
||||||
usetcontact(env.dst, env.src);
|
contact_unit(env.dst, env.src);
|
||||||
msg = give_men(1, env.src, env.dst, NULL);
|
msg = give_men(1, env.src, env.dst, NULL);
|
||||||
CuAssertStrEquals(tc, "give_person", test_get_messagetype(msg));
|
CuAssertStrEquals(tc, "give_person", test_get_messagetype(msg));
|
||||||
CuAssertIntEquals(tc, 2, env.dst->number);
|
CuAssertIntEquals(tc, 2, env.dst->number);
|
||||||
|
|
|
@ -63,7 +63,7 @@ extern "C" {
|
||||||
struct mlist ** merge_messages(message_list *ml, message_list *append);
|
struct mlist ** merge_messages(message_list *ml, message_list *append);
|
||||||
void split_messages(message_list *ml, struct mlist **split);
|
void split_messages(message_list *ml, struct mlist **split);
|
||||||
|
|
||||||
#define ADDMSG(msgs, mcreate) { message * mx = mcreate; if (mx) { assert(mx->refcount>=1); add_message(msgs, mx); msg_release(mx); } }
|
#define ADDMSG(msgs, mcreate) { message * mx = mcreate; if (mx) { add_message(msgs, mx); msg_release(mx); } }
|
||||||
|
|
||||||
void syntax_error(const struct unit *u, struct order *ord);
|
void syntax_error(const struct unit *u, struct order *ord);
|
||||||
void cmistake(const struct unit *u, struct order *ord, int mno, int mtype);
|
void cmistake(const struct unit *u, struct order *ord, int mno, int mtype);
|
||||||
|
|
|
@ -130,7 +130,7 @@ static void test_ship_has_harbormaster_contact(CuTest * tc) {
|
||||||
u = test_create_unit(test_create_faction(NULL), mf.r);
|
u = test_create_unit(test_create_faction(NULL), mf.r);
|
||||||
u->building = mf.b;
|
u->building = mf.b;
|
||||||
building_set_owner(u);
|
building_set_owner(u);
|
||||||
usetcontact(mf.b->_owner, mf.sh->_owner);
|
contact_unit(mf.b->_owner, mf.sh->_owner);
|
||||||
|
|
||||||
CuAssertIntEquals(tc, SA_HARBOUR, check_ship_allowed(mf.sh, mf.r));
|
CuAssertIntEquals(tc, SA_HARBOUR, check_ship_allowed(mf.sh, mf.r));
|
||||||
test_teardown();
|
test_teardown();
|
||||||
|
|
Loading…
Reference in New Issue