diff --git a/.travis.yml b/.travis.yml index 11e8517af..cbf3ff239 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,7 @@ compiler: script: s/travis-build before_install: - sudo apt-get update -qq - - sudo apt-get install -qq libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev + - sudo apt-get install -qq libtolua-dev liblua5.1-dev libncurses5-dev libsqlite3-dev libxml2-dev +os: + - linux + - osx diff --git a/conf/keywords.json b/conf/keywords.json index 4f16be9bf..3080a03c4 100644 --- a/conf/keywords.json +++ b/conf/keywords.json @@ -1,5 +1,8 @@ { "keywords": { + "en" : { + "combat": [ "COMBAT", "FIGHT" ] + }, "de": { "//" : "//", "banner": "BANNER", @@ -14,7 +17,7 @@ "guard": ["BEWACHE", "BEWACHEN"], "message": "BOTSCHAFT", "end": "ENDE", - "ride": ["REITE", "REITEN"], + "ride": ["FAHRE", "FAHREN"], "number": "NUMMER", "follow": ["FOLGE","FOLGEN"], "research": ["FORSCHE", "FORSCHEN"], @@ -29,7 +32,7 @@ "make": ["MACHE", "MACHEN"], "maketemp": ["MACHE TEMP", "MACHETEMP"], "move" : "NACH", - "password" : "PASSWORD", + "password" : "PASSWORT", "loot" : ["PLÃœNDERE", "PLÃœNDERN"], "recruit": ["REKRUTIERE", "REKRUTIEREN"], "reserve": ["RESERVIERE", "RESERVIEREN"], diff --git a/critbit b/critbit index 2a7af5e23..61989d933 160000 --- a/critbit +++ b/critbit @@ -1 +1 @@ -Subproject commit 2a7af5e2347217ea4efcf7fb3f0bc9c2681d1a17 +Subproject commit 61989d93368022602a2a7ac4218c83f254701f0f diff --git a/src/creport.c b/src/creport.c index 9829f7e7c..2bb96f65f 100644 --- a/src/creport.c +++ b/src/creport.c @@ -685,13 +685,16 @@ static void fwriteorder(FILE * F, const struct order *ord, const struct locale *lang, bool escape) { - char ebuf[1024]; + char ebuf[1025]; char obuf[1024]; const char *str = obuf; fputc('"', F); write_order(ord, obuf, sizeof(obuf)); if (escape) { str = escape_string(obuf, ebuf, sizeof(ebuf)); + if (str == ebuf) { + ebuf[1024] = 0; + } } if (str[0]) fputs(str, F); diff --git a/src/eressea.c b/src/eressea.c index bcc794ea1..97408cded 100755 --- a/src/eressea.c +++ b/src/eressea.c @@ -58,9 +58,6 @@ void game_init(void) register_resources(); register_buildings(); register_itemfunctions(); -#if DUNGEON_MODULE - register_dungeon(); -#endif #if MUSEUM_MODULE register_museum(); #endif diff --git a/src/give.c b/src/give.c index 8887018ba..b76e735e8 100644 --- a/src/give.c +++ b/src/give.c @@ -165,7 +165,7 @@ struct order *ord) return -1; } else if (n == 0) { - int reserve = get_reservation(src, itype->rtype); + int reserve = get_reservation(src, itype); if (reserve) { msg_feedback(src, ord, "nogive_reserved", "resource reservation", itype->rtype, reserve); @@ -187,7 +187,7 @@ struct order *ord) i_change(&dest->items, itype, r); #ifdef RESERVE_GIVE #ifdef RESERVE_DONATIONS - change_reservation(dest, item2resource(itype), r); + change_reservation(dest, itype, r); #else if (src->faction == dest->faction) { change_reservation(dest, item2resource(itype), r); @@ -426,7 +426,6 @@ void give_unit(unit * u, unit * u2, order * ord) if (u2 == NULL) { message *msg; if (fval(r->terrain, SEA_REGION)) { - /* TODO: why is this here, but the unit does not actually seem to lose any men? */ msg = disband_men(u->number, u, ord); if (msg) { ADDMSG(&u->faction->msgs, msg); @@ -516,7 +515,7 @@ void give_unit(unit * u, unit * u2, order * ord) cmistake(u, ord, 156, MSG_COMMERCE); return; } - add_give(u, u2, 1, 1, get_resourcetype(R_UNIT), ord, 0); + add_give(u, u2, n, n, get_resourcetype(R_PERSON), ord, 0); u_setfaction(u, u2->faction); u2->faction->newbies += n; } @@ -680,8 +679,8 @@ void give_cmd(unit * u, order * ord) item *itm = *itmp; const item_type *itype = itm->type; if (itm->number > 0 - && itm->number - get_reservation(u, itype->rtype) > 0) { - n = itm->number - get_reservation(u, itype->rtype); + && itm->number - get_reservation(u, itype) > 0) { + n = itm->number - get_reservation(u, itype); if (give_item(n, itype, u, u2, ord) == 0) { if (*itmp != itm) continue; @@ -719,7 +718,7 @@ void give_cmd(unit * u, order * ord) item *i = *i_find(&u->items, itype); if (i != NULL) { if (can_give(u, u2, itype, 0)) { - n = i->number - get_reservation(u, itype->rtype); + n = i->number - get_reservation(u, itype); give_item(n, itype, u, u2, ord); } else { @@ -755,7 +754,7 @@ void give_cmd(unit * u, order * ord) msg_feedback(u, ord, "race_noregroup", "race", u_race(u))); return; } - msg = u2 ? give_men(u->number, u, u2, ord) : disband_men(u->number, u, ord); + msg = u2 ? give_men(n, u, u2, ord) : disband_men(n, u, ord); if (msg) { ADDMSG(&u->faction->msgs, msg); } diff --git a/src/gmtool.c b/src/gmtool.c index 7008c1136..ff1bc556d 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -28,9 +28,6 @@ #include #endif #include -#if DUNGEON_MODULE -#include -#endif #include #include diff --git a/src/kernel/group.c b/src/kernel/group.c index 402ebe9a3..a99c13116 100755 --- a/src/kernel/group.c +++ b/src/kernel/group.c @@ -1,5 +1,5 @@ /* -Copyright (c) 1998-2010, Enno Rehling +Copyright (c) 1998-2014, Enno Rehling Katja Zedel diff --git a/src/kernel/item.c b/src/kernel/item.c index f0baa0c78..320864122 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -604,7 +604,7 @@ static const char *resourcenames[MAX_RESOURCES] = { "aurafocus", "sphereofinv", "magicbag", "magicherbbag", "dreameye", "p2", "seed", "mallornseed", "money", "aura", "permaura", - "hp", "unit", "peasant" + "hp", "peasant", "person" }; const resource_type *get_resourcetype(resource_t type) { @@ -949,6 +949,8 @@ void init_resources(void) { resource_type *rtype; + rtype = rt_get_or_create(resourcenames[R_PERSON]); // lousy hack + rtype = rt_get_or_create(resourcenames[R_PEASANT]); rtype->uchange = res_changepeasants; @@ -971,10 +973,6 @@ void init_resources(void) rtype = rt_get_or_create(resourcenames[R_AURA]); rtype->uchange = res_changeaura; - // R_UNIT - rtype = rt_get_or_create(resourcenames[R_UNIT]); - rtype->uchange = res_changeperson; - /* alte typen registrieren: */ init_oldpotions(); } diff --git a/src/kernel/item.h b/src/kernel/item.h index 790911ba6..b3ea13bfc 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -297,8 +297,8 @@ extern "C" { R_AURA, /* Aura */ R_PERMAURA, /* Permanente Aura */ R_LIFE, - R_UNIT, R_PEASANT, + R_PERSON, MAX_RESOURCES, /* do not use outside item.c ! */ NORESOURCE = -1 diff --git a/src/kernel/item.test.c b/src/kernel/item.test.c index a99749ec7..5afc55b32 100644 --- a/src/kernel/item.test.c +++ b/src/kernel/item.test.c @@ -64,20 +64,6 @@ void test_change_item(CuTest * tc) test_uchange(tc, u, get_resourcetype(R_IRON)); } -void test_change_person(CuTest * tc) -{ - unit * u; - - test_cleanup(); - - register_resources(); - init_resources(); - test_create_world(); - - u = test_create_unit(0, 0); - test_uchange(tc, u, get_resourcetype(R_UNIT)); -} - void test_resource_type(CuTest * tc) { struct item_type *itype; @@ -136,7 +122,6 @@ CuSuite *get_item_suite(void) SUITE_ADD_TEST(suite, test_resourcename_no_appearance); SUITE_ADD_TEST(suite, test_resourcename_with_appearance); SUITE_ADD_TEST(suite, test_change_item); - SUITE_ADD_TEST(suite, test_change_person); SUITE_ADD_TEST(suite, test_resource_type); SUITE_ADD_TEST(suite, test_finditemtype); SUITE_ADD_TEST(suite, test_findresourcetype); diff --git a/src/kernel/pool.c b/src/kernel/pool.c index 552818871..bad3d1d80 100644 --- a/src/kernel/pool.c +++ b/src/kernel/pool.c @@ -84,34 +84,34 @@ int change_resource(unit * u, const resource_type * rtype, int change) return i; } -int get_reservation(const unit * u, const resource_type * rtype) +int get_reservation(const unit * u, const item_type * itype) { reservation *res = u->reservations; - if (rtype == get_resourcetype(R_STONE) && (u_race(u)->flags & RCF_STONEGOLEM)) + if (itype->rtype == get_resourcetype(R_STONE) && (u_race(u)->flags & RCF_STONEGOLEM)) return (u->number * GOLEM_STONE); - if (rtype == get_resourcetype(R_IRON) && (u_race(u)->flags & RCF_IRONGOLEM)) + if (itype->rtype == get_resourcetype(R_IRON) && (u_race(u)->flags & RCF_IRONGOLEM)) return (u->number * GOLEM_IRON); - while (res && res->type != rtype) + while (res && res->type != itype) res = res->next; if (res) return res->value; return 0; } -int change_reservation(unit * u, const resource_type * rtype, int value) +int change_reservation(unit * u, const item_type * itype, int value) { reservation *res, **rp = &u->reservations; if (!value) return 0; - while (*rp && (*rp)->type != rtype) + while (*rp && (*rp)->type != itype) rp = &(*rp)->next; res = *rp; if (!res) { *rp = res = calloc(sizeof(reservation), 1); - res->type = rtype; + res->type = itype; res->value = value; } else if (res && res->value + value <= 0) { @@ -125,18 +125,18 @@ int change_reservation(unit * u, const resource_type * rtype, int value) return res->value; } -int set_resvalue(unit * u, const resource_type * rtype, int value) +int set_resvalue(unit * u, const item_type * itype, int value) { reservation *res, **rp = &u->reservations; - while (*rp && (*rp)->type != rtype) + while (*rp && (*rp)->type != itype) rp = &(*rp)->next; res = *rp; if (!res) { if (!value) return 0; *rp = res = calloc(sizeof(reservation), 1); - res->type = rtype; + res->type = itype; res->value = value; } else if (res && value <= 0) { @@ -166,8 +166,8 @@ int count) if ((mode & GET_SLACK) && (mode & GET_RESERVE)) use = have; - else if (mode & (GET_SLACK|GET_RESERVE)) { - int reserve = get_reservation(u, rtype); + else if (rtype->itype && mode & (GET_SLACK | GET_RESERVE)) { + int reserve = get_reservation(u, rtype->itype); int slack = _max(0, have - reserve); if (mode & GET_RESERVE) use = have - slack; @@ -211,13 +211,13 @@ use_pooled(unit * u, const resource_type * rtype, unsigned int mode, int count) if ((mode & GET_SLACK) && (mode & GET_RESERVE)) { n = _min(use, have); } - else { - int reserve = get_reservation(u, rtype); + else if (rtype->itype) { + int reserve = get_reservation(u, rtype->itype); int slack = _max(0, have - reserve); if (mode & GET_RESERVE) { n = have - slack; n = _min(use, n); - change_reservation(u, rtype, -n); + change_reservation(u, rtype->itype, -n); } else if (mode & GET_SLACK) { n = _min(use, slack); @@ -229,23 +229,24 @@ use_pooled(unit * u, const resource_type * rtype, unsigned int mode, int count) } if (rtype->flags & RTF_POOLED && mode & ~(GET_SLACK | GET_RESERVE)) { - for (v = r->units; use > 0 && v != NULL; v = v->next) + for (v = r->units; use > 0 && v != NULL; v = v->next) { if (u != v) { - int mask; - if ((urace(v)->ec_flags & GIVEITEM) == 0) - continue; - if (v->items == NULL && rtype->uget == NULL) - continue; + int mask; + if ((urace(v)->ec_flags & GIVEITEM) == 0) + continue; + if (v->items == NULL && rtype->uget == NULL) + continue; - if (v->faction == f) { - mask = (mode >> 3) & (GET_SLACK | GET_RESERVE); - } - else if (alliedunit(v, f, HELP_MONEY)) - mask = (mode >> 6) & (GET_SLACK | GET_RESERVE); - else - continue; - use -= use_pooled(v, rtype, mask, use); + if (v->faction == f) { + mask = (mode >> 3) & (GET_SLACK | GET_RESERVE); + } + else if (alliedunit(v, f, HELP_MONEY)) + mask = (mode >> 6) & (GET_SLACK | GET_RESERVE); + else + continue; + use -= use_pooled(v, rtype, mask, use); } + } } return count - use; } diff --git a/src/kernel/pool.h b/src/kernel/pool.h index 6c47a5c14..695dfb28c 100644 --- a/src/kernel/pool.h +++ b/src/kernel/pool.h @@ -24,6 +24,7 @@ extern "C" { struct unit; struct resource_type; + struct item_type; struct region; /* bitfield values for get/use/change operations */ @@ -54,11 +55,11 @@ extern "C" { int change_resource(struct unit *u, const struct resource_type *res, int change); - int get_reservation(const struct unit *u, const struct resource_type *res); - int change_reservation(struct unit *u, const struct resource_type *res, + int get_reservation(const struct unit *u, const struct item_type *res); + int change_reservation(struct unit *u, const struct item_type *res, int value); - int set_resvalue(struct unit * u, const struct resource_type * rtype, int value); + int set_resvalue(struct unit * u, const struct item_type * rtype, int value); #ifdef __cplusplus } diff --git a/src/kernel/pool.test.c b/src/kernel/pool.test.c index b82304d25..711803970 100644 --- a/src/kernel/pool.test.c +++ b/src/kernel/pool.test.c @@ -30,10 +30,10 @@ void test_reservation(CuTest *tc) { assert(u); i_change(&u->items, rtype->itype, 100); CuAssertIntEquals(tc, 100, get_resource(u, rtype)); - CuAssertIntEquals(tc, 0, get_reservation(u, rtype)); - CuAssertIntEquals(tc, 50, change_reservation(u, rtype, 50)); - CuAssertIntEquals(tc, 100, change_reservation(u, rtype, 50)); - CuAssertIntEquals(tc, 50, set_resvalue(u, rtype, 50)); + CuAssertIntEquals(tc, 0, get_reservation(u, rtype->itype)); + CuAssertIntEquals(tc, 50, change_reservation(u, rtype->itype, 50)); + CuAssertIntEquals(tc, 100, change_reservation(u, rtype->itype, 50)); + CuAssertIntEquals(tc, 50, set_resvalue(u, rtype->itype, 50)); CuAssertIntEquals(tc, 100, get_resource(u, rtype)); CuAssertIntEquals(tc, 200, change_resource(u, rtype, 100)); CuAssertIntEquals(tc, 200, get_resource(u, rtype)); @@ -61,11 +61,11 @@ void test_pool(CuTest *tc) { u3 = test_create_unit(test_create_faction(0), r); assert(u1 && u2); i_change(&u1->items, rtype->itype, 100); - set_resvalue(u1, rtype, 50); + set_resvalue(u1, rtype->itype, 50); i_change(&u2->items, rtype->itype, 200); - set_resvalue(u2, rtype, 100); + set_resvalue(u2, rtype->itype, 100); i_change(&u3->items, rtype->itype, 400); - set_resvalue(u3, rtype, 200); + set_resvalue(u3, rtype->itype, 200); CuAssertIntEquals(tc, 50, get_pooled(u1, rtype, GET_SLACK, 40)); CuAssertIntEquals(tc, 50, get_pooled(u1, rtype, GET_SLACK, INT_MAX)); @@ -112,46 +112,45 @@ void test_pool_use(CuTest *tc) { unit *u1, *u2, *u3; faction *f; region *r; - struct resource_type *rtype; + struct item_type *itype; ally *al; test_cleanup(); test_create_world(); - rtype = rt_get_or_create("money"); - it_get_or_create(rtype); + itype = it_get_or_create(rt_get_or_create("money")); f = test_create_faction(0); r = findregion(0, 0); - assert(r && f && rtype && rtype->itype); + assert(r && f && itype); u1 = test_create_unit(f, r); u2 = test_create_unit(f, r); u3 = test_create_unit(test_create_faction(0), r); assert(u1 && u2); - i_change(&u1->items, rtype->itype, 100); - set_resvalue(u1, rtype, 50); - i_change(&u2->items, rtype->itype, 200); - set_resvalue(u2, rtype, 100); - i_change(&u3->items, rtype->itype, 400); - set_resvalue(u3, rtype, 200); + i_change(&u1->items, itype, 100); + set_resvalue(u1, itype, 50); + i_change(&u2->items, itype, 200); + set_resvalue(u2, itype, 100); + i_change(&u3->items, itype, 400); + set_resvalue(u3, itype, 200); al = ally_add(&u3->faction->allies, f); al->status = HELP_MONEY; - CuAssertIntEquals(tc, 10, use_pooled(u1, rtype, GET_SLACK, 10)); - CuAssertIntEquals(tc, 40, use_pooled(u1, rtype, GET_SLACK, 50)); - CuAssertIntEquals(tc, 50, i_get(u1->items, rtype->itype)); + CuAssertIntEquals(tc, 10, use_pooled(u1, itype->rtype, GET_SLACK, 10)); + CuAssertIntEquals(tc, 40, use_pooled(u1, itype->rtype, GET_SLACK, 50)); + CuAssertIntEquals(tc, 50, i_get(u1->items, itype)); - CuAssertIntEquals(tc, 50, get_reservation(u1, rtype)); - CuAssertIntEquals(tc, 10, use_pooled(u1, rtype, GET_RESERVE, 10)); - CuAssertIntEquals(tc, 40, i_get(u1->items, rtype->itype)); - CuAssertIntEquals(tc, 40, get_reservation(u1, rtype)); - CuAssertIntEquals(tc, 40, use_pooled(u1, rtype, GET_RESERVE, 50)); + CuAssertIntEquals(tc, 50, get_reservation(u1, itype)); + CuAssertIntEquals(tc, 10, use_pooled(u1, itype->rtype, GET_RESERVE, 10)); + CuAssertIntEquals(tc, 40, i_get(u1->items, itype)); + CuAssertIntEquals(tc, 40, get_reservation(u1, itype)); + CuAssertIntEquals(tc, 40, use_pooled(u1, itype->rtype, GET_RESERVE, 50)); - CuAssertIntEquals(tc, 10, use_pooled(u1, rtype, GET_POOLED_SLACK, 10)); - CuAssertIntEquals(tc, 90, use_pooled(u1, rtype, GET_POOLED_SLACK, 100)); - CuAssertIntEquals(tc, 100, i_get(u2->items, rtype->itype)); - CuAssertIntEquals(tc, 10, use_pooled(u1, rtype, GET_POOLED_RESERVE, 10)); - CuAssertIntEquals(tc, 90, get_reservation(u2, rtype)); - CuAssertIntEquals(tc, 90, use_pooled(u1, rtype, GET_POOLED_RESERVE, 100)); - CuAssertIntEquals(tc, 0, i_get(u2->items, rtype->itype)); + CuAssertIntEquals(tc, 10, use_pooled(u1, itype->rtype, GET_POOLED_SLACK, 10)); + CuAssertIntEquals(tc, 90, use_pooled(u1, itype->rtype, GET_POOLED_SLACK, 100)); + CuAssertIntEquals(tc, 100, i_get(u2->items, itype)); + CuAssertIntEquals(tc, 10, use_pooled(u1, itype->rtype, GET_POOLED_RESERVE, 10)); + CuAssertIntEquals(tc, 90, get_reservation(u2, itype)); + CuAssertIntEquals(tc, 90, use_pooled(u1, itype->rtype, GET_POOLED_RESERVE, 100)); + CuAssertIntEquals(tc, 0, i_get(u2->items, itype)); } void test_change_resource(CuTest * tc) diff --git a/src/kernel/race.c b/src/kernel/race.c index 7452fe79d..627882d8b 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -154,6 +154,9 @@ static race *rc_find_i(const char *name) while (rc && !strcmp(rname, rc->_name) == 0) { rc = rc->next; } + if (!rc && strcmp(name, "uruk") == 0) { + rc = rc_find_i("orc"); + } return rc; } diff --git a/src/kernel/save.c b/src/kernel/save.c index 153829ace..9b6f23e12 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -401,25 +401,25 @@ void read_items(struct storage *store, item ** ilist) { for (;;) { char ibuf[32]; - const resource_type *rtype; + const item_type *itype; int i; READ_STR(store, ibuf, sizeof(ibuf)); if (!strcmp("end", ibuf)) { break; } - rtype = rt_find(ibuf); + itype = it_find(ibuf); READ_INT(store, &i); if (i <= 0) { - log_error("data contains an entry with %d %s\n", i, resourcename(rtype, NMF_PLURAL)); + log_error("data contains an entry with %d %s\n", i, resourcename(itype->rtype, NMF_PLURAL)); } else { - if (rtype && rtype->itype) { - i_change(ilist, rtype->itype, i); + if (itype && itype->rtype) { + i_change(ilist, itype, i); } else { log_error("data contains unknown item type %s.\n", ibuf); } - assert(rtype && rtype->itype); + assert(itype && itype->rtype); } } } diff --git a/src/kernel/unit.h b/src/kernel/unit.h index bd5ffd493..bb1d5d54c 100644 --- a/src/kernel/unit.h +++ b/src/kernel/unit.h @@ -73,7 +73,7 @@ extern "C" { typedef struct reservation { struct reservation *next; - const struct resource_type *type; + const struct item_type *type; int value; } reservation; diff --git a/src/kernel/version.h b/src/kernel/version.h index e21c2c74b..e92d23aa6 100644 --- a/src/kernel/version.h +++ b/src/kernel/version.h @@ -74,7 +74,7 @@ #define SAVEGAMEID_VERSION 343 /* instead of XMLNAME, save the game.id parameter from the config */ #define BUILDNO_VERSION 344 /* storing the build number in the save */ #define AUTO_RACENAME_VERSION 345 /* NPC units with name==NULL will automatically get their race for a name */ -#define MIN_VERSION CURSETYPE_VERSION /* minimal datafile we support */ +#define MIN_VERSION INTPAK_VERSION /* minimal datafile we support */ #define RELEASE_VERSION AUTO_RACENAME_VERSION /* current datafile */ #define STREAM_VERSION 2 /* internal encoding of binary files */ diff --git a/src/laws.c b/src/laws.c index 6420ab366..44bec3642 100755 --- a/src/laws.c +++ b/src/laws.c @@ -1972,7 +1972,7 @@ int mail_cmd(unit * u, struct order *ord) case P_REGION: /* können alle Einheiten in der Region sehen */ s = getstrtoken(); - if (!s[0]) { + if (!s || !s[0]) { cmistake(u, ord, 30, MSG_MESSAGE); break; } @@ -2141,7 +2141,7 @@ int email_cmd(unit * u, struct order *ord) init_order(ord); s = getstrtoken(); - if (!s[0]) { + if (!s || !s[0]) { cmistake(u, ord, 85, MSG_EVENT); } else { @@ -3850,7 +3850,7 @@ static int reserve_i(unit * u, struct order *ord, int flags) { if (u->number > 0 && (urace(u)->ec_flags & GETITEM)) { int use, count, para; - const resource_type *rtype; + const item_type *itype; const char *s; init_order(ord); @@ -3862,19 +3862,19 @@ static int reserve_i(unit * u, struct order *ord, int flags) count = getint() * u->number; } s = getstrtoken(); - rtype = s ? findresourcetype(s, u->faction->locale) : 0; - if (rtype == NULL) + itype = s ? finditemtype(s, u->faction->locale) : 0; + if (itype == NULL) return 0; - set_resvalue(u, rtype, 0); /* make sure the pool is empty */ + set_resvalue(u, itype, 0); /* make sure the pool is empty */ if (count == 0 && para == P_ANY) { - count = get_resource(u, rtype); + count = get_resource(u, itype->rtype); } - use = use_pooled(u, rtype, flags, count); + use = use_pooled(u, itype->rtype, flags, count); if (use) { - set_resvalue(u, rtype, use); - change_resource(u, rtype, use); + set_resvalue(u, itype, use); + change_resource(u, itype->rtype, use); return use; } } diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index ad77cbf13..633c486f5 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -2,7 +2,6 @@ PROJECT(modules C) SET(_FILES arena.c autoseed.c -dungeon.c gmcmd.c museum.c score.c diff --git a/src/modules/dungeon.c b/src/modules/dungeon.c deleted file mode 100644 index 6e9508554..000000000 --- a/src/modules/dungeon.c +++ /dev/null @@ -1,273 +0,0 @@ -/* vi: set ts=2: - +-------------------+ Christian Schlittchen - | | Enno Rehling - | Eressea PBEM host | Katja Zedel - | (c) 1998 - 2003 | Henning Peters - | | Ingo Wilken - +-------------------+ Stefan Reich - - This program may not be used, modified or distributed - without prior permission by the authors of Eressea. -*/ - -#include -#include - -#if DUNGEON_MODULE -#include "dungeon.h" -#include "gmcmd.h" - -#include -#include - -/* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* util includes */ -#include -#include - -/* libc includes */ -#include -#include -#include - -typedef struct treasure { - const struct item_type *itype; - int amount; - struct treasure *next; -} treasure; - -typedef struct monster { - const struct race *race; - double chance; - int maxunits; - int avgsize; - struct treasure *treasures; - struct monster *next; - struct itemtype_list *weapons; -} monster; - -typedef struct skilllimit { - skill_t skill; - int minskill; - int maxskill; - struct skilllimit *next; -} skilllimit; - -typedef struct dungeon { - int level; - int radius; - int size; - int maxpeople; - struct skilllimit *limits; - double connect; - struct monster *boss; - struct monster *monsters; - struct dungeon *next; -} dungeon; - -dungeon *dungeonstyles; - -region *make_dungeon(const dungeon * data) -{ - int nb[2][3][2] = { - {{-1, 0}, {0, 1}, {1, -1}}, - {{1, 0}, {-1, 1}, {0, -1}} - }; - const struct race *bossrace = data->boss->race; - char name[128]; - int size = data->size; - int iterations = size * size; - unsigned int flags = PFL_NORECRUITS; - int n = 0; - struct faction *fmonsters = get_monsters(); - plane *p; - region *r, *center; - region *rnext; - region_list *iregion, *rlist = NULL; - const terrain_type *terrain_hell = get_terrain("hell"); - - assert(terrain_hell != NULL); - sprintf(name, "Die Höhlen von %s", bossrace->generate_name(NULL)); - p = gm_addplane(data->radius, flags, name); - - center = - findregion(p->minx + (p->maxx - p->minx) / 2, - p->miny + (p->maxy - p->miny) / 2); - assert(center); - terraform_region(center, terrain_hell); - add_regionlist(&rlist, center); - rnext = r = center; - while (size > 0 && iterations--) { - int d, o = rng_int() % 3; - for (d = 0; d != 3; ++d) { - int index = (d + o) % 3; - region *rn = findregion(r->x + nb[n][index][0], r->y + nb[n][index][1]); - assert(r->terrain == terrain_hell); - if (rn) { - if (rn->terrain == terrain_hell) { - rnext = rn; - } else if (fval(rn->terrain, SEA_REGION)) { - if (rng_int() % 100 < data->connect * 100) { - terraform_region(rn, terrain_hell); - --size; - rnext = rn; - add_regionlist(&rlist, rn); - } else - terraform(rn, T_FIREWALL); - } - if (size == 0) - break; - } - rn = - findregion(r->x + nb[(n + 1) % 2][index][0], - r->y + nb[(n + 1) % 2][index][1]); - if (rn && fval(rn->terrain, SEA_REGION)) { - terraform(rn, T_FIREWALL); - } - } - if (size == 0) - break; - if (r == rnext) { - /* error */ - break; - } - r = rnext; - n = (n + 1) % 2; - } - - for (iregion = rlist; iregion; iregion = iregion->next) { - monster *m = data->monsters; - region *r = iregion->data; - while (m) { - if ((rng_int() % 100) < (m->chance * 100)) { - /* TODO: check maxunits. */ - treasure *loot = m->treasures; - struct itemtype_list *weapon = m->weapons; - int size = 1 + (rng_int() % m->avgsize) + (rng_int() % m->avgsize); - unit *u = createunit(r, fmonsters, size, m->race); - while (weapon) { - i_change(&u->items, weapon->type, size); - weapon = weapon->next; - } - while (loot) { - i_change(&u->items, loot->itype, loot->amount * size); - loot = loot->next; - } - } - m = m->next; - } - } - return center; -} - -void make_dungeongate(region * source, region * target, const struct dungeon *d) -{ - building *bsource, *btarget; - - if (source == NULL || target == NULL || d == NULL) - return; - bsource = new_building(bt_find("castle"), source, default_locale); - set_string(&bsource->name, "Pforte zur Hölle"); - bsource->size = 50; - add_trigger(&bsource->attribs, "timer", trigger_gate(bsource, target)); - add_trigger(&bsource->attribs, "create", trigger_unguard(bsource)); - fset(bsource, BLD_UNGUARDED); - - btarget = new_building(bt_find("castle"), target, default_locale); - set_string(&btarget->name, "Pforte zur Außenwelt"); - btarget->size = 50; - add_trigger(&btarget->attribs, "timer", trigger_gate(btarget, source)); - add_trigger(&btarget->attribs, "create", trigger_unguard(btarget)); - fset(btarget, BLD_UNGUARDED); -} - -static int tagbegin(xml_stack * stack) -{ - xml_tag *tag = stack->tag; - if (strcmp(tag->name, "dungeon") == 0) { - dungeon *d = (dungeon *) calloc(sizeof(dungeon), 1); - d->maxpeople = xml_ivalue(tag, "maxpeople"); - if (d->maxpeople == 0) - d->maxpeople = INT_MAX; - d->level = xml_ivalue(tag, "level"); - d->radius = xml_ivalue(tag, "radius"); - d->connect = xml_fvalue(tag, "connect"); - d->size = xml_ivalue(tag, "size"); - stack->state = d; - } else { - dungeon *d = (dungeon *) stack->state; - if (strcmp(tag->name, "skilllimit") == 0) { - skill_t sk = findskill(xml_value(tag, "name")); - if (sk != NOSKILL) { - skilllimit *skl = calloc(sizeof(skilllimit), 1); - skl->skill = sk; - if (xml_value(tag, "max") != NULL) { - skl->maxskill = xml_ivalue(tag, "max"); - } else - skl->maxskill = INT_MAX; - if (xml_value(tag, "min") != NULL) { - skl->minskill = xml_ivalue(tag, "min"); - } else - skl->maxskill = INT_MIN; - skl->next = d->limits; - d->limits = skl; - } - } else if (strcmp(tag->name, "monster") == 0) { - monster *m = calloc(sizeof(monster), 1); - m->race = rc_find(xml_value(tag, "race")); - m->chance = xml_fvalue(tag, "chance"); - m->avgsize = _max(1, xml_ivalue(tag, "size")); - m->maxunits = _min(1, xml_ivalue(tag, "maxunits")); - - if (m->race) { - if (xml_bvalue(tag, "boss")) { - d->boss = m; - } else { - m->next = d->monsters; - d->monsters = m; - } - } - } else if (strcmp(tag->name, "weapon") == 0) { - monster *m = d->monsters; - itemtype_list *w = calloc(sizeof(itemtype_list), 1); - w->type = it_find(xml_value(tag, "type")); - if (w->type) { - w->next = m->weapons; - m->weapons = w; - } - } - } - return XML_OK; -} - -static int tagend(xml_stack * stack) -{ - xml_tag *tag = stack->tag; - if (strcmp(tag->name, "dungeon")) { - dungeon *d = (dungeon *) stack->state; - stack->state = NULL; - d->next = dungeonstyles; - dungeonstyles = d; - } - return XML_OK; -} - -xml_callbacks xml_dungeon = { - tagbegin, tagend, NULL -}; - -void register_dungeon(void) -{ - xml_register(&xml_dungeon, "eressea dungeon", 0); -} - -#endif diff --git a/src/modules/dungeon.h b/src/modules/dungeon.h deleted file mode 100644 index cb7715856..000000000 --- a/src/modules/dungeon.h +++ /dev/null @@ -1,37 +0,0 @@ -/* vi: set ts=2: - +-------------------+ Christian Schlittchen - | | Enno Rehling - | Eressea PBEM host | Katja Zedel - | (c) 1998 - 2003 | Henning Peters - | | Ingo Wilken - +-------------------+ Stefan Reich - - This program may not be used, modified or distributed - without prior permission by the authors of Eressea. -*/ - -#ifndef H_MOD_DUNGEON -#define H_MOD_DUNGEON -#ifdef __cplusplus -extern "C" { -#endif - -#if DUNGEON_MODULE == 0 -#error "must define DUNGEON_MODULE to use this module" -#endif - - struct region; - struct plane; - struct building; - struct dungeon; - - extern struct dungeon *dungeonstyles; - extern struct region *make_dungeon(const struct dungeon *); - extern void make_dungeongate(struct region *source, struct region *target, - const struct dungeon *); - extern void register_dungeon(void); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/settings.h b/src/settings.h index d682d8119..9375c0dc8 100644 --- a/src/settings.h +++ b/src/settings.h @@ -41,7 +41,6 @@ #define SCORE_MODULE 1 #define MUSEUM_MODULE 1 #define ARENA_MODULE 1 -#define DUNGEON_MODULE 0 #define CHANGED_CROSSBOWS 0 /* use the WTF_ARMORPIERCING flag */ #undef GLOBAL_WARMING /* number of turns before global warming sets in */ diff --git a/src/skill.c b/src/skill.c index acd6ba89a..d7ca2fee5 100644 --- a/src/skill.c +++ b/src/skill.c @@ -95,13 +95,18 @@ skill_t get_skill(const char *s, const struct locale * lang) if (s) { char * str = transliterate(buffer, sizeof(buffer) - sizeof(int), s); - int i; - const void * match; - void **tokens = get_translations(lang, UT_SKILLS); - struct critbit_tree *cb = (critbit_tree *)*tokens; - if (cb && cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { - cb_get_kv(match, &i, sizeof(int)); - result = (skill_t)i; + if (str) { + int i; + const void * match; + void **tokens = get_translations(lang, UT_SKILLS); + struct critbit_tree *cb = (critbit_tree *)*tokens; + if (cb && cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { + cb_get_kv(match, &i, sizeof(int)); + result = (skill_t)i; + } + } + else { + log_warning("could not transliterate skill: %s", s); } } return result; diff --git a/src/spells.c b/src/spells.c index 1ec53875c..b459b077f 100644 --- a/src/spells.c +++ b/src/spells.c @@ -4736,7 +4736,7 @@ int sp_clonecopy(castorder * co) create_newclone(mage, clone); - msg = msg_message("sp_clone_effet", "mage", mage); + msg = msg_message("sp_clone_effect", "mage", mage); r_addmessage(r, mage->faction, msg); msg_release(msg); diff --git a/src/test_eressea.c b/src/test_eressea.c index fef15ecae..ac18fc0b2 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -5,78 +5,87 @@ #include #pragma warning(disable: 4210) -#define ADD_TESTS(suite, name) \ - CuSuite *get_##name##_suite(void); \ - CuSuite *name = get_##name##_suite(); \ - CuSuiteAddSuite(suite, name); + +void RunTests(CuSuite * suite, const char *name) { + CuString *output = CuStringNew(); + + CuSuiteRun(suite); + CuSuiteDetails(suite, output); + if (suite->failCount) CuSuiteSummary(suite, output); + printf("%s: %s", name, output->buffer); + CuStringDelete(output); +} + +#define RUN_TESTS(suite, name) \ + CuSuite *get_##name##_suite(void); \ + CuSuite *name = get_##name##_suite(); \ + RunTests(name, #name); \ + suite->failCount += name->failCount; \ + suite->count += name->count; \ + CuSuiteDelete(name); int RunAllTests(void) { - CuString *output = CuStringNew(); CuSuite *suite = CuSuiteNew(); - int result, flags = log_flags; + int fail_count, flags = log_flags; log_flags = LOG_FLUSH | LOG_CPERROR; kernel_init(); /* self-test */ - ADD_TESTS(suite, tests); - ADD_TESTS(suite, callback); - ADD_TESTS(suite, json); - ADD_TESTS(suite, jsonconf); - ADD_TESTS(suite, direction); - ADD_TESTS(suite, skill); - ADD_TESTS(suite, keyword); - ADD_TESTS(suite, order); - ADD_TESTS(suite, race); + RUN_TESTS(suite, tests); + RUN_TESTS(suite, callback); + RUN_TESTS(suite, json); + RUN_TESTS(suite, jsonconf); + RUN_TESTS(suite, direction); + RUN_TESTS(suite, skill); + RUN_TESTS(suite, keyword); + RUN_TESTS(suite, order); + RUN_TESTS(suite, race); /* util */ - ADD_TESTS(suite, config); - ADD_TESTS(suite, attrib); - ADD_TESTS(suite, base36); - ADD_TESTS(suite, bsdstring); - ADD_TESTS(suite, functions); - ADD_TESTS(suite, umlaut); - ADD_TESTS(suite, unicode); - ADD_TESTS(suite, strings); + RUN_TESTS(suite, config); + RUN_TESTS(suite, attrib); + RUN_TESTS(suite, base36); + RUN_TESTS(suite, bsdstring); + RUN_TESTS(suite, functions); + RUN_TESTS(suite, umlaut); + RUN_TESTS(suite, unicode); + RUN_TESTS(suite, strings); /* kernel */ - ADD_TESTS(suite, alliance); - ADD_TESTS(suite, unit); - ADD_TESTS(suite, faction); - ADD_TESTS(suite, group); - ADD_TESTS(suite, build); - ADD_TESTS(suite, pool); - ADD_TESTS(suite, curse); - ADD_TESTS(suite, equipment); - ADD_TESTS(suite, item); - ADD_TESTS(suite, magic); - ADD_TESTS(suite, reports); - ADD_TESTS(suite, save); - ADD_TESTS(suite, ship); - ADD_TESTS(suite, spellbook); - ADD_TESTS(suite, building); - ADD_TESTS(suite, spell); - ADD_TESTS(suite, ally); + RUN_TESTS(suite, alliance); + RUN_TESTS(suite, unit); + RUN_TESTS(suite, faction); + RUN_TESTS(suite, group); + RUN_TESTS(suite, build); + RUN_TESTS(suite, pool); + RUN_TESTS(suite, curse); + RUN_TESTS(suite, equipment); + RUN_TESTS(suite, item); + RUN_TESTS(suite, magic); + RUN_TESTS(suite, reports); + RUN_TESTS(suite, save); + RUN_TESTS(suite, ship); + RUN_TESTS(suite, spellbook); + RUN_TESTS(suite, building); + RUN_TESTS(suite, spell); + RUN_TESTS(suite, ally); /* gamecode */ - ADD_TESTS(suite, battle); - ADD_TESTS(suite, economy); - ADD_TESTS(suite, give); - ADD_TESTS(suite, laws); - ADD_TESTS(suite, market); - ADD_TESTS(suite, move); - ADD_TESTS(suite, stealth); - ADD_TESTS(suite, upkeep); - ADD_TESTS(suite, vortex); - ADD_TESTS(suite, wormhole); + RUN_TESTS(suite, battle); + RUN_TESTS(suite, economy); + RUN_TESTS(suite, give); + RUN_TESTS(suite, laws); + RUN_TESTS(suite, market); + RUN_TESTS(suite, move); + RUN_TESTS(suite, stealth); + RUN_TESTS(suite, upkeep); + RUN_TESTS(suite, vortex); + RUN_TESTS(suite, wormhole); - CuSuiteRun(suite); - CuSuiteSummary(suite, output); - CuSuiteDetails(suite, output); - printf("%s\n", output->buffer); - - log_flags = flags; - result = suite->failCount; - CuSuiteDelete(suite); - return result; + printf("\ntest summary: %d tests, %d failed\n", suite->count, suite->failCount); + log_flags = flags; + fail_count = suite->failCount; + CuSuiteDelete(suite); + return fail_count; } int main(int argc, char ** argv) { diff --git a/src/tests.test.c b/src/tests.test.c index d18775c56..7e36b193e 100644 --- a/src/tests.test.c +++ b/src/tests.test.c @@ -20,8 +20,6 @@ static void test_resources(CuTest *tc) { CuAssertPtrEquals(tc, rt_find("aura"), (void *)get_resourcetype(R_AURA)); CuAssertPtrNotNull(tc, rt_find("permaura")); CuAssertPtrEquals(tc, rt_find("permaura"), (void *)get_resourcetype(R_PERMAURA)); - CuAssertPtrNotNull(tc, rt_find("unit")); - CuAssertPtrEquals(tc, rt_find("unit"), (void *)get_resourcetype(R_UNIT)); CuAssertPtrEquals(tc, 0, rt_find("stone")); rtype = rt_get_or_create("stone"); @@ -55,7 +53,6 @@ static void test_recreate_world(CuTest * tc) CuAssertPtrNotNull(tc, get_resourcetype(R_AURA)); CuAssertPtrNotNull(tc, get_resourcetype(R_PERMAURA)); CuAssertPtrNotNull(tc, get_resourcetype(R_PEASANT)); - CuAssertPtrNotNull(tc, get_resourcetype(R_UNIT)); test_cleanup(); CuAssertPtrEquals(tc, 0, get_locale("de")); @@ -67,7 +64,6 @@ static void test_recreate_world(CuTest * tc) CuAssertPtrNotNull(tc, get_resourcetype(R_AURA)); CuAssertPtrNotNull(tc, get_resourcetype(R_PERMAURA)); CuAssertPtrNotNull(tc, get_resourcetype(R_PEASANT)); - CuAssertPtrNotNull(tc, get_resourcetype(R_UNIT)); CuAssertPtrEquals(tc, 0, findregion(0, 0)); } diff --git a/src/util/strings.c b/src/util/strings.c index a2e137042..4c72e0913 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -42,9 +42,13 @@ const char *escape_string(const char *str, char *buffer, char *o; size_t skip = start - str; + if (skip > len) { + skip = len; + } memcpy(buffer, str, skip); o = buffer + skip; p = str + skip; + len -= skip; do { if (*p == '\"' || *p == '\\') { if (len < 2) { diff --git a/src/util/strings.test.c b/src/util/strings.test.c index ada78d206..c8dd63147 100644 --- a/src/util/strings.test.c +++ b/src/util/strings.test.c @@ -7,6 +7,9 @@ static void test_escape_string(CuTest * tc) { char scratch[64]; + CuAssertStrEquals(tc, "12345678901234567890", escape_string("12345678901234567890", scratch, 16)); + CuAssertStrEquals(tc, "123456789\\\"12345", escape_string("123456789\"1234567890", scratch, 16)); + CuAssertStrEquals(tc, "1234567890123456", escape_string("1234567890123456\"890", scratch, 16)); CuAssertStrEquals(tc, "hello world", escape_string("hello world", scratch, sizeof(scratch))); CuAssertStrEquals(tc, "hello \\\"world\\\"", escape_string("hello \"world\"", scratch, sizeof(scratch))); CuAssertStrEquals(tc, "\\\"\\\\", escape_string("\"\\", scratch, sizeof(scratch)));