diff --git a/scripts/tests/common.lua b/scripts/tests/common.lua index c186107c4..655c210fa 100644 --- a/scripts/tests/common.lua +++ b/scripts/tests/common.lua @@ -1112,3 +1112,25 @@ function test_build_castle() assert_equal(1, u.building.size) assert_equal(u.building.name, "Burg") end + +function test_route() + local r1 = region.create(0, 0, "plain") + local r2 = region.create(1, 0, "plain") + local f = faction.create("human", "route@example.com") + local u = unit.create(f, r1, 1) + u:add_order("ROUTE O W P") + process_orders() + assert_equal("ROUTE West PAUSE Ost", u:get_order(0)) + assert_equal(r2, u.region) +end + +function test_route_pause() + local r1 = region.create(0, 0, "plain") + local r2 = region.create(1, 0, "plain") + local f = faction.create("human", "route@example.com") + local u = unit.create(f, r1, 1) + u:add_order("ROUTE P O W") + process_orders() + assert_equal("ROUTE P O W", u:get_order(0)) + assert_equal(r1, u.region) +end diff --git a/src/bind_unit.c b/src/bind_unit.c index a7e8f61ab..f48965bfc 100644 --- a/src/bind_unit.c +++ b/src/bind_unit.c @@ -718,6 +718,30 @@ static int tolua_unit_set_region(lua_State * L) return 0; } +static int tolua_unit_get_order(lua_State * L) +{ + unit *self = (unit *)tolua_tousertype(L, 1, 0); + int index = (int)tolua_tonumber(L, 2, -1); + order *ord = NULL; + if (index < 0) { + ord = self->thisorder; + } + else { + int i; + ord = self->orders; + for (i = 0; ord && i != index; ++i) { + ord = ord->next; + } + } + if (ord) { + char buffer[1024]; + get_command(ord, self->faction->locale, buffer, sizeof(buffer)); + lua_pushstring(L, buffer); + return 1; + } + return 0; +} + static int tolua_unit_add_order(lua_State * L) { unit *self = (unit *)tolua_tousertype(L, 1, 0); @@ -972,6 +996,7 @@ void tolua_unit_open(lua_State * L) tolua_variable(L, TOLUA_CAST "weight", tolua_unit_get_weight, 0); tolua_variable(L, TOLUA_CAST "capacity", tolua_unit_get_capacity, 0); + tolua_function(L, TOLUA_CAST "get_order", tolua_unit_get_order); tolua_function(L, TOLUA_CAST "add_order", tolua_unit_add_order); tolua_function(L, TOLUA_CAST "clear_orders", tolua_unit_clear_orders); tolua_function(L, TOLUA_CAST "get_curse", tolua_unit_get_curse); diff --git a/src/economy.c b/src/economy.c index 759d60cb8..c7ab2247d 100644 --- a/src/economy.c +++ b/src/economy.c @@ -64,7 +64,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* util includes */ #include #include -#include #include #include #include @@ -248,6 +247,7 @@ void add_recruits(unit * u, int number, int wanted) if (number > 0) { unit *unew; char equipment[64]; + int len; if (u->number == 0) { set_number(u, number); @@ -258,10 +258,10 @@ void add_recruits(unit * u, int number, int wanted) unew = create_unit(r, u->faction, number, u_race(u), 0, NULL, u); } - strlcpy(equipment, "new_", sizeof(equipment)); - strlcat(equipment, u_race(u)->_name, sizeof(equipment)); - equip_unit(unew, get_equipment(equipment)); - + len = snprintf(equipment, sizeof(equipment), "new_%s", u_race(u)->_name); + if (len > 0 && (size_t)len < sizeof(equipment)) { + equip_unit(unew, get_equipment(equipment)); + } if (unew != u) { transfermen(unew, u, unew->number); remove_unit(&r->units, unew); diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 1e877459e..a574f2dfb 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -33,7 +33,6 @@ /* util includes */ #include #include -#include #include #include #include @@ -166,9 +165,7 @@ newfaction *read_newfactions(const char *filename) break; } if (password[0] == '\0') { - size_t sz; - sz = strlcpy(password, itoa36(rng_int()), sizeof(password)); - sz += strlcat(password, itoa36(rng_int()), sizeof(password)); + snprintf(password, sizeof(password), "%s%s", itoa36(rng_int()), itoa36(rng_int())); } for (f = factions; f; f = f->next) { if (strcmp(faction_getemail(f), email) == 0 && f->age < MINAGE_MULTI) {