forked from github/server
finally have all the scaffolding to write a test with ships.
configure terrain flags from json. ships are always allowed to enter SEA regions.
This commit is contained in:
parent
b40ddaeaa1
commit
33928568cf
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<terrains>
|
||||
<!-- defaults: walk="yes" sail="yes" fly="yes" shallow="yes" swim="no" forest="no" sea="no" land="yes" forbidden="no" arctic="no" cavalry="no" -->
|
||||
<terrain name="ocean" size="100" shallow="no" walk="no" swim="yes" land="no" sea="yes" />
|
||||
<terrain name="plain" size="10000" road="50" shallow="no" forest="yes" cavalry="yes" seed="3">
|
||||
<!-- defaults: walk="yes" sail="yes" fly="yes" swim="no" forest="no" sea="no" land="yes" forbidden="no" arctic="no" cavalry="no" -->
|
||||
<terrain name="ocean" size="100" walk="no" swim="yes" land="no" sea="yes" />
|
||||
<terrain name="plain" size="10000" road="50" forest="yes" cavalry="yes" seed="3">
|
||||
<herb name="h0" />
|
||||
<herb name="h1" />
|
||||
<herb name="h2" />
|
||||
|
|
|
@ -53,6 +53,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include "terrain.h"
|
||||
#include "unit.h"
|
||||
|
||||
#include <kernel/spell.h>
|
||||
#include <kernel/spellbook.h>
|
||||
/* util includes */
|
||||
#include <util/attrib.h>
|
||||
#include <util/base36.h>
|
||||
|
@ -2926,6 +2928,13 @@ void free_gamedata(void)
|
|||
free_units();
|
||||
free_regions();
|
||||
free_borders();
|
||||
default_locale = 0;
|
||||
free_locales();
|
||||
free_spells();
|
||||
free_buildingtypes();
|
||||
free_shiptypes();
|
||||
free_races();
|
||||
free_spellbooks();
|
||||
|
||||
for (i=0;i!=MAXLOCALES;++i) {
|
||||
if (defaults[i]) {
|
||||
|
|
|
@ -86,8 +86,31 @@ void json_terrain(cJSON *json, terrain_type *ter) {
|
|||
return;
|
||||
}
|
||||
for (child=json->child;child;child=child->next) {
|
||||
switch(child->type) {
|
||||
case cJSON_Array:
|
||||
if (strcmp(child->string, "flags")==0) {
|
||||
cJSON *entry;
|
||||
const char * flags[] = {
|
||||
"land", "sea", "forest", "arctic", "cavalry", "forbidden", "sail", "fly", "swim", "walk", 0
|
||||
};
|
||||
for (entry=child->child;entry;entry=entry->next) {
|
||||
if (entry->type == cJSON_String) {
|
||||
int i;
|
||||
for (i = 0; flags[i]; ++i) {
|
||||
if (strcmp(flags[i], entry->valuestring)==0) {
|
||||
ter->flags |= (1<<i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log_error_n("terrain %s contains unknown attribute %s", json->string, child->string);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
log_error_n("terrain %s contains unknown attribute %s", json->string, child->string);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void json_building(cJSON *json, building_type *bt) {
|
||||
|
@ -120,6 +143,15 @@ void json_ship(cJSON *json, ship_type *st) {
|
|||
case cJSON_Object:
|
||||
if (strcmp(child->string, "construction")==0) {
|
||||
json_construction(child, &st->construction);
|
||||
} else {
|
||||
log_error_n("ship %s contains unknown attribute %s", json->string, child->string);
|
||||
}
|
||||
break;
|
||||
case cJSON_Number:
|
||||
if (strcmp(child->string, "range")==0) {
|
||||
st->range = child->valueint;
|
||||
} else {
|
||||
log_error_n("ship %s contains unknown attribute %s", json->string, child->string);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -132,7 +132,8 @@ static void test_buildings(CuTest * tc)
|
|||
|
||||
static void test_terrains(CuTest * tc)
|
||||
{
|
||||
const char * data = "{\"terrains\": { \"plain\" : {} }}";
|
||||
const char * data = "{\"terrains\": { \"plain\" : { \"flags\" : [ \"land\", \"fly\", \"walk\" ] } }}";
|
||||
const terrain_type *ter;
|
||||
|
||||
cJSON *json = cJSON_Parse(data);
|
||||
|
||||
|
@ -141,7 +142,9 @@ static void test_terrains(CuTest * tc)
|
|||
CuAssertPtrEquals(tc, 0, (void *)get_terrain("plain"));
|
||||
|
||||
json_config(json);
|
||||
CuAssertPtrNotNull(tc, get_terrain("plain"));
|
||||
ter = get_terrain("plain");
|
||||
CuAssertPtrNotNull(tc, ter);
|
||||
CuAssertIntEquals(tc, ter->flags, LAND_REGION|FLY_INTO|WALK_INTO);
|
||||
|
||||
test_cleanup();
|
||||
}
|
||||
|
|
|
@ -654,8 +654,12 @@ int check_ship_allowed(struct ship *sh, const region * r)
|
|||
}
|
||||
}
|
||||
|
||||
if (bt_harbour && buildingtype_exists(r, bt_harbour, true))
|
||||
if (bt_harbour && buildingtype_exists(r, bt_harbour, true)) {
|
||||
return SA_HARBOUR;
|
||||
}
|
||||
if (fval(r->terrain, SEA_REGION)) {
|
||||
return SA_COAST;
|
||||
}
|
||||
for (c = 0; sh->type->coasts[c] != NULL; ++c) {
|
||||
if (sh->type->coasts[c] == r->terrain)
|
||||
return SA_COAST;
|
||||
|
@ -1729,7 +1733,7 @@ sail(unit * u, order * ord, bool move_on_land, region_list ** routep)
|
|||
if (storms_enabled) {
|
||||
gamedate date;
|
||||
get_gamedate(turn, &date);
|
||||
stormyness = storms[date.month] * 5;
|
||||
stormyness = storms ? storms[date.month] * 5 : 0;
|
||||
}
|
||||
gamecookie = global.cookie;
|
||||
}
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
|
||||
static void test_ship_not_allowed_in_coast(CuTest * tc)
|
||||
{
|
||||
region *r;
|
||||
region *r1, *r2;
|
||||
ship * sh;
|
||||
terrain_type * ttype;
|
||||
terrain_type *ttype, *otype;
|
||||
ship_type *stype;
|
||||
const char * names[] = { "derp", "derp_p" };
|
||||
|
||||
|
@ -24,15 +24,18 @@ static void test_ship_not_allowed_in_coast(CuTest * tc)
|
|||
test_create_world();
|
||||
|
||||
ttype = test_create_terrain("glacier", LAND_REGION|ARCTIC_REGION|WALK_INTO|SAIL_INTO);
|
||||
otype = test_create_terrain("ocean", SEA_REGION|SAIL_INTO);
|
||||
stype = test_create_shiptype(names);
|
||||
stype->coasts = (const struct terrain_type **)calloc(2, sizeof(const struct terrain_type *));
|
||||
|
||||
r = test_create_region(0, 0, ttype);
|
||||
r1 = test_create_region(0, 0, ttype);
|
||||
r2 = test_create_region(1, 0, otype);
|
||||
sh = test_create_ship(0, stype);
|
||||
|
||||
CuAssertIntEquals(tc, SA_NO_COAST, check_ship_allowed(sh, r));
|
||||
CuAssertIntEquals(tc, SA_COAST, check_ship_allowed(sh, r2));
|
||||
CuAssertIntEquals(tc, SA_NO_COAST, check_ship_allowed(sh, r1));
|
||||
stype->coasts[0] = ttype;
|
||||
CuAssertIntEquals(tc, SA_COAST, check_ship_allowed(sh, r));
|
||||
CuAssertIntEquals(tc, SA_COAST, check_ship_allowed(sh, r1));
|
||||
}
|
||||
|
||||
static void test_ship_allowed_with_harbor(CuTest * tc)
|
||||
|
|
|
@ -35,7 +35,6 @@ extern "C" {
|
|||
#define FLY_INTO (1<<7) /* man darf hierhin fliegen */
|
||||
#define SWIM_INTO (1<<8) /* man darf hierhin schwimmen */
|
||||
#define WALK_INTO (1<<9) /* man darf hierhin laufen */
|
||||
#define LARGE_SHIPS (1<<10) /* grosse Schiffe dürfen hinfahren */
|
||||
|
||||
typedef struct production_rule {
|
||||
char *name;
|
||||
|
|
|
@ -1975,8 +1975,6 @@ static int parse_terrains(xmlDocPtr doc)
|
|||
terrain->flags |= WALK_INTO;
|
||||
if (xml_bvalue(node, "swim", false))
|
||||
terrain->flags |= SWIM_INTO;
|
||||
if (xml_bvalue(node, "shallow", true))
|
||||
terrain->flags |= LARGE_SHIPS;
|
||||
if (xml_bvalue(node, "cavalry", false))
|
||||
terrain->flags |= CAVALRY_REGION;
|
||||
}
|
||||
|
|
|
@ -60,13 +60,6 @@ void test_cleanup(void)
|
|||
test_clear_resources();
|
||||
global.functions.maintenance = NULL;
|
||||
global.functions.wage = NULL;
|
||||
default_locale = 0;
|
||||
free_locales();
|
||||
free_spells();
|
||||
free_buildingtypes();
|
||||
free_shiptypes();
|
||||
free_races();
|
||||
free_spellbooks();
|
||||
free_gamedata();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
-- new tests 2014-06-11
|
||||
|
||||
-- require "tests.ships"
|
||||
require "tests.settings"
|
||||
require "tests.config"
|
||||
require "tests.locale"
|
||||
require "tests.regions"
|
||||
require "tests.ships"
|
||||
|
||||
|
|
|
@ -6,22 +6,37 @@ function setup()
|
|||
eressea.free_game()
|
||||
eressea.settings.set("nmr.removenewbie", "0")
|
||||
eressea.settings.set("nmr.timeout", "0")
|
||||
eressea.settings.set("NewbieImmunity", "0")
|
||||
eressea.settings.set("rules.ships.storms", "0")
|
||||
conf = [[{
|
||||
"races": {
|
||||
"human" : {},
|
||||
"insect" : {}
|
||||
},
|
||||
"ships" : {
|
||||
"boat" : {},
|
||||
"longboat" : {}
|
||||
"boat" : {
|
||||
"construction" : {
|
||||
"maxsize" : 5
|
||||
},
|
||||
"range" : 3
|
||||
}
|
||||
},
|
||||
"buildings" : {
|
||||
"harbour" : {}
|
||||
},
|
||||
"terrains" : {
|
||||
"ocean": {},
|
||||
"plain": {}
|
||||
"ocean": { "flags" : [ "sea", "sail", "fly" ] },
|
||||
"plain": { "flags" : [ "land", "walk", "sail", "fly" ] }
|
||||
},
|
||||
"directions" : {
|
||||
"de" : {
|
||||
"east" : "OSTEN",
|
||||
"west" : "WESTEN"
|
||||
}
|
||||
},
|
||||
"keywords" : {
|
||||
"de" : {
|
||||
"move" : "NACH"
|
||||
}
|
||||
}
|
||||
}]]
|
||||
|
||||
|
@ -35,6 +50,7 @@ function test_sail()
|
|||
local f = faction.create("test@example.com", "human", "de")
|
||||
local u = unit.create(f, r1, 1)
|
||||
u.ship = ship.create(r1, "boat")
|
||||
u.ship.size = 5
|
||||
u:set_skill("sailing", 10)
|
||||
u:add_order("NACH O")
|
||||
process_orders()
|
||||
|
|
Loading…
Reference in New Issue