forked from github/server
fix region owner when a building transfers
This commit is contained in:
parent
5547893be7
commit
707262c61d
|
@ -170,7 +170,10 @@ static int tolua_building_set_owner(lua_State * L)
|
|||
{
|
||||
building *b = (building *) tolua_tousertype(L, 1, 0);
|
||||
unit *u = (unit *) tolua_tousertype(L, 2, 0);
|
||||
building_set_owner(b, u);
|
||||
if (b!=u->building) {
|
||||
u_set_building(u, b);
|
||||
}
|
||||
building_set_owner(u);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -631,15 +631,19 @@ static void give_control(unit * u, unit * u2)
|
|||
if (u->building && u->faction != u2->faction && rule_region_owners()) {
|
||||
region *r = u->region;
|
||||
faction *f = region_get_owner(r);
|
||||
|
||||
assert(u->building==u2->building);
|
||||
if (f == u->faction) {
|
||||
building *b = largestbuilding(r, &cmp_current_owner, false);
|
||||
if (b == u->building) {
|
||||
friendly_takeover(r, u2->faction);
|
||||
}
|
||||
}
|
||||
building_set_owner(u2);
|
||||
}
|
||||
if (u->ship) {
|
||||
ship_set_owner(u->ship, u2);
|
||||
assert(u->ship==u2->ship);
|
||||
ship_set_owner(u2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -627,10 +627,10 @@ const char *buildingname(const building * b)
|
|||
return write_buildingname(b, ibuf, sizeof(name));
|
||||
}
|
||||
|
||||
void building_set_owner(struct building *b, struct unit * owner)
|
||||
void building_set_owner(struct unit * owner)
|
||||
{
|
||||
assert(b && owner && owner->building==b);
|
||||
b->_owner = owner;
|
||||
assert(owner && owner->building);
|
||||
owner->building->_owner = owner;
|
||||
}
|
||||
|
||||
static unit *building_owner_ex(const building * bld, const struct faction * last_owner)
|
||||
|
|
|
@ -152,7 +152,7 @@ extern "C" {
|
|||
extern struct building *findbuilding(int n);
|
||||
|
||||
extern struct unit *building_owner(const struct building *b);
|
||||
extern void building_set_owner(struct building *b, struct unit * u);
|
||||
extern void building_set_owner(struct unit * u);
|
||||
extern void building_update_owner(struct building * bld);
|
||||
|
||||
extern struct attrib_type at_building_action;
|
||||
|
|
|
@ -50,7 +50,7 @@ static void test_building_set_owner(CuTest * tc)
|
|||
u2 = test_create_unit(f, r);
|
||||
u_set_building(u2, bld);
|
||||
CuAssertPtrEquals(tc, u1, building_owner(bld));
|
||||
building_set_owner(bld, u2);
|
||||
building_set_owner(u2);
|
||||
CuAssertPtrEquals(tc, u2, building_owner(bld));
|
||||
}
|
||||
|
||||
|
|
|
@ -34,13 +34,13 @@ static void test_reorder_units(CuTest * tc)
|
|||
u_set_ship(u0, s);
|
||||
u1 = test_create_unit(f, r);
|
||||
u_set_ship(u1, s);
|
||||
ship_set_owner(s, u1);
|
||||
ship_set_owner(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);
|
||||
building_set_owner(u4);
|
||||
|
||||
reorder_units(r);
|
||||
|
||||
|
|
|
@ -802,7 +802,7 @@ unit *read_unit(struct storage *store)
|
|||
if (b) {
|
||||
u_set_building(u, b);
|
||||
if (fval(u, UFL_OWNER)) {
|
||||
building_set_owner(b, u);
|
||||
building_set_owner(u);
|
||||
}
|
||||
} else {
|
||||
log_error("read_unit: unit in unkown building '%s'\n", itoa36(n));
|
||||
|
@ -815,7 +815,7 @@ unit *read_unit(struct storage *store)
|
|||
if (sh) {
|
||||
u_set_ship(u, sh);
|
||||
if (fval(u, UFL_OWNER)) {
|
||||
ship_set_owner(sh, u);
|
||||
ship_set_owner(u);
|
||||
}
|
||||
} else {
|
||||
log_error("read_unit: unit in unkown ship '%s'\n", itoa36(n));
|
||||
|
|
|
@ -286,9 +286,9 @@ void getshipweight(const ship * sh, int *sweight, int *scabins)
|
|||
}
|
||||
}
|
||||
|
||||
void ship_set_owner(ship * sh, unit * u) {
|
||||
assert(u->ship==sh);
|
||||
sh->_owner = u;
|
||||
void ship_set_owner(unit * u) {
|
||||
assert(u && u->ship);
|
||||
u->ship->_owner = u;
|
||||
}
|
||||
|
||||
static unit * ship_owner_ex(const ship * sh, const struct faction * last_owner)
|
||||
|
|
|
@ -95,7 +95,7 @@ extern "C" {
|
|||
} ship;
|
||||
|
||||
extern void damage_ship(struct ship * sh, double percent);
|
||||
extern void ship_set_owner(struct ship * sh, struct unit * u);
|
||||
extern void ship_set_owner(struct unit * u);
|
||||
extern struct unit *ship_owner(const struct ship *sh);
|
||||
extern void ship_update_owner(struct ship * sh);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ static void test_ship_set_owner(CuTest * tc)
|
|||
u2 = test_create_unit(f, r);
|
||||
u_set_ship(u2, sh);
|
||||
CuAssertPtrEquals(tc, u1, ship_owner(sh));
|
||||
ship_set_owner(sh, u2);
|
||||
ship_set_owner(u2);
|
||||
CuAssertPtrEquals(tc, u2, ship_owner(sh));
|
||||
}
|
||||
|
||||
|
|
|
@ -781,7 +781,7 @@ void u_set_building(unit * u, building * b)
|
|||
assert(!u->building); /* you must leave first */
|
||||
u->building = b;
|
||||
if (b && !b->_owner) {
|
||||
building_set_owner(b, u);
|
||||
building_set_owner(u);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -790,7 +790,7 @@ void u_set_ship(unit * u, ship * sh)
|
|||
assert(!u->ship); /* you must leave_ship */
|
||||
u->ship = sh;
|
||||
if (sh && !sh->_owner) {
|
||||
ship_set_owner(sh, u);
|
||||
ship_set_owner(u);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue