forked from github/server
implement ship-ownership transfer as a function
test the reorder_units function
This commit is contained in:
parent
43f5770694
commit
7789e0534e
|
@ -187,7 +187,7 @@ cr_output_curses(FILE * F, const faction * viewer, const void *obj, objtype_t ty
|
||||||
* bei jedem curse gesondert behandelt. */
|
* bei jedem curse gesondert behandelt. */
|
||||||
if (typ == TYP_SHIP) {
|
if (typ == TYP_SHIP) {
|
||||||
ship *sh = (ship *) obj;
|
ship *sh = (ship *) obj;
|
||||||
unit *owner = shipowner(sh);
|
unit *owner = ship_owner(sh);
|
||||||
a = sh->attribs;
|
a = sh->attribs;
|
||||||
r = sh->region;
|
r = sh->region;
|
||||||
if (owner != NULL) {
|
if (owner != NULL) {
|
||||||
|
@ -1392,7 +1392,7 @@ static void cr_output_region(FILE * F, report_context * ctx, seen_region * sr)
|
||||||
/* ships */
|
/* ships */
|
||||||
for (sh = r->ships; sh; sh = sh->next) {
|
for (sh = r->ships; sh; sh = sh->next) {
|
||||||
int fno = -1;
|
int fno = -1;
|
||||||
u = shipowner(sh);
|
u = ship_owner(sh);
|
||||||
if (u && !fval(u, UFL_ANON_FACTION)) {
|
if (u && !fval(u, UFL_ANON_FACTION)) {
|
||||||
const faction *sf = visible_faction(f, u);
|
const faction *sf = visible_faction(f, u);
|
||||||
fno = sf->no;
|
fno = sf->no;
|
||||||
|
|
|
@ -1798,7 +1798,7 @@ static int name_cmd(unit * u, struct order *ord)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uo = shipowner(sh);
|
uo = ship_owner(sh);
|
||||||
if (uo) {
|
if (uo) {
|
||||||
if (cansee(uo->faction, r, u, 0)) {
|
if (cansee(uo->faction, r, u, 0)) {
|
||||||
ADDMSG(&uo->faction->msgs,
|
ADDMSG(&uo->faction->msgs,
|
||||||
|
@ -2768,7 +2768,7 @@ static void sinkships(region * r)
|
||||||
0.30F);
|
0.30F);
|
||||||
damage_ship(sh, dmg);
|
damage_ship(sh, dmg);
|
||||||
}
|
}
|
||||||
if (shipowner(sh) == NULL) {
|
if (ship_owner(sh) == NULL) {
|
||||||
float dmg = get_param_flt(global.parameters, "rules.ship.damage.nocrew",
|
float dmg = get_param_flt(global.parameters, "rules.ship.damage.nocrew",
|
||||||
0.05F);
|
0.05F);
|
||||||
damage_ship(sh, dmg);
|
damage_ship(sh, dmg);
|
||||||
|
|
|
@ -920,7 +920,7 @@ static void move_iceberg(region * r)
|
||||||
for (sh = r->ships; sh;) {
|
for (sh = r->ships; sh;) {
|
||||||
shn = sh->next;
|
shn = sh->next;
|
||||||
if (fval(sh, SF_SELECT)) {
|
if (fval(sh, SF_SELECT)) {
|
||||||
u = captain(sh);
|
u = ship_owner(sh);
|
||||||
if (sh->damage >= sh->size * DAMAGE_SCALE) {
|
if (sh->damage >= sh->size * DAMAGE_SCALE) {
|
||||||
if (u != NULL) {
|
if (u != NULL) {
|
||||||
ADDMSG(&u->faction->msgs, msg_message("overrun_by_iceberg_des",
|
ADDMSG(&u->faction->msgs, msg_message("overrun_by_iceberg_des",
|
||||||
|
@ -1036,7 +1036,7 @@ static void godcurse(void)
|
||||||
0.10F);
|
0.10F);
|
||||||
damage_ship(sh, dmg);
|
damage_ship(sh, dmg);
|
||||||
if (sh->damage >= sh->size * DAMAGE_SCALE) {
|
if (sh->damage >= sh->size * DAMAGE_SCALE) {
|
||||||
unit *u = shipowner(sh);
|
unit *u = ship_owner(sh);
|
||||||
if (u)
|
if (u)
|
||||||
ADDMSG(&u->faction->msgs,
|
ADDMSG(&u->faction->msgs,
|
||||||
msg_message("godcurse_destroy_ship", "ship", sh));
|
msg_message("godcurse_destroy_ship", "ship", sh));
|
||||||
|
|
|
@ -590,7 +590,7 @@ nr_curses(FILE * F, const faction * viewer, const void *obj, objtype_t typ,
|
||||||
* bei jedem curse gesondert behandelt. */
|
* bei jedem curse gesondert behandelt. */
|
||||||
if (typ == TYP_SHIP) {
|
if (typ == TYP_SHIP) {
|
||||||
ship *sh = (ship *) obj;
|
ship *sh = (ship *) obj;
|
||||||
unit *owner = shipowner(sh);
|
unit *owner = ship_owner(sh);
|
||||||
a = sh->attribs;
|
a = sh->attribs;
|
||||||
r = sh->region;
|
r = sh->region;
|
||||||
if (owner) {
|
if (owner) {
|
||||||
|
|
|
@ -493,7 +493,7 @@ int sabotage_cmd(unit * u, struct order *ord)
|
||||||
cmistake(u, u->thisorder, 144, MSG_EVENT);
|
cmistake(u, u->thisorder, 144, MSG_EVENT);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
u2 = shipowner(sh);
|
u2 = ship_owner(sh);
|
||||||
skdiff =
|
skdiff =
|
||||||
eff_skill(u, SK_SPY, r) - crew_skill(r, u2->faction, sh, SK_PERCEPTION);
|
eff_skill(u, SK_SPY, r) - crew_skill(r, u2->faction, sh, SK_PERCEPTION);
|
||||||
if (try_destruction(u, u2, sh, skdiff)) {
|
if (try_destruction(u, u2, sh, skdiff)) {
|
||||||
|
|
|
@ -116,6 +116,7 @@
|
||||||
<ClCompile Include="kernel\race.c" />
|
<ClCompile Include="kernel\race.c" />
|
||||||
<ClCompile Include="kernel\region.c" />
|
<ClCompile Include="kernel\region.c" />
|
||||||
<ClCompile Include="kernel\reports.c" />
|
<ClCompile Include="kernel\reports.c" />
|
||||||
|
<ClCompile Include="kernel\reports_test.c" />
|
||||||
<ClCompile Include="kernel\resources.c" />
|
<ClCompile Include="kernel\resources.c" />
|
||||||
<ClCompile Include="kernel\save.c" />
|
<ClCompile Include="kernel\save.c" />
|
||||||
<ClCompile Include="kernel\ship.c" />
|
<ClCompile Include="kernel\ship.c" />
|
||||||
|
|
|
@ -301,6 +301,9 @@
|
||||||
<ClCompile Include="kernel\ship_test.c">
|
<ClCompile Include="kernel\ship_test.c">
|
||||||
<Filter>kernel</Filter>
|
<Filter>kernel</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="kernel\reports_test.c">
|
||||||
|
<Filter>kernel</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="kernel\alchemy.h">
|
<ClInclude Include="kernel\alchemy.h">
|
||||||
|
|
|
@ -1169,7 +1169,7 @@ static boolean mayenter(region * r, unit * u, building * b)
|
||||||
|
|
||||||
static int mayboard(const unit * u, ship * sh)
|
static int mayboard(const unit * u, ship * sh)
|
||||||
{
|
{
|
||||||
unit *u2 = shipowner(sh);
|
unit *u2 = ship_owner(sh);
|
||||||
|
|
||||||
return (!u2 || ucontact(u2, u) || alliedunit(u2, u->faction, HELP_GUARD));
|
return (!u2 || ucontact(u2, u) || alliedunit(u2, u->faction, HELP_GUARD));
|
||||||
}
|
}
|
||||||
|
|
|
@ -614,6 +614,20 @@ const char *buildingname(const building * b)
|
||||||
return write_buildingname(b, ibuf, sizeof(name));
|
return write_buildingname(b, ibuf, sizeof(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void building_set_owner(struct building *b, struct unit * owner)
|
||||||
|
{
|
||||||
|
unit * u;
|
||||||
|
|
||||||
|
assert(b && owner && owner->building==b);
|
||||||
|
|
||||||
|
for (u = b->region->units; u; u = u->next) {
|
||||||
|
if (u->building == b) {
|
||||||
|
freset(owner, UFL_OWNER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fset(owner, UFL_OWNER);
|
||||||
|
}
|
||||||
|
|
||||||
unit *building_owner(const building * b)
|
unit *building_owner(const building * b)
|
||||||
{
|
{
|
||||||
unit *u = NULL;
|
unit *u = NULL;
|
||||||
|
|
|
@ -151,6 +151,7 @@ extern "C" {
|
||||||
extern struct building *findbuilding(int n);
|
extern struct building *findbuilding(int n);
|
||||||
|
|
||||||
extern struct unit *building_owner(const struct building *b);
|
extern struct unit *building_owner(const struct building *b);
|
||||||
|
extern void building_set_owner(struct building *b, struct unit * u);
|
||||||
|
|
||||||
extern struct attrib_type at_building_action;
|
extern struct attrib_type at_building_action;
|
||||||
void building_addaction(struct building *b, const char *fname,
|
void building_addaction(struct building *b, const char *fname,
|
||||||
|
|
|
@ -3040,107 +3040,6 @@ void add_income(unit * u, int type, int want, int qty)
|
||||||
"unit region mode wanted amount", u, u->region, type, want, qty));
|
"unit region mode wanted amount", u, u->region, type, want, qty));
|
||||||
}
|
}
|
||||||
|
|
||||||
void reorder_units(region * r)
|
|
||||||
{
|
|
||||||
unit **unext = &r->units;
|
|
||||||
|
|
||||||
if (r->buildings) {
|
|
||||||
building *b = r->buildings;
|
|
||||||
while (*unext && b) {
|
|
||||||
unit **ufirst = unext; /* where the first unit in the building should go */
|
|
||||||
unit **umove = unext; /* a unit we consider moving */
|
|
||||||
unit *owner = NULL;
|
|
||||||
while (*umove) {
|
|
||||||
unit *u = *umove;
|
|
||||||
if (u->number && u->building == b) {
|
|
||||||
unit **uinsert = unext;
|
|
||||||
if (fval(u, UFL_OWNER)) {
|
|
||||||
uinsert = ufirst;
|
|
||||||
owner = u;
|
|
||||||
}
|
|
||||||
if (umove != uinsert) {
|
|
||||||
*umove = u->next;
|
|
||||||
u->next = *uinsert;
|
|
||||||
*uinsert = u;
|
|
||||||
} else {
|
|
||||||
/* no need to move, skip ahead */
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
if (unext == uinsert) {
|
|
||||||
/* we have a new well-placed unit. jump over it */
|
|
||||||
unext = &u->next;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!owner && ufirst != unext) {
|
|
||||||
owner = *ufirst;
|
|
||||||
fset(owner, UFL_OWNER);
|
|
||||||
}
|
|
||||||
b = b->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->ships) {
|
|
||||||
ship *sh = r->ships;
|
|
||||||
/* first, move all units up that are not on ships */
|
|
||||||
unit **umove = unext; /* a unit we consider moving */
|
|
||||||
while (*umove) {
|
|
||||||
unit *u = *umove;
|
|
||||||
if (u->number && !u->ship) {
|
|
||||||
if (umove != unext) {
|
|
||||||
*umove = u->next;
|
|
||||||
u->next = *unext;
|
|
||||||
*unext = u;
|
|
||||||
} else {
|
|
||||||
/* no need to move, skip ahead */
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
/* we have a new well-placed unit. jump over it */
|
|
||||||
unext = &u->next;
|
|
||||||
} else {
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*unext && sh) {
|
|
||||||
unit **ufirst = unext; /* where the first unit in the building should go */
|
|
||||||
unit **umove = unext; /* a unit we consider moving */
|
|
||||||
unit *owner = NULL;
|
|
||||||
while (*umove) {
|
|
||||||
unit *u = *umove;
|
|
||||||
if (u->number && u->ship == sh) {
|
|
||||||
unit **uinsert = unext;
|
|
||||||
if (fval(u, UFL_OWNER)) {
|
|
||||||
uinsert = ufirst;
|
|
||||||
owner = u;
|
|
||||||
}
|
|
||||||
if (umove != uinsert) {
|
|
||||||
*umove = u->next;
|
|
||||||
u->next = *uinsert;
|
|
||||||
*uinsert = u;
|
|
||||||
} else {
|
|
||||||
/* no need to move, skip ahead */
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
if (unext == uinsert) {
|
|
||||||
/* we have a new well-placed unit. jump over it */
|
|
||||||
unext = &u->next;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
umove = &u->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!owner && ufirst != unext) {
|
|
||||||
owner = *ufirst;
|
|
||||||
fset(owner, UFL_OWNER);
|
|
||||||
}
|
|
||||||
sh = sh->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int produceexp(struct unit *u, skill_t sk, int n)
|
int produceexp(struct unit *u, skill_t sk, int n)
|
||||||
{
|
{
|
||||||
if (global.producexpchance > 0.0F) {
|
if (global.producexpchance > 0.0F) {
|
||||||
|
|
|
@ -388,8 +388,6 @@ extern "C" {
|
||||||
extern void kernel_init(void);
|
extern void kernel_init(void);
|
||||||
extern void kernel_done(void);
|
extern void kernel_done(void);
|
||||||
|
|
||||||
extern void reorder_units(struct region *r);
|
|
||||||
|
|
||||||
extern const char *localenames[];
|
extern const char *localenames[];
|
||||||
|
|
||||||
/** compatibility: **/
|
/** compatibility: **/
|
||||||
|
|
|
@ -2496,7 +2496,7 @@ unit *get_clone_mage(const unit * u)
|
||||||
|
|
||||||
static boolean is_moving_ship(const region * r, ship * sh)
|
static boolean is_moving_ship(const region * r, ship * sh)
|
||||||
{
|
{
|
||||||
const unit *u = shipowner(sh);
|
const unit *u = ship_owner(sh);
|
||||||
|
|
||||||
if (u)
|
if (u)
|
||||||
switch (get_keyword(u->thisorder)) {
|
switch (get_keyword(u->thisorder)) {
|
||||||
|
|
|
@ -650,7 +650,7 @@ static int is_ship_allowed(struct ship *sh, const region * r)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (is_freezing(u)) {
|
if (is_freezing(u)) {
|
||||||
unit *captain = shipowner(sh);
|
unit *captain = ship_owner(sh);
|
||||||
if (captain) {
|
if (captain) {
|
||||||
ADDMSG(&captain->faction->msgs, msg_message("detectforbidden",
|
ADDMSG(&captain->faction->msgs, msg_message("detectforbidden",
|
||||||
"unit region", u, r));
|
"unit region", u, r));
|
||||||
|
@ -2274,7 +2274,7 @@ static void piracy_cmd(unit * u, struct order *ord)
|
||||||
&& check_takeoff(sh, r, rc) == true) {
|
&& check_takeoff(sh, r, rc) == true) {
|
||||||
|
|
||||||
for (sh2 = rc->ships; sh2; sh2 = sh2->next) {
|
for (sh2 = rc->ships; sh2; sh2 = sh2->next) {
|
||||||
unit *cap = shipowner(sh2);
|
unit *cap = ship_owner(sh2);
|
||||||
if (cap) {
|
if (cap) {
|
||||||
faction *f = visible_faction(cap->faction, cap);
|
faction *f = visible_faction(cap->faction, cap);
|
||||||
if (alliedunit(u, f, HELP_FIGHT))
|
if (alliedunit(u, f, HELP_FIGHT))
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#include <cutest/CuTest.h>
|
#include <cutest/CuTest.h>
|
||||||
#include <tests.h>
|
#include <tests.h>
|
||||||
|
|
||||||
static void building_type_exists(CuTest * tc)
|
static void test_building_type_exists(CuTest * tc)
|
||||||
{
|
{
|
||||||
region *r;
|
region *r;
|
||||||
building *b;
|
building *b;
|
||||||
|
@ -33,6 +33,6 @@ static void building_type_exists(CuTest * tc)
|
||||||
CuSuite *get_move_suite(void)
|
CuSuite *get_move_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
SUITE_ADD_TEST(suite, building_type_exists);
|
SUITE_ADD_TEST(suite, test_building_type_exists);
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1405,6 +1405,107 @@ static void prepare_lighthouse(building * b, faction * f)
|
||||||
ql_free(rlist);
|
ql_free(rlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reorder_units(region * r)
|
||||||
|
{
|
||||||
|
unit **unext = &r->units;
|
||||||
|
|
||||||
|
if (r->buildings) {
|
||||||
|
building *b = r->buildings;
|
||||||
|
while (*unext && b) {
|
||||||
|
unit **ufirst = unext; /* where the first unit in the building should go */
|
||||||
|
unit **umove = unext; /* a unit we consider moving */
|
||||||
|
unit *owner = NULL;
|
||||||
|
while (*umove) {
|
||||||
|
unit *u = *umove;
|
||||||
|
if (u->number && u->building == b) {
|
||||||
|
unit **uinsert = unext;
|
||||||
|
if (fval(u, UFL_OWNER)) {
|
||||||
|
uinsert = ufirst;
|
||||||
|
owner = u;
|
||||||
|
}
|
||||||
|
if (umove != uinsert) {
|
||||||
|
*umove = u->next;
|
||||||
|
u->next = *uinsert;
|
||||||
|
*uinsert = u;
|
||||||
|
} else {
|
||||||
|
/* no need to move, skip ahead */
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
if (unext == uinsert) {
|
||||||
|
/* we have a new well-placed unit. jump over it */
|
||||||
|
unext = &u->next;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!owner && ufirst != unext) {
|
||||||
|
owner = *ufirst;
|
||||||
|
fset(owner, UFL_OWNER);
|
||||||
|
}
|
||||||
|
b = b->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->ships) {
|
||||||
|
ship *sh = r->ships;
|
||||||
|
/* first, move all units up that are not on ships */
|
||||||
|
unit **umove = unext; /* a unit we consider moving */
|
||||||
|
while (*umove) {
|
||||||
|
unit *u = *umove;
|
||||||
|
if (u->number && !u->ship) {
|
||||||
|
if (umove != unext) {
|
||||||
|
*umove = u->next;
|
||||||
|
u->next = *unext;
|
||||||
|
*unext = u;
|
||||||
|
} else {
|
||||||
|
/* no need to move, skip ahead */
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
/* we have a new well-placed unit. jump over it */
|
||||||
|
unext = &u->next;
|
||||||
|
} else {
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*unext && sh) {
|
||||||
|
unit **ufirst = unext; /* where the first unit in the building should go */
|
||||||
|
unit **umove = unext; /* a unit we consider moving */
|
||||||
|
unit *owner = NULL;
|
||||||
|
while (*umove) {
|
||||||
|
unit *u = *umove;
|
||||||
|
if (u->number && u->ship == sh) {
|
||||||
|
unit **uinsert = unext;
|
||||||
|
if (fval(u, UFL_OWNER)) {
|
||||||
|
uinsert = ufirst;
|
||||||
|
owner = u;
|
||||||
|
}
|
||||||
|
if (umove != uinsert) {
|
||||||
|
*umove = u->next;
|
||||||
|
u->next = *uinsert;
|
||||||
|
*uinsert = u;
|
||||||
|
} else {
|
||||||
|
/* no need to move, skip ahead */
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
if (unext == uinsert) {
|
||||||
|
/* we have a new well-placed unit. jump over it */
|
||||||
|
unext = &u->next;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
umove = &u->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!owner && ufirst != unext) {
|
||||||
|
owner = *ufirst;
|
||||||
|
fset(owner, UFL_OWNER);
|
||||||
|
}
|
||||||
|
sh = sh->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void prepare_reports(void)
|
static void prepare_reports(void)
|
||||||
{
|
{
|
||||||
region *r;
|
region *r;
|
||||||
|
|
|
@ -52,6 +52,7 @@ extern "C" {
|
||||||
extern int reports(void);
|
extern int reports(void);
|
||||||
extern int write_reports(struct faction *f, time_t ltime);
|
extern int write_reports(struct faction *f, time_t ltime);
|
||||||
extern int init_reports(void);
|
extern int init_reports(void);
|
||||||
|
extern void reorder_units(struct region * r);
|
||||||
|
|
||||||
extern const struct unit *ucansee(const struct faction *f,
|
extern const struct unit *ucansee(const struct faction *f,
|
||||||
const struct unit *u, const struct unit *x);
|
const struct unit *u, const struct unit *x);
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#include <platform.h>
|
||||||
|
|
||||||
|
#include <kernel/building.h>
|
||||||
|
#include <kernel/reports.h>
|
||||||
|
#include <kernel/region.h>
|
||||||
|
#include <kernel/ship.h>
|
||||||
|
#include <kernel/unit.h>
|
||||||
|
|
||||||
|
#include <cutest/CuTest.h>
|
||||||
|
#include <tests.h>
|
||||||
|
|
||||||
|
static void test_reorder_units(CuTest * tc)
|
||||||
|
{
|
||||||
|
region *r;
|
||||||
|
building *b;
|
||||||
|
ship * s;
|
||||||
|
unit *u0, *u1, *u2, *u3, *u4;
|
||||||
|
struct faction * f;
|
||||||
|
const building_type *btype;
|
||||||
|
const ship_type *stype;
|
||||||
|
|
||||||
|
test_cleanup();
|
||||||
|
test_create_world();
|
||||||
|
|
||||||
|
btype = bt_find("castle");
|
||||||
|
stype = st_find("boat");
|
||||||
|
|
||||||
|
r = findregion(-1, 0);
|
||||||
|
b = test_create_building(r, btype);
|
||||||
|
s = test_create_ship(r, stype);
|
||||||
|
f = test_create_faction(0);
|
||||||
|
|
||||||
|
u0 = test_create_unit(f, r);
|
||||||
|
u_set_ship(u0, s);
|
||||||
|
u1 = test_create_unit(f, r);
|
||||||
|
u_set_ship(u1, s);
|
||||||
|
ship_set_owner(s, u1);
|
||||||
|
u2 = test_create_unit(f, r);
|
||||||
|
u3 = test_create_unit(f, r);
|
||||||
|
u_set_building(u3, b);
|
||||||
|
u4 = test_create_unit(f, r);
|
||||||
|
u_set_building(u4, b);
|
||||||
|
building_set_owner(b, u4);
|
||||||
|
|
||||||
|
reorder_units(r);
|
||||||
|
|
||||||
|
CuAssertPtrEquals(tc, u4, r->units);
|
||||||
|
CuAssertPtrEquals(tc, u3, u4->next);
|
||||||
|
CuAssertPtrEquals(tc, u2, u3->next);
|
||||||
|
CuAssertPtrEquals(tc, u1, u2->next);
|
||||||
|
CuAssertPtrEquals(tc, u0, u1->next);
|
||||||
|
CuAssertPtrEquals(tc, 0, u0->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
CuSuite *get_reports_suite(void)
|
||||||
|
{
|
||||||
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
SUITE_ADD_TEST(suite, test_reorder_units);
|
||||||
|
return suite;
|
||||||
|
}
|
|
@ -792,16 +792,25 @@ unit *read_unit(struct storage *store)
|
||||||
set_number(u, number);
|
set_number(u, number);
|
||||||
|
|
||||||
n = store->r_id(store);
|
n = store->r_id(store);
|
||||||
if (n > 0)
|
if (n > 0) {
|
||||||
u->building = findbuilding(n);
|
building * b = findbuilding(n);
|
||||||
|
if (b) {
|
||||||
|
u_set_building(u, b);
|
||||||
|
} else {
|
||||||
|
log_error("read_unit: unit in unkown building '%s'\n", itoa36(n));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
n = store->r_id(store);
|
n = store->r_id(store);
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
ship * sh = findship(n);
|
ship * sh = findship(n);
|
||||||
if (sh) {
|
if (sh) {
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
|
} else {
|
||||||
|
log_error("read_unit: unit in unkown ship '%s'\n", itoa36(n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setstatus(u, store->r_int(store));
|
setstatus(u, store->r_int(store));
|
||||||
u->flags = store->r_int(store);
|
u->flags = store->r_int(store);
|
||||||
u->flags &= UFL_SAVEMASK;
|
u->flags &= UFL_SAVEMASK;
|
||||||
|
|
|
@ -160,17 +160,6 @@ void damage_ship(ship * sh, double percent)
|
||||||
sh->damage = (int)damage;
|
sh->damage = (int)damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
unit *captain(ship * sh)
|
|
||||||
{
|
|
||||||
unit *u;
|
|
||||||
|
|
||||||
for (u = sh->region->units; u; u = u->next)
|
|
||||||
if (u->ship == sh && fval(u, UFL_OWNER))
|
|
||||||
return u;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Alte Schiffstypen: */
|
/* Alte Schiffstypen: */
|
||||||
static ship *deleted_ships;
|
static ship *deleted_ships;
|
||||||
|
|
||||||
|
@ -287,7 +276,16 @@ void getshipweight(const ship * sh, int *sweight, int *scabins)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unit *shipowner(ship * sh)
|
void ship_set_owner(ship * sh, unit * u) {
|
||||||
|
assert(u->ship==sh);
|
||||||
|
if (sh->owner && sh->owner!=u) {
|
||||||
|
freset(sh->owner, UFL_OWNER);
|
||||||
|
}
|
||||||
|
sh->owner = u;
|
||||||
|
fset(u, UFL_OWNER);
|
||||||
|
}
|
||||||
|
|
||||||
|
unit *ship_owner(ship * sh)
|
||||||
{
|
{
|
||||||
unit *owner = sh->owner;
|
unit *owner = sh->owner;
|
||||||
if (owner && owner->number<=0) {
|
if (owner && owner->number<=0) {
|
||||||
|
|
|
@ -94,9 +94,9 @@ extern "C" {
|
||||||
direction_t coast;
|
direction_t coast;
|
||||||
} ship;
|
} ship;
|
||||||
|
|
||||||
extern void damage_ship(ship * sh, double percent);
|
extern void damage_ship(struct ship * sh, double percent);
|
||||||
extern struct unit *captain(ship * sh);
|
extern void ship_set_owner(struct ship * sh, struct unit * u);
|
||||||
extern struct unit *shipowner(struct ship *sh);
|
extern struct unit *ship_owner(struct ship *sh);
|
||||||
extern const char *shipname(const struct ship *self);
|
extern const char *shipname(const struct ship *self);
|
||||||
extern int shipcapacity(const struct ship *sh);
|
extern int shipcapacity(const struct ship *sh);
|
||||||
extern void getshipweight(const struct ship *sh, int *weight, int *cabins);
|
extern void getshipweight(const struct ship *sh, int *weight, int *cabins);
|
||||||
|
|
|
@ -24,6 +24,33 @@ static void test_register_ship(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, st_find("herp"));
|
CuAssertPtrNotNull(tc, st_find("herp"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_ship_set_owner(CuTest * tc)
|
||||||
|
{
|
||||||
|
struct region *r;
|
||||||
|
struct ship *sh;
|
||||||
|
struct unit *u1, *u2;
|
||||||
|
struct faction *f;
|
||||||
|
const struct ship_type *stype;
|
||||||
|
const struct race *human;
|
||||||
|
|
||||||
|
test_cleanup();
|
||||||
|
test_create_world();
|
||||||
|
|
||||||
|
human = rc_find("human");
|
||||||
|
stype = st_find("boat");
|
||||||
|
f = test_create_faction(human);
|
||||||
|
r = findregion(0, 0);
|
||||||
|
|
||||||
|
sh = test_create_ship(r, stype);
|
||||||
|
u1 = test_create_unit(f, r);
|
||||||
|
u2 = test_create_unit(f, r);
|
||||||
|
u_set_ship(u1, sh);
|
||||||
|
u_set_ship(u2, sh);
|
||||||
|
CuAssertPtrEquals(tc, u1, ship_owner(sh));
|
||||||
|
ship_set_owner(sh, u2);
|
||||||
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
|
}
|
||||||
|
|
||||||
static void test_shipowner_goes_to_next_after_death(CuTest * tc)
|
static void test_shipowner_goes_to_next_after_death(CuTest * tc)
|
||||||
{
|
{
|
||||||
struct region *r;
|
struct region *r;
|
||||||
|
@ -53,9 +80,9 @@ static void test_shipowner_goes_to_next_after_death(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
u->number = 0;
|
u->number = 0;
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shipowner_goes_to_other_after_death(CuTest * tc)
|
static void test_shipowner_goes_to_other_after_death(CuTest * tc)
|
||||||
|
@ -87,9 +114,9 @@ static void test_shipowner_goes_to_other_after_death(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
u->number = 0;
|
u->number = 0;
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shipowner_goes_to_same_faction_after_death(CuTest * tc)
|
static void test_shipowner_goes_to_same_faction_after_death(CuTest * tc)
|
||||||
|
@ -124,14 +151,14 @@ static void test_shipowner_goes_to_same_faction_after_death(CuTest * tc)
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
u_set_ship(u3, sh);
|
u_set_ship(u3, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
CuAssertTrue(tc, fval(u, UFL_OWNER));
|
CuAssertTrue(tc, fval(u, UFL_OWNER));
|
||||||
u->number = 0;
|
u->number = 0;
|
||||||
CuAssertPtrEquals(tc, u3, shipowner(sh));
|
CuAssertPtrEquals(tc, u3, ship_owner(sh));
|
||||||
CuAssertTrue(tc, !fval(u, UFL_OWNER));
|
CuAssertTrue(tc, !fval(u, UFL_OWNER));
|
||||||
CuAssertTrue(tc, fval(u3, UFL_OWNER));
|
CuAssertTrue(tc, fval(u3, UFL_OWNER));
|
||||||
u3->number = 0;
|
u3->number = 0;
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
CuAssertTrue(tc, !fval(u3, UFL_OWNER));
|
CuAssertTrue(tc, !fval(u3, UFL_OWNER));
|
||||||
CuAssertTrue(tc, fval(u2, UFL_OWNER));
|
CuAssertTrue(tc, fval(u2, UFL_OWNER));
|
||||||
}
|
}
|
||||||
|
@ -165,9 +192,9 @@ static void test_shipowner_goes_to_next_after_leave(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
leave_ship(u);
|
leave_ship(u);
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shipowner_goes_to_other_after_leave(CuTest * tc)
|
static void test_shipowner_goes_to_other_after_leave(CuTest * tc)
|
||||||
|
@ -199,9 +226,9 @@ static void test_shipowner_goes_to_other_after_leave(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
leave_ship(u);
|
leave_ship(u);
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shipowner_goes_to_same_faction_after_leave(CuTest * tc)
|
static void test_shipowner_goes_to_same_faction_after_leave(CuTest * tc)
|
||||||
|
@ -236,13 +263,13 @@ static void test_shipowner_goes_to_same_faction_after_leave(CuTest * tc)
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
u_set_ship(u2, sh);
|
u_set_ship(u2, sh);
|
||||||
u_set_ship(u3, sh);
|
u_set_ship(u3, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
leave_ship(u);
|
leave_ship(u);
|
||||||
CuAssertPtrEquals(tc, u3, shipowner(sh));
|
CuAssertPtrEquals(tc, u3, ship_owner(sh));
|
||||||
leave_ship(u3);
|
leave_ship(u3);
|
||||||
CuAssertPtrEquals(tc, u2, shipowner(sh));
|
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||||
leave_ship(u2);
|
leave_ship(u2);
|
||||||
CuAssertPtrEquals(tc, 0, shipowner(sh));
|
CuAssertPtrEquals(tc, 0, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shipowner_resets_when_dead(CuTest * tc)
|
static void test_shipowner_resets_when_dead(CuTest * tc)
|
||||||
|
@ -272,15 +299,16 @@ static void test_shipowner_resets_when_dead(CuTest * tc)
|
||||||
u = test_create_unit(f, r);
|
u = test_create_unit(f, r);
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
u_set_ship(u, sh);
|
u_set_ship(u, sh);
|
||||||
CuAssertPtrEquals(tc, u, shipowner(sh));
|
CuAssertPtrEquals(tc, u, ship_owner(sh));
|
||||||
u->number = 0;
|
u->number = 0;
|
||||||
CuAssertPtrEquals(tc, 0, shipowner(sh));
|
CuAssertPtrEquals(tc, 0, ship_owner(sh));
|
||||||
}
|
}
|
||||||
|
|
||||||
CuSuite *get_ship_suite(void)
|
CuSuite *get_ship_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
SUITE_ADD_TEST(suite, test_register_ship);
|
SUITE_ADD_TEST(suite, test_register_ship);
|
||||||
|
SUITE_ADD_TEST(suite, test_ship_set_owner);
|
||||||
SUITE_ADD_TEST(suite, test_shipowner_resets_when_dead);
|
SUITE_ADD_TEST(suite, test_shipowner_resets_when_dead);
|
||||||
SUITE_ADD_TEST(suite, test_shipowner_goes_to_next_after_death);
|
SUITE_ADD_TEST(suite, test_shipowner_goes_to_next_after_death);
|
||||||
SUITE_ADD_TEST(suite, test_shipowner_goes_to_other_after_death);
|
SUITE_ADD_TEST(suite, test_shipowner_goes_to_other_after_death);
|
||||||
|
|
|
@ -774,6 +774,12 @@ ship *leftship(const unit * u)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void u_set_building(unit * u, building * b)
|
||||||
|
{
|
||||||
|
assert(b && !u->building); /* you must leave first */
|
||||||
|
u->building = b;
|
||||||
|
}
|
||||||
|
|
||||||
void u_set_ship(unit * u, ship * sh)
|
void u_set_ship(unit * u, ship * sh)
|
||||||
{
|
{
|
||||||
assert(!u->ship); /* you must leave_ship */
|
assert(!u->ship); /* you must leave_ship */
|
||||||
|
@ -1446,8 +1452,15 @@ void name_unit(unit * u)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char name[32];
|
char name[32];
|
||||||
snprintf(name, sizeof(name), "%s %s", LOC(u->faction->locale,
|
static const char * prefix[MAXLOCALES];
|
||||||
"unitdefault"), itoa36(u->no));
|
int i = locale_index(u->faction->locale);
|
||||||
|
if (!prefix[i]) {
|
||||||
|
prefix[i] = LOC(u->faction->locale, "unitdefault");
|
||||||
|
if (!prefix[i]) {
|
||||||
|
prefix[i] = parameters[P_UNIT];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
snprintf(name, sizeof(name), "%s %s", prefix[i], itoa36(u->no));
|
||||||
unit_setname(u, name);
|
unit_setname(u, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,7 @@ extern "C" {
|
||||||
extern boolean leave(struct unit *u, boolean force);
|
extern boolean leave(struct unit *u, boolean force);
|
||||||
extern boolean can_leave(struct unit *u);
|
extern boolean can_leave(struct unit *u);
|
||||||
|
|
||||||
|
extern void u_set_building(struct unit * u, struct building * b);
|
||||||
extern void u_set_ship(struct unit * u, struct ship * sh);
|
extern void u_set_ship(struct unit * u, struct ship * sh);
|
||||||
extern void leave_ship(struct unit * u);
|
extern void leave_ship(struct unit * u);
|
||||||
extern void leave_building(struct unit * u);
|
extern void leave_building(struct unit * u);
|
||||||
|
|
|
@ -94,7 +94,7 @@ void score(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = r->ships; s; s = s->next) {
|
for (s = r->ships; s; s = s->next) {
|
||||||
unit *cap = shipowner(s);
|
unit *cap = ship_owner(s);
|
||||||
if (cap && cap->faction) {
|
if (cap && cap->faction) {
|
||||||
cap->faction->score += s->size * 2;
|
cap->faction->score += s->size * 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <kernel/spell_test.c>
|
#include <kernel/spell_test.c>
|
||||||
#include <kernel/curse_test.c>
|
#include <kernel/curse_test.c>
|
||||||
#include <kernel/battle_test.c>
|
#include <kernel/battle_test.c>
|
||||||
|
#include <kernel/reports_test.c>
|
||||||
#include <gamecode/laws_test.c>
|
#include <gamecode/laws_test.c>
|
||||||
#include <gamecode/market_test.c>
|
#include <gamecode/market_test.c>
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ int RunAllTests(void)
|
||||||
CuSuiteAddSuite(suite, get_curse_suite());
|
CuSuiteAddSuite(suite, get_curse_suite());
|
||||||
CuSuiteAddSuite(suite, get_market_suite());
|
CuSuiteAddSuite(suite, get_market_suite());
|
||||||
CuSuiteAddSuite(suite, get_move_suite());
|
CuSuiteAddSuite(suite, get_move_suite());
|
||||||
|
CuSuiteAddSuite(suite, get_reports_suite());
|
||||||
CuSuiteAddSuite(suite, get_ship_suite());
|
CuSuiteAddSuite(suite, get_ship_suite());
|
||||||
CuSuiteAddSuite(suite, get_spell_suite());
|
CuSuiteAddSuite(suite, get_spell_suite());
|
||||||
CuSuiteAddSuite(suite, get_laws_suite());
|
CuSuiteAddSuite(suite, get_laws_suite());
|
||||||
|
@ -80,7 +82,7 @@ struct region *test_create_region(int x, int y, const terrain_type *terrain)
|
||||||
|
|
||||||
struct faction *test_create_faction(const struct race *rc)
|
struct faction *test_create_faction(const struct race *rc)
|
||||||
{
|
{
|
||||||
faction *f = addfaction("nobody@eressea.de", NULL, rc, default_locale, 0);
|
faction *f = addfaction("nobody@eressea.de", NULL, rc?rc:rc_find("human"), default_locale, 0);
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue