diff --git a/conf/e4/config.xml b/conf/e4/config.xml
index 95bcde300..a6439db21 100644
--- a/conf/e4/config.xml
+++ b/conf/e4/config.xml
@@ -58,6 +58,7 @@
+
diff --git a/game-e2/catalog.xml b/game-e2/catalog.xml
deleted file mode 100644
index a6c2882c8..000000000
--- a/game-e2/catalog.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/game-e2/config.xml b/game-e2/config.xml
deleted file mode 100644
index ec8a8855e..000000000
--- a/game-e2/config.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- eressea-server@eressea.de
- eressea-server@eressea.de
-
-
- Bitte denke daran, deine Befehle mit dem Betreff
- ERESSEA BEFEHLE an eressea-server@eressea.de zu senden.
- Remember to send your orders to
- eressea-server@eressea.de with the subject ERESSEA ORDERS.
-
-
- ERESSEA BEFEHLE
- ERESSEA ORDERS
-
-
-
diff --git a/game-e2/eressea.ini b/game-e2/eressea.ini
deleted file mode 100644
index 1abf1be35..000000000
--- a/game-e2/eressea.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[eressea]
-base = .
-report = reports
-verbose = 0
-lomem = 0
-debug = 0
-memcheck = 0
-locales = de,en
-
-[config]
-rules = eressea
-source_dir = ..
-maxnmrs = 10
-
-[editor]
-color = 1
diff --git a/game-e2/runtests.lua b/game-e2/runtests.lua
deleted file mode 100644
index 423094391..000000000
--- a/game-e2/runtests.lua
+++ /dev/null
@@ -1,2 +0,0 @@
-require "setup"
-run_tests()
diff --git a/game-e2/setup.lua b/game-e2/setup.lua
deleted file mode 100644
index ccd43719d..000000000
--- a/game-e2/setup.lua
+++ /dev/null
@@ -1,14 +0,0 @@
-local srcpath = config.source_dir
-local respath = srcpath .. '/res'
-local paths = {
- 'scripts/?.lua',
- 'core/scripts/?.lua',
- 'lunit/?.lua'
-}
-
-for idx, path in pairs(paths) do
- package.path = srcpath .. '/' .. path .. ';' .. package.path
-end
-
-assert(read_xml())
-require "init"
diff --git a/game-e3/catalog.xml b/game-e3/catalog.xml
deleted file mode 100644
index 3d82919cd..000000000
--- a/game-e3/catalog.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/game-e3/config.xml b/game-e3/config.xml
deleted file mode 100644
index a66b20393..000000000
--- a/game-e3/config.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- eressea-server@eressea.de
- eressea-server@eressea.de
-
-
- Bitte denke daran, deine Befehle mit dem Betreff
- ERESSEA 4 BEFEHLE an eressea-server@eressea.de zu senden.
- Remember to send your orders to
- eressea-server@eressea.de with the subject ERESSEA 4 ORDERS.
-
-
- ERESSEA 4 BEFEHLE
- ERESSEA 4 ORDERS
-
-
-
diff --git a/game-e3/eressea.ini b/game-e3/eressea.ini
deleted file mode 100644
index fdfe6277c..000000000
--- a/game-e3/eressea.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-[eressea]
-base = .
-report = reports
-verbose = 0
-lomem = 0
-debug = 0
-memcheck = 0
-locales = de,en
-
-[config]
-rules = e3a
-source_dir = ..
-maxnmrs = 20
-
-[editor]
-color = 1
diff --git a/game-e3/runtests.lua b/game-e3/runtests.lua
deleted file mode 100644
index 423094391..000000000
--- a/game-e3/runtests.lua
+++ /dev/null
@@ -1,2 +0,0 @@
-require "setup"
-run_tests()
diff --git a/game-e3/setup.lua b/game-e3/setup.lua
deleted file mode 100644
index ccd43719d..000000000
--- a/game-e3/setup.lua
+++ /dev/null
@@ -1,14 +0,0 @@
-local srcpath = config.source_dir
-local respath = srcpath .. '/res'
-local paths = {
- 'scripts/?.lua',
- 'core/scripts/?.lua',
- 'lunit/?.lua'
-}
-
-for idx, path in pairs(paths) do
- package.path = srcpath .. '/' .. path .. ';' .. package.path
-end
-
-assert(read_xml())
-require "init"
diff --git a/res/core/common/items.xml b/res/core/common/items.xml
index d867a3126..9508653e7 100644
--- a/res/core/common/items.xml
+++ b/res/core/common/items.xml
@@ -1,6 +1,10 @@
+
+
+
+
diff --git a/scripts/tests/e3/rules.lua b/scripts/tests/e3/rules.lua
index 07fbb1a60..193551ea9 100644
--- a/scripts/tests/e3/rules.lua
+++ b/scripts/tests/e3/rules.lua
@@ -712,6 +712,42 @@ function test_golem_use_four_iron()
assert_equal(4, u1:get_item("towershield"))
end
+function skip_test_silver_weight_stops_movement()
+ local r1 = region.create(1, 1, "plain")
+ local r2 = region.create(2, 1, "plain")
+ region.create(3, 1, "plain")
+ local f1 = faction.create("noreply@eressea.de", "human", "de")
+ local u1 = unit.create(f1, r1, 1)
+ u1:clear_orders()
+ u1:add_order("NACH OST")
+ u1:add_item("money", 540)
+ assert_equal(1540, u1.weight)
+ process_orders()
+ assert_equal(r2, u1.region)
+ u1:add_item("money", 1)
+ process_orders()
+ assert_equal(r2, u1.region)
+end
+
+function skip_test_silver_weight_stops_ship()
+ local r1 = region.create(1, 1, "ocean")
+ local r2 = region.create(2, 1, "ocean")
+ region.create(3, 1, "ocean")
+ local f1 = faction.create("noreply@eressea.de", "human", "de")
+ local u1 = unit.create(f1, r1, 1)
+ u1:set_skill("sailing", 3)
+ local s1 = ship.create(r1, "canoe")
+ u1.ship = s1
+ u1:clear_orders()
+ u1:add_order("NACH OST")
+ u1:add_item("money", 2000)
+ process_orders()
+ assert_equal(r2, u1.region)
+ u1:add_item("money", 1)
+ process_orders()
+ assert_equal(r2, u1.region)
+end
+
function test_building_owner_can_enter_ship()
local r1 = region.create(1, 2, "plain")
local f1 = faction.create("noreply@eressea.de", "human", "de")
@@ -734,3 +770,12 @@ function test_building_owner_can_enter_ship()
assert_equal(s1, u1.ship)
assert_equal(null, u1.building, "owner of the building can not go into a ship")
end
+
+function test_weightless_silver()
+ local r1 = region.create(1, 2, "plain")
+ local f1 = faction.create("noreply@eressea.de", "human", "de")
+ local u1 = unit.create(f1, r1, 1)
+ assert_equal(1000, u1.weight)
+ u1:add_item("money", 540)
+ assert_equal(1000, u1.weight)
+end
diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt
index 9dbb73b49..bc2c20418 100644
--- a/src/kernel/CMakeLists.txt
+++ b/src/kernel/CMakeLists.txt
@@ -21,6 +21,7 @@ race.test.c
spellbook.test.c
curse.test.c
jsonconf.test.c
+messages.test.c
)
SET(_FILES
diff --git a/src/kernel/item.test.c b/src/kernel/item.test.c
index dcb7ca878..981edf641 100644
--- a/src/kernel/item.test.c
+++ b/src/kernel/item.test.c
@@ -143,6 +143,27 @@ static void test_fix_demand(CuTest *tc) {
test_cleanup();
}
+static void test_core_resources(CuTest *tc) {
+ resource_type * rtype;
+ test_cleanup();
+ init_resources();
+ CuAssertPtrNotNull(tc, rtype = rt_find("money"));
+ CuAssertPtrNotNull(tc, rtype->itype);
+ CuAssertPtrNotNull(tc, rtype->uchange);
+ CuAssertPtrNotNull(tc, rtype->itype->give);
+ CuAssertPtrNotNull(tc, rtype = rt_find("peasant"));
+ CuAssertPtrEquals(tc, 0, rtype->itype);
+ CuAssertPtrNotNull(tc, rtype = rt_find("person"));
+ CuAssertPtrEquals(tc, 0, rtype->itype);
+ CuAssertPtrNotNull(tc, rtype = rt_find("permaura"));
+ CuAssertPtrEquals(tc, 0, rtype->itype);
+ CuAssertPtrNotNull(tc, rtype = rt_find("hp"));
+ CuAssertPtrEquals(tc, 0, rtype->itype);
+ CuAssertPtrNotNull(tc, rtype = rt_find("aura"));
+ CuAssertPtrEquals(tc, 0, rtype->itype);
+ test_cleanup();
+}
+
CuSuite *get_item_suite(void)
{
CuSuite *suite = CuSuiteNew();
@@ -153,5 +174,6 @@ CuSuite *get_item_suite(void)
SUITE_ADD_TEST(suite, test_finditemtype);
SUITE_ADD_TEST(suite, test_findresourcetype);
SUITE_ADD_TEST(suite, test_fix_demand);
+ SUITE_ADD_TEST(suite, test_core_resources);
return suite;
}
diff --git a/src/kernel/messages.c b/src/kernel/messages.c
index f7297f832..46329d66b 100644
--- a/src/kernel/messages.c
+++ b/src/kernel/messages.c
@@ -17,7 +17,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
**/
#include
-#include
#include "messages.h"
/* kernel includes */
@@ -140,7 +139,7 @@ struct message *msg_feedback(const struct unit *u, struct order *ord,
message *msg_message(const char *name, const char *sig, ...)
/* msg_message("oops_error", "unit region command", u, r, cmd) */
{
- va_list marker;
+ va_list vargs;
const message_type *mtype = mt_find(name);
char paramname[64];
const char *ic = sig;
@@ -155,7 +154,7 @@ message *msg_message(const char *name, const char *sig, ...)
return NULL;
}
- va_start(marker, sig);
+ va_start(vargs, sig);
while (*ic && !isalnum(*ic))
ic++;
while (*ic) {
@@ -172,9 +171,9 @@ message *msg_message(const char *name, const char *sig, ...)
}
if (i != mtype->nparameters) {
if (mtype->types[i]->vtype == VAR_VOIDPTR) {
- args[i].v = va_arg(marker, void *);
+ args[i].v = va_arg(vargs, void *);
} else if (mtype->types[i]->vtype == VAR_INT) {
- args[i].i = va_arg(marker, int);
+ args[i].i = va_arg(vargs, int);
} else {
assert(!"unknown variant type");
}
@@ -185,7 +184,7 @@ message *msg_message(const char *name, const char *sig, ...)
while (*ic && !isalnum(*ic))
ic++;
}
- va_end(marker);
+ va_end(vargs);
return msg_create(mtype, args);
}
diff --git a/src/kernel/messages.h b/src/kernel/messages.h
index 83c0f2613..b9c07b0c9 100644
--- a/src/kernel/messages.h
+++ b/src/kernel/messages.h
@@ -22,6 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern "C" {
#endif
+#include
#include
struct faction;
diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c
new file mode 100644
index 000000000..e237ab8de
--- /dev/null
+++ b/src/kernel/messages.test.c
@@ -0,0 +1,44 @@
+#include
+#include "messages.h"
+
+#include
+#include
+
+void test_missing_message(CuTest *tc) {
+ message *msg;
+ msg = msg_message("unknown", "unit", NULL);
+ CuAssertPtrNotNull(tc, msg);
+ CuAssertPtrNotNull(tc, msg->type);
+ CuAssertStrEquals(tc, msg->type->name, "missing_message");
+ msg_release(msg);
+}
+
+void test_message(CuTest *tc) {
+ message *msg;
+// const char * args[] = { }
+ message_type *mtype = mt_new("custom", NULL);
+ mt_register(mtype);
+ CuAssertPtrEquals(tc, mtype, (void *)mt_find("custom"));
+ CuAssertIntEquals(tc, 0, mtype->nparameters);
+ CuAssertPtrEquals(tc, NULL, (void *)mtype->pnames);
+ CuAssertPtrEquals(tc, NULL, (void *)mtype->types);
+ msg = msg_message("custom", "");
+ CuAssertPtrNotNull(tc, msg);
+ CuAssertIntEquals(tc, 1, msg->refcount);
+ CuAssertPtrEquals(tc, NULL, msg->parameters);
+ CuAssertPtrEquals(tc, mtype, (void *)msg->type);
+
+ CuAssertPtrEquals(tc, msg, msg_addref(msg));
+ CuAssertIntEquals(tc, 2, msg->refcount);
+ msg_release(msg);
+ CuAssertIntEquals(tc, 1, msg->refcount);
+ msg_release(msg);
+ test_cleanup();
+}
+
+CuSuite *get_messages_suite(void) {
+ CuSuite *suite = CuSuiteNew();
+ SUITE_ADD_TEST(suite, test_missing_message);
+ SUITE_ADD_TEST(suite, test_message);
+ return suite;
+}
\ No newline at end of file
diff --git a/src/kernel/race.c b/src/kernel/race.c
index 14541346e..2919fdb8b 100644
--- a/src/kernel/race.c
+++ b/src/kernel/race.c
@@ -177,7 +177,11 @@ race *rc_get_or_create(const char *zName)
rc = (race *)calloc(sizeof(race), 1);
rc->hitpoints = 1;
+ rc->weight = PERSON_WEIGHT;
+ rc->capacity = 540;
rc->recruit_multi = 1.0F;
+ rc->regaura = 1.0F;
+ rc->speed = 1.0F;
if (strchr(zName, ' ') != NULL) {
log_error("race '%s' has an invalid name. remove spaces\n", zName);
assert(strchr(zName, ' ') == NULL);
diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c
index 31c058bea..ef4fc640e 100644
--- a/src/kernel/race.test.c
+++ b/src/kernel/race.test.c
@@ -8,17 +8,43 @@
#include
static void test_rc_name(CuTest *tc) {
- struct race *rc = test_create_race("human");
+ struct race *rc;
+ test_cleanup();
+ rc = test_create_race("human");
CuAssertStrEquals(tc, "race::human", rc_name_s(rc, NAME_SINGULAR));
CuAssertStrEquals(tc, "race::human_p", rc_name_s(rc, NAME_PLURAL));
CuAssertStrEquals(tc, "race::human_d", rc_name_s(rc, NAME_DEFINITIVE));
CuAssertStrEquals(tc, "race::human_x", rc_name_s(rc, NAME_CATEGORY));
+ test_cleanup();
+}
+
+static void test_rc_defaults(CuTest *tc) {
+ struct race *rc;
+ test_cleanup();
+ rc = rc_get_or_create("human");
+ CuAssertStrEquals(tc, "human", rc->_name);
+ CuAssertDblEquals(tc, 0.0, rc->magres, 0.0);
+ CuAssertDblEquals(tc, 0.0, rc->maxaura, 0.0);
+ CuAssertDblEquals(tc, 1.0, rc->recruit_multi, 0.0);
+ CuAssertDblEquals(tc, 1.0, rc->regaura, 0.0);
+ CuAssertDblEquals(tc, 1.0, rc->speed, 0.0);
+ CuAssertIntEquals(tc, 0, rc->flags);
+ CuAssertIntEquals(tc, 0, rc->recruitcost);
+ CuAssertIntEquals(tc, 0, rc->maintenance);
+ CuAssertIntEquals(tc, 540, rc->capacity);
+ CuAssertIntEquals(tc, 1, rc->hitpoints);
+ CuAssertIntEquals(tc, 0, rc->armor);
+ CuAssertIntEquals(tc, 0, rc->at_bonus);
+ CuAssertIntEquals(tc, 0, rc->df_bonus);
+ CuAssertIntEquals(tc, PERSON_WEIGHT, rc->weight);
+ test_cleanup();
}
CuSuite *get_race_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_rc_name);
+ SUITE_ADD_TEST(suite, test_rc_defaults);
return suite;
}
diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c
index 1b1c6b356..5061abb07 100644
--- a/src/kernel/xmlreader.c
+++ b/src/kernel/xmlreader.c
@@ -1626,22 +1626,22 @@ static int parse_races(xmlDocPtr doc)
rc->def_damage = _strdup((const char *)propValue);
xmlFree(propValue);
- rc->magres = (float)xml_fvalue(node, "magres", 0.0);
- rc->maxaura = (float)xml_fvalue(node, "maxaura", 0.0);
- rc->regaura = (float)xml_fvalue(node, "regaura", 1.0);
- rc->recruitcost = xml_ivalue(node, "recruitcost", 0);
- rc->maintenance = xml_ivalue(node, "maintenance", 0);
- rc->weight = xml_ivalue(node, "weight", PERSON_WEIGHT);
- rc->capacity = xml_ivalue(node, "capacity", 540);
- rc->speed = (float)xml_fvalue(node, "speed", 1.0F);
- rc->hitpoints = xml_ivalue(node, "hp", 0);
- rc->armor = (char)xml_ivalue(node, "ac", 0);
+ rc->magres = (float)xml_fvalue(node, "magres", rc->magres);
+ rc->maxaura = (float)xml_fvalue(node, "maxaura", rc->maxaura);
+ rc->regaura = (float)xml_fvalue(node, "regaura", rc->regaura);
+ rc->recruitcost = xml_ivalue(node, "recruitcost", rc->recruitcost);
+ rc->maintenance = xml_ivalue(node, "maintenance", rc->maintenance);
+ rc->weight = xml_ivalue(node, "weight", rc->weight);
+ rc->capacity = xml_ivalue(node, "capacity", rc->capacity);
+ rc->speed = (float)xml_fvalue(node, "speed", rc->speed);
+ rc->hitpoints = xml_ivalue(node, "hp", rc->hitpoints);
+ rc->armor = (char)xml_ivalue(node, "ac", rc->armor);
study_speed_base = xml_ivalue(node, "studyspeed", 0);
rc->at_default = (char)xml_ivalue(node, "unarmedattack", -2);
rc->df_default = (char)xml_ivalue(node, "unarmeddefense", -2);
- rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", 0);
- rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", 0);
+ rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus);
+ rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus);
if (!xml_bvalue(node, "playerrace", false))
rc->flags |= RCF_NPC;
diff --git a/src/laws.c b/src/laws.c
index 761ddab00..693df8f5c 100755
--- a/src/laws.c
+++ b/src/laws.c
@@ -4347,17 +4347,17 @@ void init_processor(void)
add_proc_order(p, K_GROUP, group_cmd, 0, NULL);
p += 10;
- add_proc_order(p, K_QUIT, quit_cmd, 0, NULL);
- add_proc_order(p, K_URSPRUNG, origin_cmd, 0, NULL);
- add_proc_order(p, K_ALLY, ally_cmd, 0, NULL);
- add_proc_order(p, K_PREFIX, prefix_cmd, 0, NULL);
- add_proc_order(p, K_SETSTEALTH, setstealth_cmd, 0, NULL);
- add_proc_order(p, K_STATUS, status_cmd, 0, NULL);
- add_proc_order(p, K_COMBATSPELL, combatspell_cmd, 0, NULL);
- add_proc_order(p, K_DISPLAY, display_cmd, 0, NULL);
- add_proc_order(p, K_NAME, name_cmd, 0, NULL);
- add_proc_order(p, K_GUARD, guard_off_cmd, 0, NULL);
- add_proc_order(p, K_RESHOW, reshow_cmd, 0, NULL);
+ add_proc_order(p, K_QUIT, &quit_cmd, 0, NULL);
+ add_proc_order(p, K_URSPRUNG, &origin_cmd, 0, NULL);
+ add_proc_order(p, K_ALLY, &ally_cmd, 0, NULL);
+ add_proc_order(p, K_PREFIX, &prefix_cmd, 0, NULL);
+ add_proc_order(p, K_SETSTEALTH, &setstealth_cmd, 0, NULL);
+ add_proc_order(p, K_STATUS, &status_cmd, 0, NULL);
+ add_proc_order(p, K_COMBATSPELL, &combatspell_cmd, 0, NULL);
+ add_proc_order(p, K_DISPLAY, &display_cmd, 0, NULL);
+ add_proc_order(p, K_NAME, &name_cmd, 0, NULL);
+ add_proc_order(p, K_GUARD, &guard_off_cmd, 0, NULL);
+ add_proc_order(p, K_RESHOW, &reshow_cmd, 0, NULL);
if (get_param_int(global.parameters, "rules.alliances", 0) == 1) {
p += 10;
diff --git a/src/test_eressea.c b/src/test_eressea.c
index b8ff259b6..ca6ebf604 100644
--- a/src/test_eressea.c
+++ b/src/test_eressea.c
@@ -71,6 +71,7 @@ int RunAllTests(void)
RUN_TESTS(suite, building);
RUN_TESTS(suite, spell);
RUN_TESTS(suite, ally);
+ RUN_TESTS(suite, messages);
/* gamecode */
RUN_TESTS(suite, battle);
RUN_TESTS(suite, economy);
diff --git a/src/util/message.c b/src/util/message.c
index 7e9c1a9f0..79c1949f5 100644
--- a/src/util/message.c
+++ b/src/util/message.c
@@ -146,7 +146,7 @@ message *msg_create(const struct message_type *mtype, variant args[])
return NULL;
}
msg->type = mtype;
- msg->parameters = (variant *) calloc(mtype->nparameters, sizeof(variant));
+ msg->parameters = (variant *)(mtype->nparameters ? calloc(mtype->nparameters, sizeof(variant)) : NULL);
msg->refcount = 1;
for (i = 0; i != mtype->nparameters; ++i) {
msg->parameters[i] = copy_arg(mtype->types[i], args[i]);