forked from github/server
extract contact logic to a module
add missing tests for contact to units. add an attribute for contacting a faction.
This commit is contained in:
parent
bf04d95651
commit
0fd7906d41
|
@ -97,6 +97,7 @@ set (ERESSEA_SRC
|
|||
automate.c
|
||||
battle.c
|
||||
chaos.c
|
||||
contact.c
|
||||
creport.c
|
||||
direction.c
|
||||
donations.c
|
||||
|
@ -214,6 +215,7 @@ set(TESTS_SRC
|
|||
alchemy.test.c
|
||||
automate.test.c
|
||||
battle.test.c
|
||||
contact.test.c
|
||||
creport.test.c
|
||||
direction.test.c
|
||||
donations.test.c
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "bind_process.h"
|
||||
|
||||
#include "battle.h"
|
||||
#include "contact.h"
|
||||
#include "economy.h"
|
||||
#include "laws.h"
|
||||
#include "magic.h"
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
#ifdef _MSC_VER
|
||||
#include <platform.h>
|
||||
#endif
|
||||
|
||||
#include "contact.h"
|
||||
|
||||
#include "kernel/attrib.h"
|
||||
#include "kernel/faction.h"
|
||||
#include "kernel/order.h"
|
||||
#include "kernel/unit.h"
|
||||
|
||||
static attrib_type at_contact_unit = {
|
||||
"contact_unit",
|
||||
DEFAULT_INIT,
|
||||
DEFAULT_FINALIZE,
|
||||
DEFAULT_AGE,
|
||||
NO_WRITE,
|
||||
NO_READ
|
||||
};
|
||||
|
||||
static attrib_type at_contact_faction = {
|
||||
"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);
|
||||
while (a && a->type == &at_contact_unit) {
|
||||
if (a->data.v == u2) {
|
||||
return;
|
||||
}
|
||||
a = a->next;
|
||||
}
|
||||
a_add(&u->attribs, a_new(&at_contact_unit))->data.v = (void *)u2;
|
||||
}
|
||||
|
||||
bool ucontact(const unit * u, const unit * u2)
|
||||
/* Prueft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */
|
||||
{
|
||||
attrib *a;
|
||||
|
||||
if (u->faction == u2->faction) {
|
||||
return true;
|
||||
}
|
||||
/* Explizites KONTAKTIERE */
|
||||
for (a = u->attribs; a; a = a->next) {
|
||||
if (a->type == &at_contact_unit) {
|
||||
if (u2 == a->data.v) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (a->type == &at_contact_faction) {
|
||||
if (u2->faction == a->data.v) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int contact_cmd(unit * u, order * ord)
|
||||
{
|
||||
unit *u2;
|
||||
int n;
|
||||
|
||||
init_order(ord, u->faction->locale);
|
||||
n = read_unitid(u->faction, u->region);
|
||||
u2 = findunit(n);
|
||||
|
||||
if (u2 != NULL) {
|
||||
usetcontact(u, u2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct unit;
|
||||
struct faction;
|
||||
|
||||
bool ucontact(const struct unit *u, const struct unit *u2);
|
||||
void usetcontact(struct unit *u, const struct unit *c);
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#include "contact.h"
|
||||
|
||||
#include "tests.h"
|
||||
#include <CuTest.h>
|
||||
|
||||
struct region;
|
||||
struct unit;
|
||||
struct faction;
|
||||
|
||||
static void test_contact(CuTest *tc) {
|
||||
struct unit *u1, *u2, *u3;
|
||||
struct region *r;
|
||||
struct faction *f;
|
||||
|
||||
test_setup();
|
||||
r = test_create_plain(0, 0);
|
||||
f = test_create_faction(NULL);
|
||||
u1 = test_create_unit(f, r);
|
||||
u2 = test_create_unit(f, r);
|
||||
u3 = test_create_unit(test_create_faction(NULL), r);
|
||||
CuAssertTrue(tc, ucontact(u1, u1));
|
||||
CuAssertTrue(tc, ucontact(u1, u2));
|
||||
CuAssertTrue(tc, !ucontact(u1, u3));
|
||||
usetcontact(u1, u3);
|
||||
CuAssertTrue(tc, ucontact(u1, u3));
|
||||
CuAssertTrue(tc, !ucontact(u2, u3));
|
||||
test_teardown();
|
||||
}
|
||||
|
||||
CuSuite *get_contact_suite(void)
|
||||
{
|
||||
CuSuite *suite = CuSuiteNew();
|
||||
SUITE_ADD_TEST(suite, test_contact);
|
||||
|
||||
return suite;
|
||||
}
|
|
@ -16,6 +16,7 @@
|
|||
#include <kernel/config.h>
|
||||
#include "give.h"
|
||||
|
||||
#include "contact.h"
|
||||
#include "economy.h"
|
||||
#include "laws.h"
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include <platform.h>
|
||||
|
||||
#include "give.h"
|
||||
|
||||
#include "contact.h"
|
||||
#include "economy.h"
|
||||
|
||||
#include <kernel/ally.h>
|
||||
|
|
|
@ -20,6 +20,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <platform.h>
|
||||
#include <kernel/config.h>
|
||||
#include "guard.h"
|
||||
|
||||
#include "contact.h"
|
||||
#include "laws.h"
|
||||
#include "monsters.h"
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@ struct critbit_tree;
|
|||
static void test_read_unitid(CuTest *tc) {
|
||||
unit *u;
|
||||
order *ord;
|
||||
attrib *a;
|
||||
struct locale *lang;
|
||||
struct terrain_type *t_plain;
|
||||
|
||||
|
@ -31,8 +30,7 @@ static void test_read_unitid(CuTest *tc) {
|
|||
/* note that the english order is FIGHT, not COMBAT, so this is a poor example */
|
||||
t_plain = test_create_terrain("plain", LAND_REGION);
|
||||
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, t_plain));
|
||||
a = a_add(&u->attribs, a_new(&at_alias));
|
||||
a->data.i = atoi36("42"); /* this unit is also TEMP 42 */
|
||||
usetalias(u, atoi36("42"));
|
||||
|
||||
ord = create_order(K_GIVE, lang, "TEMP 42");
|
||||
init_order_depr(ord);
|
||||
|
@ -66,7 +64,6 @@ static void test_read_unitid(CuTest *tc) {
|
|||
static void test_getunit(CuTest *tc) {
|
||||
unit *u, *u2;
|
||||
order *ord;
|
||||
attrib *a;
|
||||
struct region *r;
|
||||
struct locale *lang;
|
||||
struct terrain_type *t_plain;
|
||||
|
@ -76,8 +73,9 @@ static void test_getunit(CuTest *tc) {
|
|||
/* note that the english order is FIGHT, not COMBAT, so this is a poor example */
|
||||
t_plain = test_create_terrain("plain", LAND_REGION);
|
||||
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, t_plain));
|
||||
a = a_add(&u->attribs, a_new(&at_alias));
|
||||
a->data.i = atoi36("42"); /* this unit is also TEMP 42 */
|
||||
/* This unit is also TEMP 42: */
|
||||
usetalias(u, atoi36("42"));
|
||||
|
||||
r = test_create_region(1, 0, t_plain);
|
||||
|
||||
ord = create_order(K_GIVE, lang, itoa36(u->no));
|
||||
|
|
|
@ -430,7 +430,7 @@ unit *findnewunit(const region * r, const faction * f, int n)
|
|||
/*********************/
|
||||
/* at_alias */
|
||||
/*********************/
|
||||
attrib_type at_alias = {
|
||||
static attrib_type at_alias = {
|
||||
"alias",
|
||||
DEFAULT_INIT,
|
||||
DEFAULT_FINALIZE,
|
||||
|
@ -451,6 +451,11 @@ int ualias(const unit * u)
|
|||
return a->data.i;
|
||||
}
|
||||
|
||||
void usetalias(unit *u, int alias)
|
||||
{
|
||||
a_add(&u->attribs, a_new(&at_alias))->data.i = alias;
|
||||
}
|
||||
|
||||
int a_readprivate(variant *var, void *owner, gamedata *data)
|
||||
{
|
||||
struct storage *store = data->store;
|
||||
|
@ -517,58 +522,6 @@ void usetprivate(unit * u, const char *str)
|
|||
a->data.v = str_strdup(str);
|
||||
}
|
||||
|
||||
/*********************/
|
||||
/* at_target */
|
||||
/*********************/
|
||||
attrib_type at_target = {
|
||||
"target",
|
||||
DEFAULT_INIT,
|
||||
DEFAULT_FINALIZE,
|
||||
DEFAULT_AGE,
|
||||
NO_WRITE,
|
||||
NO_READ
|
||||
};
|
||||
|
||||
/*********************/
|
||||
/* at_contact */
|
||||
/*********************/
|
||||
attrib_type at_contact = {
|
||||
"contact",
|
||||
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);
|
||||
while (a && a->type == &at_contact && a->data.v != u2)
|
||||
a = a->next;
|
||||
if (a && a->type == &at_contact)
|
||||
return;
|
||||
a_add(&u->attribs, a_new(&at_contact))->data.v = (void *)u2;
|
||||
}
|
||||
|
||||
bool ucontact(const unit * u, const unit * u2)
|
||||
/* Prueft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */
|
||||
{
|
||||
attrib *ru;
|
||||
if (u->faction == u2->faction)
|
||||
return true;
|
||||
|
||||
/* Explizites KONTAKTIERE */
|
||||
for (ru = a_find(u->attribs, &at_contact); ru && ru->type == &at_contact;
|
||||
ru = ru->next) {
|
||||
if (((unit *)ru->data.v) == u2) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/***
|
||||
** init & cleanup module
|
||||
**/
|
||||
|
|
|
@ -120,15 +120,14 @@ extern "C" {
|
|||
} unit;
|
||||
|
||||
extern struct attrib_type at_creator;
|
||||
extern struct attrib_type at_alias;
|
||||
extern struct attrib_type at_target;
|
||||
extern struct attrib_type at_potionuser;
|
||||
extern struct attrib_type at_contact;
|
||||
extern struct attrib_type at_effect;
|
||||
extern struct attrib_type at_private;
|
||||
extern struct attrib_type at_showskchange;
|
||||
|
||||
int ualias(const struct unit *u);
|
||||
void usetalias(unit *u, int alias);
|
||||
|
||||
int weight(const struct unit *u);
|
||||
|
||||
void renumber_unit(struct unit *u, int no);
|
||||
|
@ -141,9 +140,6 @@ extern "C" {
|
|||
const char *uprivate(const struct unit *u);
|
||||
void usetprivate(struct unit *u, const char *c);
|
||||
|
||||
bool ucontact(const struct unit *u, const struct unit *u2);
|
||||
void usetcontact(struct unit *u, const struct unit *c);
|
||||
|
||||
struct unit *findnewunit(const struct region *r, const struct faction *f,
|
||||
int alias);
|
||||
|
||||
|
|
18
src/laws.c
18
src/laws.c
|
@ -28,6 +28,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include "alchemy.h"
|
||||
#include "automate.h"
|
||||
#include "battle.h"
|
||||
#include "contact.h"
|
||||
#include "economy.h"
|
||||
#include "market.h"
|
||||
#include "morale.h"
|
||||
|
@ -912,21 +913,6 @@ void demographics(void)
|
|||
immigration();
|
||||
}
|
||||
|
||||
int contact_cmd(unit * u, order * ord)
|
||||
{
|
||||
unit *u2;
|
||||
int n;
|
||||
|
||||
init_order_depr(ord);
|
||||
n = read_unitid(u->faction, u->region);
|
||||
u2 = findunit(n);
|
||||
|
||||
if (u2 != NULL) {
|
||||
usetcontact(u, u2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int leave_cmd(unit * u, struct order *ord)
|
||||
{
|
||||
region *r = u->region;
|
||||
|
@ -2855,7 +2841,7 @@ void maketemp_cmd(unit *u, order **olist)
|
|||
}
|
||||
u2 = create_unit(u->region, u->faction, 0, u->faction->race, alias, s, u);
|
||||
fset(u2, UFL_ISNEW);
|
||||
a_add(&u2->attribs, a_new(&at_alias))->data.i = alias;
|
||||
usetalias(u2, alias);
|
||||
sh = leftship(u);
|
||||
if (sh) {
|
||||
set_leftship(u2, sh);
|
||||
|
|
|
@ -22,11 +22,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#endif
|
||||
#include "magic.h"
|
||||
|
||||
#include "skill.h"
|
||||
#include "study.h"
|
||||
#include "contact.h"
|
||||
#include "helpers.h"
|
||||
#include "laws.h"
|
||||
#include "skill.h"
|
||||
#include "spells.h"
|
||||
#include "study.h"
|
||||
|
||||
#include <triggers/timeout.h>
|
||||
#include <triggers/shock.h>
|
||||
|
|
11
src/move.c
11
src/move.c
|
@ -44,18 +44,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include "kernel/terrainid.h"
|
||||
#include "kernel/unit.h"
|
||||
|
||||
#include "move.h"
|
||||
#include "alchemy.h"
|
||||
#include "contact.h"
|
||||
#include "guard.h"
|
||||
#include "laws.h"
|
||||
#include "lighthouse.h"
|
||||
#include "monsters.h"
|
||||
#include "move.h"
|
||||
#include "piracy.h"
|
||||
#include "reports.h"
|
||||
#include "study.h"
|
||||
#include "spy.h"
|
||||
#include "alchemy.h"
|
||||
#include "travelthru.h"
|
||||
#include "vortex.h"
|
||||
#include "monsters.h"
|
||||
#include "lighthouse.h"
|
||||
#include "piracy.h"
|
||||
|
||||
#include <spells/flyingship.h>
|
||||
#include <spells/unitcurse.h>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include <stdlib.h>
|
||||
#include "move.h"
|
||||
|
||||
#include "contact.h"
|
||||
#include "lighthouse.h"
|
||||
|
||||
#include <kernel/attrib.h>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "spells.h"
|
||||
|
||||
#include "contact.h"
|
||||
#include "guard.h"
|
||||
#include "reports.h"
|
||||
#include "spy.h"
|
||||
|
|
|
@ -125,6 +125,7 @@ int RunAllTests(int argc, char *argv[])
|
|||
ADD_SUITE(automate);
|
||||
ADD_SUITE(battle);
|
||||
ADD_SUITE(calendar);
|
||||
ADD_SUITE(contact);
|
||||
ADD_SUITE(creport);
|
||||
ADD_SUITE(donations);
|
||||
ADD_SUITE(economy);
|
||||
|
|
Loading…
Reference in New Issue