forked from github/server
Einbaum sollte keine feste Ablegerichtung haben
This commit is contained in:
parent
53b0d639f2
commit
8b68ce41da
7 changed files with 58 additions and 8 deletions
|
@ -707,7 +707,9 @@ flying_ship(const ship * sh)
|
||||||
static void
|
static void
|
||||||
set_coast(ship * sh, region * r, region * rnext)
|
set_coast(ship * sh, region * r, region * rnext)
|
||||||
{
|
{
|
||||||
if (!fval(rnext->terrain, SEA_REGION) && !flying_ship(sh)) {
|
if (sh->type->flags & SFL_NOCOAST) {
|
||||||
|
sh->coast = NODIRECTION;
|
||||||
|
} else if (!fval(rnext->terrain, SEA_REGION) && !flying_ship(sh)) {
|
||||||
sh->coast = reldirection(rnext, r);
|
sh->coast = reldirection(rnext, r);
|
||||||
assert(fval(r->terrain, SEA_REGION));
|
assert(fval(r->terrain, SEA_REGION));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1777,7 +1779,7 @@ sail(unit * u, order * ord, boolean move_on_land, region_list **routep)
|
||||||
|
|
||||||
for (d=0;d!=MAXDIRECTIONS;++d) {
|
for (d=0;d!=MAXDIRECTIONS;++d) {
|
||||||
region * rc = rconnect(next_point, d);
|
region * rc = rconnect(next_point, d);
|
||||||
if (!fval(rc->terrain, SEA_REGION)) break;
|
if (rc==NULL || !fval(rc->terrain, SEA_REGION)) break;
|
||||||
}
|
}
|
||||||
if (d == MAXDIRECTIONS) {
|
if (d == MAXDIRECTIONS) {
|
||||||
/* Schiff kann nicht aufs offene Meer */
|
/* Schiff kann nicht aufs offene Meer */
|
||||||
|
|
|
@ -1548,6 +1548,9 @@ readgame(const char * filename, int mode, int backup)
|
||||||
/* Attribute rekursiv einlesen */
|
/* Attribute rekursiv einlesen */
|
||||||
|
|
||||||
sh->coast = (direction_t)store->r_int(store);
|
sh->coast = (direction_t)store->r_int(store);
|
||||||
|
if (sh->type->flags & SFL_NOCOAST) {
|
||||||
|
sh->coast = NODIRECTION;
|
||||||
|
}
|
||||||
a_read(store, &sh->attribs);
|
a_read(store, &sh->attribs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1759,6 +1762,7 @@ writegame(const char *filename, int mode)
|
||||||
store->w_tok(store, sh->type->name[0]);
|
store->w_tok(store, sh->type->name[0]);
|
||||||
store->w_int(store, sh->size);
|
store->w_int(store, sh->size);
|
||||||
store->w_int(store, sh->damage);
|
store->w_int(store, sh->damage);
|
||||||
|
assert((sh->type->flags & SFL_NOCOAST)==0 || sh->coast == NODIRECTION);
|
||||||
store->w_int(store, sh->coast);
|
store->w_int(store, sh->coast);
|
||||||
store->w_brk(store);
|
store->w_brk(store);
|
||||||
a_write(store, sh->attribs);
|
a_write(store, sh->attribs);
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
/* ship_type::flags */
|
/* ship_type::flags */
|
||||||
#define SFL_OPENSEA 0x01
|
#define SFL_OPENSEA 0x01
|
||||||
#define SFL_FLY 0x02
|
#define SFL_FLY 0x02
|
||||||
|
#define SFL_NOCOAST 0x04
|
||||||
|
|
||||||
typedef struct ship_type {
|
typedef struct ship_type {
|
||||||
const char * name[2];
|
const char * name[2];
|
||||||
|
|
|
@ -533,6 +533,7 @@ parse_ships(xmlDocPtr doc)
|
||||||
st->combat = xml_ivalue(node, "combat", 0);
|
st->combat = xml_ivalue(node, "combat", 0);
|
||||||
st->cptskill = xml_ivalue(node, "cptskill", 0);
|
st->cptskill = xml_ivalue(node, "cptskill", 0);
|
||||||
st->damage = xml_fvalue(node, "damage", 0.0);
|
st->damage = xml_fvalue(node, "damage", 0.0);
|
||||||
|
if (xml_bvalue(node, "nocoast", false)) st->flags |= SFL_NOCOAST;
|
||||||
if (xml_bvalue(node, "fly", false)) st->flags |= SFL_FLY;
|
if (xml_bvalue(node, "fly", false)) st->flags |= SFL_FLY;
|
||||||
if (xml_bvalue(node, "opensea", false)) st->flags |= SFL_OPENSEA;
|
if (xml_bvalue(node, "opensea", false)) st->flags |= SFL_OPENSEA;
|
||||||
st->fishing = xml_ivalue(node, "fishing", 0);
|
st->fishing = xml_ivalue(node, "fishing", 0);
|
||||||
|
|
|
@ -562,10 +562,32 @@ tolua_write_reports(lua_State* L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reset_game(void)
|
||||||
|
{
|
||||||
|
region * r;
|
||||||
|
faction * f;
|
||||||
|
for (r=regions;r;r=r->next) {
|
||||||
|
unit * u;
|
||||||
|
building * b;
|
||||||
|
r->flags &= RF_SAVEMASK;
|
||||||
|
for (u=r->units;u;u=u->next) {
|
||||||
|
u->flags &= UFL_SAVEMASK;
|
||||||
|
}
|
||||||
|
for (b=r->buildings;b;b=b->next) {
|
||||||
|
b->flags &= BLD_SAVEMASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (f=factions;f;f=f->next) {
|
||||||
|
f->flags &= FFL_SAVEMASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tolua_process_orders(lua_State* L)
|
tolua_process_orders(lua_State* L)
|
||||||
{
|
{
|
||||||
++turn;
|
++turn;
|
||||||
|
reset_game();
|
||||||
processorders();
|
processorders();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<ships>
|
<ships>
|
||||||
<ship name="canoe" range="3" fishing="20" storm="1.00" damage="1.00" cabins="2" cargo="2000" cptskill="1" minskill="1" sumskill="2" opensea="no">
|
<ship name="canoe" nocoast="true" range="3" fishing="20" storm="1.00" damage="1.00" cabins="2" cargo="2000" cptskill="1" minskill="1" sumskill="2" opensea="no">
|
||||||
<coast terrain="ocean"/>
|
<coast terrain="ocean"/>
|
||||||
<coast terrain="plain"/>
|
<coast terrain="plain"/>
|
||||||
<coast terrain="swamp"/>
|
<coast terrain="swamp"/>
|
||||||
|
|
|
@ -630,7 +630,7 @@ local function two_units(r, f1, f2)
|
||||||
return u1, u2
|
return u1, u2
|
||||||
end
|
end
|
||||||
|
|
||||||
function two_factions()
|
local function two_factions()
|
||||||
local f1 = faction.create("noreply@eressea.de", "human", "de")
|
local f1 = faction.create("noreply@eressea.de", "human", "de")
|
||||||
f1.id = 1
|
f1.id = 1
|
||||||
local f2 = faction.create("noreply@eressea.de", "orc", "de")
|
local f2 = faction.create("noreply@eressea.de", "orc", "de")
|
||||||
|
@ -638,6 +638,27 @@ function two_factions()
|
||||||
return f1, f2
|
return f1, f2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function test_canoe()
|
||||||
|
free_game()
|
||||||
|
local f = faction.create("noreply@eressea.de", "human", "de")
|
||||||
|
local src = region.create(0, 0, "ocean")
|
||||||
|
local land = region.create(1, 0, "plain")
|
||||||
|
region.create(2, 0, "ocean")
|
||||||
|
local dst = region.create(3, 0, "ocean")
|
||||||
|
local sh = ship.create(src, "canoe")
|
||||||
|
local u1, u2 = two_units(src, f, f)
|
||||||
|
u1.ship = sh
|
||||||
|
u2.ship = sh
|
||||||
|
u1:set_skill("sailing", 10)
|
||||||
|
u1:clear_orders()
|
||||||
|
u1:add_order("NACH O O O")
|
||||||
|
process_orders()
|
||||||
|
assert(u2.region.id==land.id)
|
||||||
|
u1:add_order("NACH O O O")
|
||||||
|
process_orders()
|
||||||
|
assert(u2.region.id==dst.id)
|
||||||
|
end
|
||||||
|
|
||||||
function test_control()
|
function test_control()
|
||||||
free_game()
|
free_game()
|
||||||
local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions())
|
local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions())
|
||||||
|
@ -707,16 +728,15 @@ tests = {
|
||||||
["work"] = test_work,
|
["work"] = test_work,
|
||||||
["morale"] = test_morale,
|
["morale"] = test_morale,
|
||||||
["owners"] = test_owners,
|
["owners"] = test_owners,
|
||||||
|
["canoe"] = test_canoe,
|
||||||
["market"] = test_market
|
["market"] = test_market
|
||||||
}
|
}
|
||||||
mytests = {
|
mytests = {
|
||||||
["morale"] = test_morale,
|
["canoe"] = test_canoe,
|
||||||
["control"] = test_control,
|
|
||||||
["taxes"] = test_taxes,
|
|
||||||
["owners"] = test_owners
|
["owners"] = test_owners
|
||||||
}
|
}
|
||||||
fail = 0
|
fail = 0
|
||||||
for k, v in pairs(tests) do
|
for k, v in pairs(mytests) do
|
||||||
local status, err = pcall(v)
|
local status, err = pcall(v)
|
||||||
if not status then
|
if not status then
|
||||||
fail = fail + 1
|
fail = fail + 1
|
||||||
|
|
Loading…
Reference in a new issue