Merge pull request from ennorehling/develop

Another week of bugfixes and improvements
This commit is contained in:
Enno Rehling 2018-11-03 21:04:49 +01:00 committed by GitHub
commit 936a2daa28
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
98 changed files with 1387 additions and 1303 deletions

View file

@ -34,4 +34,4 @@ fi
tar cjf backup/$TURN.tar.bz2 $files
echo "uploading game-$GAME/$TURN.tar.bz2"
curl -s -n -T backup/$TURN.tar.bz2 https://dav.box.com/dav/Eressea/game-$GAME/$TURN.tar.bz2
curl -s -n -T eressea.db https://dav.box.com/dav/Eressea/eressea.db
#curl -s -n -T eressea.db https://dav.box.com/dav/Eressea/eressea.db

View file

@ -1437,7 +1437,7 @@ msgstr "Goblins"
msgctxt "spellinfo"
msgid "song_of_slavery"
msgstr "Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft sie den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig fühlen."
msgstr "Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft es den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig fühlen."
msgctxt "spell"
msgid "healingzone"

View file

@ -74,7 +74,7 @@ function use_xmastree(u, amount)
if u.region.herb~=nil then
-- TODO: else?
local trees = u.region:get_resource("tree")
u.region:set_key("xm06", true)
u.region:set_key("xm06", get_turn())
u.region:set_resource("tree", 10+trees)
local msg = usepotion_message(u, "xmastree")
msg:send_region(u.region)
@ -107,7 +107,7 @@ function self.update()
-- we celebrate knut and kick out the trees.
for r in regions() do
if r:get_key("xm06") then
r:set_key("xm06", false)
r:set_key("xm06", 0)
end
end
end

View file

@ -1135,3 +1135,24 @@ function test_immunity_stops_guard()
assert_equal(f.age, 2)
assert_true(u.guard)
end
function test_region_keys()
local r = region.create(0, 0, 'plain')
assert_nil(r:get_key('test'))
assert_nil(r:get_key('more'))
r:set_key('test', 42)
r:set_key('more') -- default is 1
assert_equal(42, r:get_key('test'))
assert_equal(1, r:get_key('more'))
end
function test_faction_keys()
local f = faction.create('human')
assert_nil(f:get_key('test'))
assert_nil(f:get_key('more'))
f:set_key('test', 42)
f:set_key('more') -- default is 1
assert_equal(42, f:get_key('test'))
assert_equal(1, f:get_key('more'))
end

View file

@ -6,6 +6,33 @@ function setup()
eressea.free_game()
end
function test_undead_reserve_self()
local r1 = region.create(0, 0, "plain")
local f1 = faction.create("human")
local u1 = unit.create(f1, r1, 1)
u1.race = "undead"
u1:clear_orders()
u1:add_item("log", 2)
u1:add_order("RESERVIERE 1 Holz")
u1:add_order("GIB 0 ALLES Holz")
process_orders()
assert_equal(1, u1:get_item("log"))
end
function test_undead_reserve_other()
local r1 = region.create(0, 0, "plain")
local f1 = faction.create("human")
local u1 = unit.create(f1, r1, 1)
local u2 = unit.create(f1, r1, 1)
u2:add_item("log", 2)
u1.race = "undead"
u1:clear_orders()
u1:add_order("RESERVIERE 1 Holz")
process_orders()
assert_equal(0, u1:get_item("log"))
assert_equal(2, u2:get_item("log"))
end
function test_undead_give_item()
local r1 = region.create(0, 0, "plain")
local f1 = faction.create("human", "hodor@eressea.de", "de")

View file

@ -75,9 +75,11 @@ end
function test_xmastree()
local r
r = use_tree("ocean")
assert_nil(r:get_key("xm06"))
assert_equal(0, r:get_resource("tree"))
eressea.free_game()
r = use_tree("plain")
assert_equal(get_turn(), r:get_key("xm06"))
assert_equal(10, r:get_resource("tree"))
end

View file

@ -21,11 +21,11 @@ COMPILE_DEFINITIONS ERESSEA_BUILDNO="${ERESSEA_BUILDNO}")
ENDIF()
IF (CMAKE_COMPILER_IS_GNUCC)
# SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=unused-but-set-variable")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wvla")
ENDIF()
IF (CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
# SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wconversion -Wno-sign-conversion")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare -Wall -Werror -Wno-unknown-pragmas -Wstrict-prototypes -Wpointer-arith -Wno-char-subscripts -Wno-long-long")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wsign-compare -Wall -Werror -Wno-unknown-pragmas -Wstrict-prototypes -Wpointer-arith -Wno-char-subscripts -Wno-long-long")
# SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c89")
ELSEIF(MSVC)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4 /WX /MP /D_CRT_SECURE_NO_WARNINGS /D_USE_MATH_DEFINES")
@ -117,7 +117,6 @@ set (ERESSEA_SRC
morale.c
move.c
names.c
orderdb.c
orderfile.c
piracy.c
prefix.c
@ -230,7 +229,6 @@ set(TESTS_SRC
monsters.test.c
move.test.c
names.test.c
orderdb.test.c
orderfile.test.c
piracy.test.c
prefix.test.c

View file

@ -26,7 +26,6 @@ static void test_herbsearch(CuTest * tc)
const item_type *itype;
test_setup();
test_inject_messagetypes();
r = test_create_region(0, 0, NULL);
rc = rc_get_or_create("dragon");
rc->flags |= RCF_UNARMEDGUARD;

View file

@ -98,7 +98,7 @@ static int obs_read(variant *var, void *owner, struct gamedata *data)
obs_data *od = (obs_data *)var->v;
UNUSED_ARG(owner);
read_faction_reference(data, &od->f, NULL);
read_faction_reference(data, &od->f);
READ_INT(data->store, &od->skill);
READ_INT(data->store, &od->timer);
return AT_READ_OK;

View file

@ -36,7 +36,7 @@ write_targetregion(const variant *var, const void *owner, struct storage *store)
static int read_targetregion(variant *var, void *owner, gamedata *data)
{
if (read_region_reference(data, (region **)&var->v, NULL) <= 0) {
if (read_region_reference(data, (region **)&var->v) <= 0) {
return AT_READ_FAIL;
}
return AT_READ_OK;

View file

@ -34,13 +34,13 @@ int autostudy_init(scholar scholars[], int max_scholars, region *r)
int nscholars = 0;
for (u = r->units; u; u = u->next) {
keyword_t kwd = getkeyword(u->thisorder);
keyword_t kwd = init_order(u->thisorder, u->faction->locale);
if (kwd == K_AUTOSTUDY) {
if (long_order_allowed(u)) {
if (unit_can_study(u)) {
scholar * st = scholars + nscholars;
init_order(u->thisorder, u->faction->locale);
st->sk = getskill(u->faction->locale);
scholar * st = scholars + nscholars;
skill_t sk = getskill(u->faction->locale);
if (check_student(u, u->thisorder, sk)) {
st->sk = sk;
st->level = effskill_study(u, st->sk);
st->learn = 0;
st->u = u;
@ -48,10 +48,6 @@ int autostudy_init(scholar scholars[], int max_scholars, region *r)
log_fatal("you must increase MAXSCHOLARS");
}
}
else {
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "error_race_nolearn", "race",
u_race(u)));
}
}
}
}

View file

@ -9,17 +9,22 @@
#include "kernel/region.h"
#include "kernel/unit.h"
#include "util/message.h"
#include "tests.h"
#include <CuTest.h>
static void test_autostudy_init(CuTest *tc) {
scholar scholars[4];
unit *u1, *u2, *u3;
unit *u1, *u2, *u3, *u4;
faction *f;
region *r;
test_setup();
mt_create_error(77);
mt_create_error(771);
r = test_create_plain(0, 0);
f = test_create_faction(NULL);
u1 = test_create_unit(f, r);
@ -30,8 +35,11 @@ static void test_autostudy_init(CuTest *tc) {
set_level(u2, SK_ENTERTAINMENT, 2);
u3 = test_create_unit(f, r);
u3->thisorder = create_order(K_AUTOSTUDY, f->locale, skillnames[SK_PERCEPTION]);
u4 = test_create_unit(test_create_faction(NULL), r);
u4->thisorder = create_order(K_AUTOSTUDY, f->locale, "Dudelidu");
scholars[3].u = NULL;
CuAssertIntEquals(tc, 3, autostudy_init(scholars, 4, r));
CuAssertPtrNotNull(tc, test_find_messagetype(u4->faction->msgs, "error77"));
CuAssertPtrEquals(tc, u2, scholars[0].u);
CuAssertIntEquals(tc, 2, scholars[0].level);
CuAssertIntEquals(tc, 0, scholars[0].learn);

View file

@ -281,19 +281,15 @@ static void set_friendly(side * as, side * ds)
as->relations[ds->index] |= E_FRIEND;
}
static int allysfm(const side * s, const faction * f, int mode)
static bool alliedside(const side * s, const faction * f, int mode)
{
if (s->faction == f)
return mode;
if (s->group) {
return alliedgroup(s->battle->plane, s->faction, f, s->group->allies, mode);
if (s->faction == f) {
return true;
}
return alliedfaction(s->battle->plane, s->faction, f, mode);
}
static int allysf(const side * s, const faction * f)
{
return allysfm(s, f, HELP_FIGHT);
if (s->group) {
return alliedgroup(s->faction, f, s->group, mode) != 0;
}
return alliedfaction(s->faction, f, mode) != 0;
}
static int dead_fighters(const fighter * df)
@ -313,7 +309,7 @@ fighter *select_corpse(battle * b, fighter * af)
for (si = 0; si != b->nsides; ++si) {
side *s = b->sides + si;
if (af == NULL || (!enemy_i(af->side, si) && allysf(af->side, s->faction))) {
if (af == NULL || (!enemy_i(af->side, si) && alliedside(af->side, s->faction, HELP_FIGHT))) {
maxcasualties += s->casualties;
}
}
@ -344,7 +340,7 @@ bool helping(const side * as, const side * ds)
{
if (as->faction == ds->faction)
return true;
return (bool)(!enemy(as, ds) && allysf(as, ds->faction));
return (!enemy(as, ds) && alliedside(as, ds->faction, HELP_FIGHT));
}
int statusrow(int status)
@ -832,7 +828,7 @@ bool meffect_protection(battle * b, meffect * s, side * ds)
return false;
if (enemy(s->magician->side, ds))
return false;
if (allysf(s->magician->side, ds->faction))
if (alliedside(s->magician->side, ds->faction, HELP_FIGHT))
return true;
return false;
}
@ -1654,7 +1650,7 @@ selist *select_fighters(battle * b, const side * vs, int mask, select_fun cb, vo
continue;
}
else if (mask == FS_HELP) {
if (enemy(s, vs) || !allysf(s, vs->faction)) {
if (enemy(s, vs) || !alliedside(s, vs->faction, HELP_FIGHT)) {
continue;
}
}
@ -2644,7 +2640,7 @@ static void aftermath(battle * b)
side *s;
int dead_players = 0;
bfaction *bf;
bool ships_damaged = (bool)(b->turn + (b->has_tactics_turn ? 1 : 0) > 2); /* only used for ship damage! */
bool ships_damaged = (b->turn + (b->has_tactics_turn ? 1 : 0) > 2); /* only used for ship damage! */
for (s = b->sides; s != b->sides + b->nsides; ++s) {
fighter *df;
@ -3112,9 +3108,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack)
if (fval(u, UFL_ANON_FACTION) != 0)
flags |= SIDE_STEALTH;
if (!(AllianceAuto() & HELP_FIGHT) && fval(u, UFL_GROUP)) {
const attrib *agroup = a_find(u->attribs, &at_group);
if (agroup != NULL)
g = (const group *)agroup->data.v;
g = get_group(u);
}
/* Illusionen und Zauber kaempfen nicht */
@ -3636,7 +3630,7 @@ static void join_allies(battle * b)
* vorgespiegelt wird, und er sich uns gegen<EFBFBD>ber nicht zu
* erkennen gibt, helfen wir ihm nicht */
if (s->stealthfaction) {
if (!allysfm(s, u->faction, HELP_FSTEALTH)) {
if (!alliedside(s, u->faction, HELP_FSTEALTH)) {
continue;
}
}
@ -3690,17 +3684,13 @@ static void join_allies(battle * b)
}
for (sa = s + 1; sa != b->sides + b->nsides; ++sa) {
plane *pl = rplane(r);
if (enemy(s, sa))
continue;
if (friendly(s, sa))
continue;
if (!alliedgroup(pl, f, sa->faction, f->allies, HELP_FIGHT))
continue;
if (!alliedgroup(pl, sa->faction, f, sa->faction->allies, HELP_FIGHT))
continue;
set_friendly(s, sa);
if (!enemy(s, sa) && !friendly(s, sa)) {
if (alliedfaction(f, sa->faction, HELP_FIGHT)) {
if (alliedfaction(sa->faction, f, HELP_FIGHT)) {
set_friendly(s, sa);
}
}
}
}
}
}

View file

@ -36,12 +36,16 @@ int eressea_write_game(const char * filename) {
int eressea_read_orders(const char * filename) {
FILE * F = fopen(filename, "r");
int result;
if (!F) {
perror(filename);
return -1;
}
log_info("reading orders from %s", filename);
return parseorders(F);
result = parseorders(F);
fclose(F);
return result;
}
int eressea_export_json(const char * filename, int flags) {

View file

@ -44,23 +44,6 @@ without prior permission by the authors of Eressea.
#include <string.h>
#include <stdlib.h>
typedef struct helpmode {
const char *name;
int status;
} helpmode;
static helpmode helpmodes[] = {
{ "all", HELP_ALL },
{ "money", HELP_MONEY },
{ "fight", HELP_FIGHT },
{ "observe", HELP_OBSERVE },
{ "give", HELP_GIVE },
{ "guard", HELP_GUARD },
{ "stealth", HELP_FSTEALTH },
{ "travel", HELP_TRAVEL },
{ NULL, 0 }
};
int tolua_factionlist_next(lua_State * L)
{
faction **faction_ptr = (faction **)lua_touserdata(L, lua_upvalueindex(1));
@ -76,7 +59,7 @@ int tolua_factionlist_next(lua_State * L)
static int tolua_faction_get_units(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
unit **unit_ptr = (unit **)lua_newuserdata(L, sizeof(unit *));
luaL_getmetatable(L, TOLUA_CAST "unit");
@ -90,8 +73,8 @@ static int tolua_faction_get_units(lua_State * L)
int tolua_faction_add_item(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *iname = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *iname = tolua_tostring(L, 2, NULL);
int number = (int)tolua_tonumber(L, 3, 0);
int result = -1;
@ -108,35 +91,35 @@ int tolua_faction_add_item(lua_State * L)
static int tolua_faction_get_maxheroes(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, maxheroes(self));
return 1;
}
static int tolua_faction_get_heroes(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, countheroes(self));
return 1;
}
static int tolua_faction_get_score(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushnumber(L, (lua_Number)self->score);
return 1;
}
static int tolua_faction_get_id(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->no);
return 1;
}
static int tolua_faction_set_id(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int id = (int)tolua_tonumber(L, 2, 0);
if (findfaction(id) == NULL) {
renumber_faction(self, id);
@ -150,15 +133,15 @@ static int tolua_faction_set_id(lua_State * L)
static int tolua_faction_get_magic(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushstring(L, magic_school[self->magiegebiet]);
return 1;
}
static int tolua_faction_set_magic(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *type = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *type = tolua_tostring(L, 2, NULL);
int mtype;
for (mtype = 0; mtype != MAXMAGIETYP; ++mtype) {
@ -172,14 +155,14 @@ static int tolua_faction_set_magic(lua_State * L)
static int tolua_faction_get_age(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->age);
return 1;
}
static int tolua_faction_set_age(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int age = (int)tolua_tonumber(L, 2, 0);
self->age = age;
return 0;
@ -187,14 +170,14 @@ static int tolua_faction_set_age(lua_State * L)
static int tolua_faction_get_flags(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->flags);
return 1;
}
static int tolua_faction_set_flags(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int flags = (int)tolua_tonumber(L, 2, self->flags);
self->flags = flags;
return 1;
@ -202,14 +185,14 @@ static int tolua_faction_set_flags(lua_State * L)
static int tolua_faction_get_options(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->options);
return 1;
}
static int tolua_faction_set_options(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int options = (int)tolua_tonumber(L, 2, self->options);
self->options = options;
return 1;
@ -217,14 +200,14 @@ static int tolua_faction_set_options(lua_State * L)
static int tolua_faction_get_lastturn(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->lastorders);
return 1;
}
static int tolua_faction_set_lastturn(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
if (self) {
self->lastorders = (int)tolua_tonumber(L, 2, self->lastorders);
}
@ -233,7 +216,7 @@ static int tolua_faction_set_lastturn(lua_State * L)
static int tolua_faction_renumber(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int no = (int)tolua_tonumber(L, 2, 0);
renumber_faction(self, no);
@ -242,8 +225,8 @@ static int tolua_faction_renumber(lua_State * L)
static int tolua_faction_addnotice(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *str = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *str = tolua_tostring(L, 2, NULL);
addmessage(NULL, self, str, MSG_MESSAGE, ML_IMPORTANT);
return 0;
@ -251,19 +234,22 @@ static int tolua_faction_addnotice(lua_State * L)
static int tolua_faction_getkey(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
int flag = atoi36(name);
lua_pushinteger(L, key_get(self->attribs, flag));
return 1;
int value = key_get(self->attribs, flag);
if (value != 0) {
lua_pushinteger(L, value);
return 1;
}
return 0;
}
static int tolua_faction_setkey(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
int value = (int)tolua_tonumber(L, 3, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
int value = (int)tolua_tonumber(L, 3, 1);
int flag = atoi36(name);
if (value) {
@ -277,7 +263,7 @@ static int tolua_faction_setkey(lua_State * L)
static int tolua_faction_get_messages(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int i = 1;
mlist *ml;
if (!self->msgs) {
@ -293,8 +279,8 @@ static int tolua_faction_get_messages(lua_State * L)
}
static int tolua_faction_count_msg_type(lua_State *L) {
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *str = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *str = tolua_tostring(L, 2, NULL);
int n = 0;
if (self->msgs) {
mlist * ml = self->msgs->begin;
@ -309,53 +295,10 @@ static int tolua_faction_count_msg_type(lua_State *L) {
return 1;
}
static int tolua_faction_get_policy(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *other = (faction *)tolua_tousertype(L, 2, 0);
const char *policy = tolua_tostring(L, 3, 0);
int result = 0, mode;
for (mode = 0; helpmodes[mode].name != NULL; ++mode) {
if (strcmp(policy, helpmodes[mode].name) == 0) {
result = get_alliance(self, other) & mode;
break;
}
}
lua_pushinteger(L, result);
return 1;
}
static int tolua_faction_set_policy(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *other = (faction *)tolua_tousertype(L, 2, 0);
const char *policy = tolua_tostring(L, 3, 0);
int value = tolua_toboolean(L, 4, 0);
int mode;
for (mode = 0; helpmodes[mode].name != NULL; ++mode) {
if (strcmp(policy, helpmodes[mode].name) == 0) {
if (value) {
set_alliance(self, other, get_alliance(self,
other) | helpmodes[mode].status);
}
else {
set_alliance(self, other, get_alliance(self,
other) & ~helpmodes[mode].status);
}
break;
}
}
return 0;
}
static int tolua_faction_normalize(lua_State * L)
{
faction *f = (faction *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 2, 0);
faction *f = (faction *)tolua_tousertype(L, 1, NULL);
region *r = (region *)tolua_tousertype(L, 2, NULL);
if (r) {
plane *pl = rplane(r);
int nx = r->x, ny = r->y;
@ -370,8 +313,8 @@ static int tolua_faction_normalize(lua_State * L)
static int tolua_faction_set_origin(lua_State * L)
{
faction *f = (faction *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 2, 0);
faction *f = (faction *)tolua_tousertype(L, 1, NULL);
region *r = (region *)tolua_tousertype(L, 2, NULL);
plane *pl = rplane(r);
int id = pl ? pl->id : 0;
@ -381,7 +324,7 @@ static int tolua_faction_set_origin(lua_State * L)
static int tolua_faction_get_origin(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
int x = 0, y = 0;
faction_getorigin(self, 0, &x, &y);
@ -392,7 +335,7 @@ static int tolua_faction_get_origin(lua_State * L)
static int tolua_faction_destroy(lua_State * L)
{
faction **fp, *f = (faction *)tolua_tousertype(L, 1, 0);
faction **fp, *f = (faction *)tolua_tousertype(L, 1, NULL);
/* TODO: this loop is slow af, but what can we do? */
for (fp = &factions; *fp; fp = &(*fp)->next) {
if (*fp == f) {
@ -413,9 +356,9 @@ static int tolua_faction_get(lua_State * L)
static int tolua_faction_create(lua_State * L)
{
const char *racename = tolua_tostring(L, 1, 0);
const char *email = tolua_tostring(L, 2, 0);
const char *lang = tolua_tostring(L, 3, 0);
const char *racename = tolua_tostring(L, 1, NULL);
const char *email = tolua_tostring(L, 2, NULL);
const char *lang = tolua_tostring(L, 3, NULL);
struct locale *loc = lang ? get_locale(lang) : default_locale;
faction *f = NULL;
const struct race *frace = rc_find(racename ? racename : "human");
@ -431,44 +374,44 @@ static int tolua_faction_create(lua_State * L)
static int tolua_faction_get_password(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
tolua_pushstring(L, self->_password);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, faction_getpassword(self));
return 1;
}
static int tolua_faction_set_password(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char * passw = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char * passw = tolua_tostring(L, 2, NULL);
faction_setpassword(self, password_hash(passw, PASSWORD_DEFAULT));
return 0;
}
static int tolua_faction_get_email(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, faction_getemail(self));
return 1;
}
static int tolua_faction_set_email(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction_setemail(self, tolua_tostring(L, 2, 0));
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
faction_setemail(self, tolua_tostring(L, 2, NULL));
return 0;
}
static int tolua_faction_get_locale(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, locale_name(self->locale));
return 1;
}
static int tolua_faction_set_locale(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
const struct locale *loc = get_locale(name);
if (loc) {
self->locale = loc;
@ -482,15 +425,15 @@ static int tolua_faction_set_locale(lua_State * L)
static int tolua_faction_get_race(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, self->race->_name);
return 1;
}
static int tolua_faction_set_race(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
const race *rc = rc_find(name);
if (rc != NULL) {
self->race = rc;
@ -501,57 +444,57 @@ static int tolua_faction_set_race(lua_State * L)
static int tolua_faction_get_name(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, faction_getname(self));
return 1;
}
static int tolua_faction_set_name(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction_setname(self, tolua_tostring(L, 2, 0));
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
faction_setname(self, tolua_tostring(L, 2, NULL));
return 0;
}
static int tolua_faction_get_uid(lua_State * L)
{
faction *f = (faction *)tolua_tousertype(L, 1, 0);
faction *f = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, f->uid);
return 1;
}
static int tolua_faction_set_uid(lua_State * L)
{
faction *f = (faction *)tolua_tousertype(L, 1, 0);
faction *f = (faction *)tolua_tousertype(L, 1, NULL);
f->uid = (int)tolua_tonumber(L, 2, 0);
return 0;
}
static int tolua_faction_get_info(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, faction_getbanner(self));
return 1;
}
static int tolua_faction_set_info(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction_setbanner(self, tolua_tostring(L, 2, 0));
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
faction_setbanner(self, tolua_tostring(L, 2, NULL));
return 0;
}
static int tolua_faction_get_alliance(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
tolua_pushusertype(L, f_get_alliance(self), TOLUA_CAST "alliance");
return 1;
}
static int tolua_faction_set_alliance(lua_State * L)
{
struct faction *self = (struct faction *)tolua_tousertype(L, 1, 0);
struct alliance *alli = (struct alliance *) tolua_tousertype(L, 2, 0);
struct faction *self = (struct faction *)tolua_tousertype(L, 1, NULL);
struct alliance *alli = (struct alliance *) tolua_tousertype(L, 2, NULL);
setalliance(self, alli);
@ -560,7 +503,7 @@ static int tolua_faction_set_alliance(lua_State * L)
static int tolua_faction_get_items(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
item **item_ptr = (item **)lua_newuserdata(L, sizeof(item *));
luaL_getmetatable(L, TOLUA_CAST "item");
@ -575,7 +518,7 @@ static int tolua_faction_get_items(lua_State * L)
static int tolua_faction_tostring(lua_State * L)
{
faction *self = (faction *)tolua_tousertype(L, 1, 0);
faction *self = (faction *)tolua_tousertype(L, 1, NULL);
lua_pushstring(L, factionname(self));
return 1;
}
@ -632,8 +575,6 @@ void tolua_faction_open(lua_State * L)
tolua_variable(L, TOLUA_CAST "lastturn", tolua_faction_get_lastturn,
tolua_faction_set_lastturn);
tolua_function(L, TOLUA_CAST "set_policy", tolua_faction_set_policy);
tolua_function(L, TOLUA_CAST "get_policy", tolua_faction_get_policy);
tolua_function(L, TOLUA_CAST "get_origin", tolua_faction_get_origin);
tolua_function(L, TOLUA_CAST "set_origin", tolua_faction_set_origin);
tolua_function(L, TOLUA_CAST "normalize", tolua_faction_normalize);

View file

@ -42,8 +42,8 @@
#include <stdlib.h>
static int tolua_region_count_msg_type(lua_State *L) {
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *str = tolua_tostring(L, 2, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *str = tolua_tostring(L, 2, NULL);
int n = 0;
if (self->msgs) {
mlist * ml = self->msgs->begin;
@ -73,21 +73,21 @@ int tolua_regionlist_next(lua_State * L)
static int tolua_region_get_id(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->uid);
return 1;
}
static int tolua_region_get_blocked(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
lua_pushboolean(L, (self->flags&RF_BLOCKED) != 0);
return 1;
}
static int tolua_region_set_blocked(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
bool flag = !!tolua_toboolean(L, 2, 1);
if (flag) self->flags |= RF_BLOCKED;
else self->flags &= ~RF_BLOCKED;
@ -96,36 +96,36 @@ static int tolua_region_set_blocked(lua_State * L)
static int tolua_region_get_x(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->x);
return 1;
}
static int tolua_region_get_y(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->y);
return 1;
}
static int tolua_region_get_plane(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
tolua_pushusertype(L, rplane(r), TOLUA_CAST "plane");
return 1;
}
static int tolua_region_get_terrain(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, self->terrain->_name);
return 1;
}
static int tolua_region_set_terrain(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
const char *tname = tolua_tostring(L, 2, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
const char *tname = tolua_tostring(L, 2, NULL);
if (tname) {
const terrain_type *terrain = get_terrain(tname);
if (terrain) {
@ -137,7 +137,7 @@ static int tolua_region_set_terrain(lua_State * L)
static int tolua_region_get_terrainname(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
attrib *a = a_find(self->attribs, &at_racename);
if (a) {
tolua_pushstring(L, get_racename(a));
@ -148,8 +148,8 @@ static int tolua_region_get_terrainname(lua_State * L)
static int tolua_region_set_owner(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
struct faction *f = (struct faction *)tolua_tousertype(L, 2, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
struct faction *f = (struct faction *)tolua_tousertype(L, 2, NULL);
if (r) {
region_set_owner(r, f, turn);
}
@ -158,7 +158,7 @@ static int tolua_region_set_owner(lua_State * L)
static int tolua_region_get_owner(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
if (r) {
struct faction *f = region_get_owner(r);
tolua_pushusertype(L, f, TOLUA_CAST "faction");
@ -169,8 +169,8 @@ static int tolua_region_get_owner(lua_State * L)
static int tolua_region_set_terrainname(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
if (name == NULL) {
a_removeall(&self->attribs, &at_racename);
}
@ -182,42 +182,42 @@ static int tolua_region_set_terrainname(lua_State * L)
static int tolua_region_get_info(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, region_getinfo(self));
return 1;
}
static int tolua_region_set_info(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region_setinfo(self, tolua_tostring(L, 2, 0));
region *self = (region *)tolua_tousertype(L, 1, NULL);
region_setinfo(self, tolua_tostring(L, 2, NULL));
return 0;
}
static int tolua_region_get_name(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, region_getname(self));
return 1;
}
static int tolua_region_set_name(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region_setname(self, tolua_tostring(L, 2, 0));
region *self = (region *)tolua_tousertype(L, 1, NULL);
region_setname(self, tolua_tostring(L, 2, NULL));
return 0;
}
static int tolua_region_get_morale(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, region_get_morale(r));
return 1;
}
static int tolua_region_set_morale(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
region_set_morale(r, (int)tolua_tonumber(L, 2, 0), turn);
return 0;
}
@ -225,14 +225,14 @@ static int tolua_region_set_morale(lua_State * L)
/* region mourning this turn */
static int tolua_region_get_is_mourning(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
lua_pushboolean(L, is_mourning(r, turn+1));
return 1;
}
static int tolua_region_get_adj(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
region *rn[MAXDIRECTIONS];
int d, idx;
get_neighbours(r, rn);
@ -249,7 +249,7 @@ static int tolua_region_get_adj(lua_State * L)
static int tolua_region_get_luxury(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
if (r->land) {
const item_type *lux = r_luxury(r);
if (lux) {
@ -263,8 +263,8 @@ static int tolua_region_get_luxury(lua_State * L)
static int tolua_region_set_luxury(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
if (r->land && name) {
const item_type *lux = r_luxury(r);
const item_type *itype = it_find(name);
@ -278,9 +278,9 @@ static int tolua_region_set_luxury(lua_State * L)
static int tolua_region_set_herb(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
if (r->land) {
const char *name = tolua_tostring(L, 2, 0);
const char *name = tolua_tostring(L, 2, NULL);
const item_type *itype = it_find(name);
if (itype && (itype->flags & ITF_HERB)) {
r->land->herbtype = itype;
@ -291,7 +291,7 @@ static int tolua_region_set_herb(lua_State * L)
static int tolua_region_get_herb(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
if (r->land && r->land->herbtype) {
const char *name = r->land->herbtype->rtype->_name;
tolua_pushstring(L, name);
@ -302,7 +302,7 @@ static int tolua_region_get_herb(lua_State * L)
static int tolua_region_get_next(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
direction_t dir = (direction_t)tolua_tonumber(L, 2, 0);
if (dir >= 0 && dir < MAXDIRECTIONS) {
@ -314,7 +314,7 @@ static int tolua_region_get_next(lua_State * L)
static int tolua_region_get_flag(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
int bit = (int)tolua_tonumber(L, 2, 0);
lua_pushboolean(L, (self->flags & (1 << bit)));
@ -323,7 +323,7 @@ static int tolua_region_get_flag(lua_State * L)
static int tolua_region_set_flag(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
int bit = (int)tolua_tonumber(L, 2, 0);
int set = tolua_toboolean(L, 3, 1);
@ -336,8 +336,8 @@ static int tolua_region_set_flag(lua_State * L)
static int tolua_region_get_resourcelevel(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
const char *type = tolua_tostring(L, 2, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
const char *type = tolua_tostring(L, 2, NULL);
const resource_type *rtype = rt_find(type);
if (rtype != NULL) {
const rawmaterial *rm;
@ -372,9 +372,9 @@ static int tolua_region_get_resource(lua_State * L)
const resource_type *rtype;
int result;
r = (region *)tolua_tousertype(L, 1, 0);
r = (region *)tolua_tousertype(L, 1, NULL);
LUA_ASSERT(r != NULL, "invalid parameter");
type = tolua_tostring(L, 2, 0);
type = tolua_tostring(L, 2, NULL);
LUA_ASSERT(type != NULL, "invalid parameter");
result = special_resource(type);
@ -403,8 +403,8 @@ static int tolua_region_get_resource(lua_State * L)
static int tolua_region_set_resource(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
const char *type = tolua_tostring(L, 2, 0);
region *r = (region *)tolua_tousertype(L, 1, NULL);
const char *type = tolua_tostring(L, 2, NULL);
int result, value = (int)tolua_tonumber(L, 3, 0);
const resource_type *rtype;
@ -429,7 +429,7 @@ static int tolua_region_set_resource(lua_State * L)
static int tolua_region_destroy(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
remove_region(&regions, self);
return 0;
}
@ -438,7 +438,7 @@ static int tolua_region_create(lua_State * L)
{
int x = (int)tolua_tonumber(L, 1, 0);
int y = (int)tolua_tonumber(L, 2, 0);
const char *tname = tolua_tostring(L, 3, 0);
const char *tname = tolua_tostring(L, 3, NULL);
if (tname) {
plane *pl = findplane(x, y);
const terrain_type *terrain = get_terrain(tname);
@ -448,7 +448,7 @@ static int tolua_region_create(lua_State * L)
return 0;
}
assert(!pnormalize(&x, &y, pl));
pnormalize(&x, &y, pl);
r = result = findregion(x, y);
if (r != NULL && r->units != NULL) {
@ -471,7 +471,7 @@ static int tolua_region_create(lua_State * L)
static int tolua_region_get_units(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
unit **unit_ptr = (unit **)lua_newuserdata(L, sizeof(unit *));
luaL_getmetatable(L, "unit");
@ -485,7 +485,7 @@ static int tolua_region_get_units(lua_State * L)
static int tolua_region_get_buildings(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
building **building_ptr =
(building **)lua_newuserdata(L, sizeof(building *));
@ -500,7 +500,7 @@ static int tolua_region_get_buildings(lua_State * L)
static int tolua_region_get_ships(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
ship **ship_ptr = (ship **)lua_newuserdata(L, sizeof(ship *));
luaL_getmetatable(L, "ship");
@ -514,7 +514,7 @@ static int tolua_region_get_ships(lua_State * L)
static int tolua_region_get_age(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
if (self) {
lua_pushinteger(L, self->age);
@ -525,7 +525,7 @@ static int tolua_region_get_age(lua_State * L)
static int tolua_region_get_peasants(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
if (self) {
lua_pushinteger(L, self->land ? self->land->peasants : 0);
@ -536,7 +536,7 @@ static int tolua_region_get_peasants(lua_State * L)
static int tolua_region_set_peasants(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
if (self && self->land) {
self->land->peasants = lua_tointeger(L, 2);
@ -546,37 +546,22 @@ static int tolua_region_set_peasants(lua_State * L)
static int tolua_region_getkey(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
int flag = atoi36(name);
lua_pushboolean(L, key_get(self->attribs, flag));
return 1;
}
static int tolua_region_getastral(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, 0);
region *rt = r_standard_to_astral(r);
if (!rt) {
const char *tname = tolua_tostring(L, 2, 0);
plane *pl = get_astralplane();
rt = new_region(real2tp(r->x), real2tp(r->y), pl, 0);
if (tname) {
const terrain_type *terrain = get_terrain(tname);
terraform_region(rt, terrain);
}
int value = key_get(self->attribs, flag);
if (value != 0) {
lua_pushinteger(L, value);
return 1;
}
tolua_pushusertype(L, rt, TOLUA_CAST "region");
return 1;
return 0;
}
static int tolua_region_setkey(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
int value = (int)tolua_tonumber(L, 3, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
int value = (int)tolua_tonumber(L, 3, 1);
int flag = atoi36(name);
if (value) {
@ -588,9 +573,27 @@ static int tolua_region_setkey(lua_State * L)
return 0;
}
static int tolua_region_getastral(lua_State * L)
{
region *r = (region *)tolua_tousertype(L, 1, NULL);
region *rt = r_standard_to_astral(r);
if (!rt) {
const char *tname = tolua_tostring(L, 2, NULL);
plane *pl = get_astralplane();
rt = new_region(real2tp(r->x), real2tp(r->y), pl, 0);
if (tname) {
const terrain_type *terrain = get_terrain(tname);
terraform_region(rt, terrain);
}
}
tolua_pushusertype(L, rt, TOLUA_CAST "region");
return 1;
}
static int tolua_region_tostring(lua_State * L)
{
region *self = (region *)tolua_tousertype(L, 1, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
lua_pushstring(L, regionname(self, NULL));
return 1;
}
@ -606,7 +609,7 @@ static int tolua_plane_get(lua_State * L)
static int tolua_plane_erase(lua_State *L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
remove_plane(self);
return 0;
}
@ -618,7 +621,7 @@ static int tolua_plane_create(lua_State * L)
int y = (int)tolua_tonumber(L, 3, 0);
int width = (int)tolua_tonumber(L, 4, 0);
int height = (int)tolua_tonumber(L, 5, 0);
const char *name = tolua_tostring(L, 6, 0);
const char *name = tolua_tostring(L, 6, NULL);
plane *pl;
pl = create_new_plane(id, name, x, x + width - 1, y, y + height - 1, 0);
@ -629,15 +632,15 @@ static int tolua_plane_create(lua_State * L)
static int tolua_plane_get_name(lua_State * L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
tolua_pushstring(L, self->name);
return 1;
}
static int tolua_plane_set_name(lua_State * L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
const char *str = tolua_tostring(L, 2, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
const char *str = tolua_tostring(L, 2, NULL);
free(self->name);
if (str)
self->name = str_strdup(str);
@ -648,14 +651,14 @@ static int tolua_plane_set_name(lua_State * L)
static int tolua_plane_get_id(lua_State * L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, self->id);
return 1;
}
static int tolua_plane_normalize(lua_State * L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
int x = (int)tolua_tonumber(L, 2, 0);
int y = (int)tolua_tonumber(L, 3, 0);
pnormalize(&x, &y, self);
@ -666,14 +669,14 @@ static int tolua_plane_normalize(lua_State * L)
static int tolua_plane_tostring(lua_State * L)
{
plane *self = (plane *)tolua_tousertype(L, 1, 0);
plane *self = (plane *)tolua_tousertype(L, 1, NULL);
lua_pushstring(L, self->name);
return 1;
}
static int tolua_plane_get_size(lua_State * L)
{
plane *pl = (plane *)tolua_tousertype(L, 1, 0);
plane *pl = (plane *)tolua_tousertype(L, 1, NULL);
lua_pushinteger(L, plane_width(pl));
lua_pushinteger(L, plane_height(pl));
return 2;
@ -698,8 +701,8 @@ static int tolua_distance(lua_State * L)
}
static int tolua_region_get_curse(lua_State *L) {
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
if (self->attribs) {
curse * c = get_curse(self->attribs, ct_find(name));
if (c) {
@ -711,8 +714,8 @@ static int tolua_region_get_curse(lua_State *L) {
}
static int tolua_region_has_attrib(lua_State *L) {
region *self = (region *)tolua_tousertype(L, 1, 0);
const char *name = tolua_tostring(L, 2, 0);
region *self = (region *)tolua_tousertype(L, 1, NULL);
const char *name = tolua_tostring(L, 2, NULL);
attrib * a = a_find(self->attribs, at_find(name));
lua_pushboolean(L, a != NULL);
return 1;

View file

@ -481,7 +481,7 @@ static int tolua_get_region(lua_State * L)
int x = (int)tolua_tonumber(L, 1, 0);
int y = (int)tolua_tonumber(L, 2, 0);
region *r;
assert(!pnormalize(&x, &y, findplane(x, y)));
pnormalize(&x, &y, findplane(x, y));
r = findregion(x, y);
tolua_pushusertype(L, r, TOLUA_CAST "region");
return 1;

View file

@ -799,13 +799,11 @@ void cr_output_unit(stream *out, const faction * f,
}
if (u->faction == f) {
const attrib *a = NULL;
unit *mage;
group * g;
if (fval(u, UFL_GROUP))
a = a_find(u->attribs, &at_group);
if (a != NULL) {
const group *g = (const group *)a->data.v;
g = get_group(u);
if (g) {
stream_printf(out, "%d;gruppe\n", g->gid);
}
mage = get_familiar_mage(u);
@ -1018,20 +1016,38 @@ static void cr_output_unit_compat(FILE * F, const faction * f,
cr_output_unit(&strm, f, u, mode);
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
static void print_ally(const faction *f, faction *af, int status, FILE *F) {
if (af && status > 0) {
fprintf(F, "ALLIANZ %d\n", af->no);
fprintf(F, "\"%s\";Parteiname\n", af->name);
fprintf(F, "%d;Status\n", status & HELP_ALL);
}
}
struct print_ally_s {
const faction *f;
FILE *F;
};
static int print_ally_cb(struct allies *al, faction *af, int status, void *udata) {
struct print_ally_s *data = (struct print_ally_s *)udata;
UNUSED_ARG(al);
if (af && faction_alive(af)) {
int mode = alliance_status(data->f, af, status);
print_ally(data->f, af, mode, data->F);
}
return 0;
}
/* prints allies */
static void show_allies_cr(FILE * F, const faction * f, const ally * sf)
static void show_allies_cr(FILE * F, const faction * f, const group *g)
{
for (; sf; sf = sf->next)
if (sf->faction) {
int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
if (mode != 0 && sf->status > 0) {
fprintf(F, "ALLIANZ %d\n", sf->faction->no);
fprintf(F, "\"%s\";Parteiname\n", sf->faction->name);
fprintf(F, "%d;Status\n", sf->status & HELP_ALL);
}
}
struct print_ally_s data;
data.F = F;
data.f = f;
struct allies *sf = g ? g->allies : f->allies;
allies_walk(sf, print_ally_cb, &data);
}
/* prints allies */
@ -1057,12 +1073,15 @@ static void cr_find_address(FILE * F, const faction * uf, selist * addresses)
while (flist) {
const faction *f = (const faction *)selist_get(flist, i);
if (uf != f) {
const char *str;
fprintf(F, "PARTEI %d\n", f->no);
fprintf(F, "\"%s\";Parteiname\n", f->name);
if (strcmp(faction_getemail(f), "") != 0)
fprintf(F, "\"%s\";email\n", faction_getemail(f));
if (f->banner)
fprintf(F, "\"%s\";banner\n", f->banner);
str = faction_getbanner(f);
if (str) {
fprintf(F, "\"%s\";banner\n", str);
}
fprintf(F, "\"%s\";locale\n", locale_name(f->locale));
if (f->alliance && f->alliance == uf->alliance) {
fprintf(F, "%d;alliance\n", f->alliance->id);
@ -1534,7 +1553,7 @@ report_computer(const char *filename, report_context * ctx, const char *bom)
static int era = -1;
int i;
faction *f = ctx->f;
const char *prefix;
const char *prefix, *str;
region *r;
const char *mailto = config_get("game.email");
const attrib *a;
@ -1628,8 +1647,10 @@ report_computer(const char *filename, report_context * ctx, const char *bom)
fprintf(F, "\"%s\";Parteiname\n", f->name);
fprintf(F, "\"%s\";email\n", faction_getemail(f));
if (f->banner)
fprintf(F, "\"%s\";banner\n", f->banner);
str = faction_getbanner(f);
if (str) {
fprintf(F, "\"%s\";banner\n", str);
}
print_items(F, f->items, f->locale);
fputs("OPTIONEN\n", F);
for (i = 0; i != MAXOPTIONS; ++i) {
@ -1641,7 +1662,7 @@ report_computer(const char *filename, report_context * ctx, const char *bom)
f->options &= (~flag);
}
}
show_allies_cr(F, f, f->allies);
show_allies_cr(F, f, NULL);
{
group *g;
for (g = f->groups; g; g = g->next) {
@ -1654,7 +1675,7 @@ report_computer(const char *filename, report_context * ctx, const char *bom)
fprintf(F, "\"%s\";typprefix\n",
translate(prefix, LOC(f->locale, prefix)));
}
show_allies_cr(F, f, g->allies);
show_allies_cr(F, f, g);
}
}

View file

@ -227,7 +227,6 @@ static void test_cr_factionstealth(CuTest *tc) {
faction *f1, *f2;
region *r;
unit *u;
ally *al;
test_setup();
f1 = test_create_faction(NULL);
@ -298,8 +297,7 @@ static void test_cr_factionstealth(CuTest *tc) {
mstream_done(&strm);
/* we see the same thing as them when we are an ally */
al = ally_add(&f1->allies, f2);
al->status = HELP_FSTEALTH;
ally_set(&f1->allies, f2, HELP_FSTEALTH);
mstream_init(&strm);
cr_output_unit(&strm, f2, u, seen_unit);
CuAssertIntEquals(tc, f1->no, cr_get_int(&strm, ";Partei", -1));

View file

@ -145,6 +145,7 @@ static struct unit *create_recruiter(void) {
static void setup_production(void) {
init_resources();
mt_create_feedback("error_cannotmake");
mt_create_va(mt_new("produce", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "resource:resource", MT_NEW_END);
mt_create_va(mt_new("income", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "mode:int", MT_NEW_END);
mt_create_va(mt_new("buy", NULL), "unit:unit", "money:int", MT_NEW_END);
@ -738,6 +739,7 @@ static void test_loot(CuTest *tc) {
test_setup();
setup_production();
mt_create_error(48); /* unit is unarmed */
it_silver = test_create_silver();
config_set("rules.enable_loot", "1");
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
@ -747,7 +749,7 @@ static void test_loot(CuTest *tc) {
test_clear_messages(f);
arm_unit(u);
produce(u->region);
CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "income")); /* unit is unarmed */
CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "income"));
CuAssertIntEquals(tc, 2 * TAXFRACTION, i_get(u->items, it_silver));
CuAssertIntEquals(tc, UFL_LONGACTION | UFL_NOTMOVING, fval(u, UFL_LONGACTION | UFL_NOTMOVING));
test_teardown();

View file

@ -3,6 +3,7 @@
#include "kernel/building.h"
#include "kernel/calendar.h"
#include "kernel/database.h"
#include "kernel/config.h"
#include "kernel/curse.h"
#include "kernel/equipment.h"
@ -27,7 +28,6 @@
#include "creport.h"
#include "report.h"
#include "names.h"
#include "orderdb.h"
#include "reports.h"
#include "spells.h"
#include "vortex.h"
@ -54,12 +54,12 @@ void game_done(void)
free_locales();
#endif
kernel_done();
orderdb_close();
swapdb_close();
}
void game_init(void)
{
orderdb_open();
swapdb_open();
errno = 0;
kernel_init();
register_triggers();

View file

@ -20,7 +20,9 @@ int gamedb_update(void)
err = db_driver_open(DB_GAME, dbname);
if (err == 0) {
for (f = factions; f; f = f->next) {
int uid = db_driver_faction_save(f->uid, f->no, turn, f->email, f->_password);
int uid = db_driver_faction_save(f->uid, f->no, turn,
faction_getemail(f),
faction_getpassword(f));
if (uid > 0) {
f->uid = uid;
}

View file

@ -44,8 +44,7 @@ static void setup_give(struct give *env) {
env->itype = it_get_or_create(rt_get_or_create("money"));
env->itype->flags |= ITF_HERB;
if (env->f2) {
ally * al = ally_add(&env->f2->allies, env->f1);
al->status = HELP_GIVE;
ally_set(&env->f2->allies, env->f1, HELP_GIVE);
env->dst = test_create_unit(env->f2, env->r);
}
else {
@ -66,11 +65,14 @@ static void setup_give(struct give *env) {
mt_create_va(mt_new("give", NULL), "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END);
mt_create_va(mt_new("give_peasants", NULL), "unit:unit", "resource:resource", "amount:int", MT_NEW_END);
/* error messages: */
mt_create_error(129);
mt_create_error(96);
mt_create_error(10);
mt_create_feedback("feedback_give_forbidden");
mt_create_feedback("peasants_give_invalid");
mt_create_va(mt_new("too_many_units_in_faction", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END);
mt_create_va(mt_new("too_many_units_in_alliance", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END);
mt_create_va(mt_new("feedback_no_contact", NULL), "unit:unit", "region:region", "command:order", "target:unit", MT_NEW_END);
mt_create_va(mt_new("feedback_give_forbidden", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END);
mt_create_va(mt_new("peasants_give_invalid", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END);
mt_create_va(mt_new("giverestriction", NULL), "unit:unit", "region:region", "command:order", "turns:int", MT_NEW_END);
mt_create_va(mt_new("error_unit_size", NULL), "unit:unit", "region:region", "command:order", "maxsize:int", MT_NEW_END);
mt_create_va(mt_new("nogive_reserved", NULL), "unit:unit", "region:region", "command:order", "resource:resource", "reservation:int", MT_NEW_END);
@ -160,11 +162,12 @@ static void test_give_men_magicians(CuTest * tc) {
message * msg;
test_setup_ex(tc);
mt_create_error(158);
env.f2 = env.f1 = test_create_faction(NULL);
setup_give(&env);
set_level(env.src, SK_MAGIC, 1);
CuAssertPtrNotNull(tc, msg = give_men(1, env.src, env.dst, NULL));
CuAssertStrEquals(tc, "error158", (const char *)msg->parameters[3].v);
CuAssertStrEquals(tc, "error158", test_get_messagetype(msg));
CuAssertIntEquals(tc, 1, env.dst->number);
CuAssertIntEquals(tc, 1, env.src->number);
msg_release(msg);

View file

@ -178,7 +178,7 @@ static bool lua_equipunit(unit *u, const char *eqname, int mask) {
lua_pop(L, 1);
}
else {
result = (bool)lua_toboolean(L, -1);
result = lua_toboolean(L, -1) != 0;
lua_pop(L, 1);
}
}

View file

@ -18,7 +18,6 @@ static void test_manacrystal(CuTest *tc) {
unit *u;
test_setup();
test_inject_messagetypes();
u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0));
itype = test_create_itemtype("manacrystal");
@ -49,7 +48,6 @@ static void test_skillpotion(CuTest *tc) {
int initialWeeks_Magic = 0;
test_setup();
test_inject_messagetypes();
u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0));
itype = test_create_itemtype("skillpotion");
change_resource(u, itype->rtype, 2);

View file

@ -58,6 +58,7 @@ command.c
config.c
connection.c
curse.c
database.c
equipment.c
event.c
faction.c

View file

@ -8,7 +8,6 @@
#include "group.h"
#include "faction.h"
#include "objtypes.h"
#include "plane.h"
#include <kernel/attrib.h>
#include <util/strings.h>
@ -20,61 +19,146 @@
#include <string.h>
#include <stdlib.h>
void read_allies(gamedata * data, faction *f)
{
ally **sfp = &f->allies;
for (;;) {
int aid;
READ_INT(data->store, &aid);
if (aid > 0) {
ally * al = ally_add(sfp, NULL);
int state;
if ((al->faction = findfaction(aid)) == NULL) {
ur_add(RESOLVE_FACTION | aid, (void **)&al->faction, NULL);
}
READ_INT(data->store, &state);
al->status = state & HELP_ALL;
sfp = &al->next;
}
else {
break;
}
}
#define BLOCKSIZE 15
typedef struct allies {
struct allies *next;
int num;
struct faction *factions[BLOCKSIZE];
int status[BLOCKSIZE];
} allies;
static void block_insert(allies *al, struct faction *f, int status) {
int i = al->num++;
al->status[i] = status;
al->factions[i] = f;
/* TODO: heapify */
}
ally * ally_find(ally *al, const struct faction *f) {
for (; al; al = al->next) {
if (al->faction == f) return al;
static int block_search(allies *al, const struct faction *f) {
int i;
/* TODO: binary search */
for (i = 0; i != al->num; ++i) {
if (al->factions[i] == f) {
return i;
}
}
return BLOCKSIZE;
}
int allies_walk(struct allies *all, cb_allies_walk callback, void *udata)
{
allies *al;
for (al = all; al; al = al->next) {
int i;
for (i = 0; i != al->num; ++i) {
int e = callback(all, al->factions[i], al->status[i], udata);
if (e != 0) {
return e;
}
}
}
return 0;
}
ally * ally_add(ally **al_p, struct faction *f) {
ally * al;
while (*al_p) {
al = *al_p;
if (f && al->faction == f) return al;
al_p = &al->next;
int ally_get(allies *al, const struct faction *f)
{
for (; al; al = al->next) {
int i = block_search(al, f);
if (i != BLOCKSIZE) {
return al->status[i];
}
}
al = (ally *)calloc(1, sizeof(ally));
al->faction = f;
*al_p = al;
return al;
return 0;
}
void ally_remove(ally **al_p, struct faction *f) {
ally * al;
while (*al_p) {
al = *al_p;
if (al->faction == f) {
*al_p = al->next;
free(al);
void ally_set(allies **p_al, struct faction *f, int status)
{
while (*p_al) {
allies *al = *p_al;
int i = block_search(al, f);
if (i != BLOCKSIZE) {
if (status == 0) {
if (--al->num != i) {
al->factions[i] = al->factions[al->num];
al->status[i] = al->status[al->num];
/* TODO: repair heap up or down */
}
else if (al->num == 0) {
*p_al = al->next;
free(al);
return;
}
}
else {
al->status[i] = status;
}
return;
}
if (al->num < BLOCKSIZE) {
block_insert(al, f, status);
return;
}
p_al = &al->next;
}
*p_al = calloc(1, sizeof(allies));
block_insert(*p_al, f, status);
}
void write_allies(gamedata * data, const allies *alist)
{
const allies *al;
for (al = alist; al; al = al->next) {
int i;
for (i = 0; i != al->num; ++i) {
const faction * f = al->factions[i];
if (f && f->_alive) {
write_faction_reference(f, data->store);
WRITE_INT(data->store, al->status[i]);
}
}
}
write_faction_reference(NULL, data->store);
}
void read_allies(gamedata * data, allies **p_al)
{
for (;;) {
faction *f;
int aid, status;
READ_INT(data->store, &aid);
/* TODO: deal with unresolved factions, somehow */
if (aid <= 0) {
break;
}
al_p = &al->next;
f = findfaction(aid);
if (!f) f = faction_create(aid);
READ_INT(data->store, &status);
ally_set(p_al, f, status);
}
}
void allies_free(allies *al)
{
while (al) {
allies * an = al->next;
free(al);
al = an;
}
}
allies *allies_clone(const allies *al) {
allies *al_clone = NULL, **al_end = &al_clone;
for (; al; al = al->next) {
allies *al_new = calloc(1, sizeof(allies));
memcpy(al_new, al, sizeof(allies));
*al_end = al_new;
al_end = &al_new->next;
}
*al_end = NULL;
return al_clone;
}
static int ally_flag(const char *s, int help_mask)
{
if ((help_mask & HELP_MONEY) && strcmp(s, "money") == 0)
@ -114,26 +198,14 @@ int AllianceAuto(void)
}
static int
autoalliance(const plane * pl, const faction * sf, const faction * f2)
autoalliance(const faction * sf, const faction * f2)
{
if (pl && (pl->flags & PFL_FRIENDLY))
return HELP_ALL;
if (f_get_alliance(sf) != NULL && AllianceAuto()) {
if (sf->alliance == f2->alliance)
return AllianceAuto();
if (sf->alliance == f2->alliance) {
return AllianceAuto();
}
return 0;
}
static int ally_mode(const ally * sf, int mode)
{
if (sf == NULL)
return 0;
return sf->status & mode;
}
static void init_npcfaction(variant *var)
{
var->i = 1;
@ -158,12 +230,13 @@ attrib_type at_npcfaction = {
*/
int HelpMask(void)
{
static int config, rule = 0;
static int config, rule;
if (config_changed(&config)) {
const char *str = config_get("rules.help.mask");
if (str != NULL) {
char *sstr = str_strdup(str);
char *tok = strtok(sstr, " ");
rule = 0;
while (tok) {
rule |= ally_flag(tok, -1);
tok = strtok(NULL, " ");
@ -179,71 +252,79 @@ int HelpMask(void)
static int AllianceRestricted(void)
{
const char *str = config_get("alliance.restricted");
int rule = 0;
if (str != NULL) {
char *sstr = str_strdup(str);
char *tok = strtok(sstr, " ");
while (tok) {
rule |= ally_flag(tok, -1);
tok = strtok(NULL, " ");
static int config, rule;
if (config_changed(&config)) {
const char *str = config_get("alliance.restricted");
rule = 0;
if (str != NULL) {
char *sstr = str_strdup(str);
char *tok = strtok(sstr, " ");
while (tok) {
rule |= ally_flag(tok, -1);
tok = strtok(NULL, " ");
}
free(sstr);
}
free(sstr);
rule &= HelpMask();
}
rule &= HelpMask();
return rule;
}
int alliance_status(const faction *f, const faction *f2, int status) {
status |= autoalliance(f, f2);
if (status > 0) {
int mask = AllianceRestricted();
if (mask) {
if (a_find(f->attribs, &at_npcfaction)) {
return status;
}
if (a_find(f2->attribs, &at_npcfaction)) {
return status;
}
if (f->alliance != f2->alliance) {
status &= ~mask;
}
}
}
return status;
}
int
alliedgroup(const struct plane *pl, const struct faction *f,
const struct faction *f2, const struct ally *sf, int mode)
alliedgroup(const struct faction *f,
const struct faction *f2, const struct group *g, int mask)
{
allies *all = g ? g->allies : f->allies;
int status;
if (!(faction_alive(f) && faction_alive(f2))) {
return 0;
}
while (sf && sf->faction != f2) {
sf = sf->next;
}
if (sf == NULL) {
mode = mode & autoalliance(pl, f, f2);
}
mode = ally_mode(sf, mode) | (mode & autoalliance(pl, f, f2));
if (AllianceRestricted()) {
if (a_find(f->attribs, &at_npcfaction)) {
return mode;
}
if (a_find(f2->attribs, &at_npcfaction)) {
return mode;
}
if (f->alliance != f2->alliance) {
mode &= ~AllianceRestricted();
}
}
return mode;
status = ally_get(all, f2) & mask;
return alliance_status(f, f2, status);
}
int
alliedfaction(const struct plane *pl, const struct faction *f,
const struct faction *f2, int mode)
alliedfaction(const struct faction *f, const struct faction *f2, int mask)
{
return alliedgroup(pl, f, f2, f->allies, mode);
return alliedgroup(f, f2, NULL, mask);
}
/* Die Gruppe von Einheit u hat helfe zu f2 gesetzt. */
int alliedunit(const unit * u, const faction * f2, int mode)
int alliedunit(const unit * u, const faction * f2, int mask)
{
int automode;
assert(u);
assert(f2);
assert(u->region); /* the unit should be in a region, but it's possible that u->number==0 (TEMP units) */
if (u->faction == f2)
return mode;
if (u->faction == f2) {
return mask;
}
if (!faction_alive(f2)) {
return 0;
}
if (u->faction != NULL && f2 != NULL) {
ally *sf;
plane *pl;
group *g;
if (mode & HELP_FIGHT) {
if (mask & HELP_FIGHT) {
if ((u->flags & UFL_DEFENDER) || (u->faction->flags & FFL_DEFENDER)) {
faction *owner = region_get_owner(u->region);
/* helps the owner of the region */
@ -253,19 +334,11 @@ int alliedunit(const unit * u, const faction * f2, int mode)
}
}
pl = rplane(u->region);
automode = mode & autoalliance(pl, u->faction, f2);
if (pl != NULL && (pl->flags & PFL_NOALLIANCES))
mode = (mode & automode) | (mode & HELP_GIVE);
sf = u->faction->allies;
if (fval(u, UFL_GROUP)) {
const attrib *a = a_find(u->attribs, &at_group);
if (a != NULL)
sf = ((group *)a->data.v)->allies;
g = get_group(u);
if (g) {
return alliedgroup(u->faction, f2, g, mask);
}
return alliedgroup(pl, u->faction, f2, sf, mode);
return alliedfaction(u->faction, f2, mask);
}
return 0;
}

View file

@ -23,33 +23,35 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern "C" {
#endif
struct attrib_type;
struct plane;
struct faction;
struct gamedata;
struct unit;
struct attrib_type;
struct faction;
struct group;
struct gamedata;
struct unit;
struct allies;
extern struct attrib_type at_npcfaction;
extern struct attrib_type at_npcfaction;
typedef struct ally {
struct ally *next;
struct faction *faction;
int status;
} ally;
int ally_get(struct allies *al, const struct faction *f);
void ally_set(struct allies **p_al, struct faction *f, int status);
void write_allies(struct gamedata * data, const struct allies *alist);
void read_allies(struct gamedata * data, struct allies **sfp);
typedef int (*cb_allies_walk)(struct allies *, struct faction *, int, void *);
int allies_walk(struct allies *allies, cb_allies_walk callback, void *udata);
struct allies *allies_clone(const struct allies *al);
void read_allies(struct gamedata * data, struct faction *f);
ally * ally_find(ally *al, const struct faction *f);
ally * ally_add(ally **al_p, struct faction *f);
void ally_remove(ally **al_p, struct faction *f);
void allies_free(struct allies *al);
int AllianceAuto(void); /* flags that allied factions get automatically */
int HelpMask(void); /* flags restricted to allied factions */
int alliedunit(const struct unit *u, const struct faction *f2,
int mode);
int alliedfaction(const struct plane *pl, const struct faction *f,
const struct faction *f2, int mode);
int alliedgroup(const struct plane *pl, const struct faction *f,
const struct faction *f2, const struct ally *sf, int mode);
int mask);
int alliedfaction(const struct faction *f, const struct faction *f2,
int mask);
int alliedgroup(const struct faction *f, const struct faction *f2,
const struct group *g, int mask);
int alliance_status(const struct faction *f, const struct faction *f2, int status);
#ifdef __cplusplus
}

View file

@ -5,39 +5,47 @@
#include <CuTest.h>
#include <tests.h>
static void test_ally(CuTest * tc)
static void test_allies_clone(CuTest * tc)
{
ally * al = 0;
struct faction * f1 = test_create_faction(NULL);
struct allies * al = NULL, *ac;
struct faction * f;
ally_add(&al, f1);
CuAssertPtrNotNull(tc, al);
CuAssertPtrEquals(tc, f1, ally_find(al, f1)->faction);
ally_remove(&al, f1);
CuAssertPtrEquals(tc, NULL, al);
CuAssertPtrEquals(tc, NULL, ally_find(al, f1));
test_setup();
f = test_create_faction(NULL);
CuAssertPtrEquals(tc, NULL, allies_clone(NULL));
ally_set(&al, f, HELP_GUARD);
ac = allies_clone(al);
CuAssertPtrNotNull(tc, ac);
CuAssertTrue(tc, al != ac);
CuAssertIntEquals(tc, HELP_GUARD, ally_get(ac, f));
CuAssertIntEquals(tc, HELP_GUARD, ally_get(al, f));
allies_free(al);
allies_free(ac);
test_teardown();
}
static void test_ally_null(CuTest * tc)
{
ally *a1 = 0, *a2 = 0;
static void test_allies(CuTest *tc) {
struct allies * al = NULL;
struct faction * f;
a1 = ally_add(&a1, 0);
a2 = ally_add(&a1, 0);
CuAssertPtrNotNull(tc, a1);
CuAssertPtrNotNull(tc, a2);
CuAssertPtrEquals(tc, a2, a1->next);
CuAssertPtrEquals(tc, NULL, a2->next);
free(a1);
free(a2);
test_setup();
f = test_create_faction(NULL);
CuAssertIntEquals(tc, 0, ally_get(al, f));
ally_set(&al, f, 42);
CuAssertIntEquals(tc, 42, ally_get(al, f));
ally_set(&al, f, 0);
CuAssertIntEquals(tc, 0, ally_get(al, f));
CuAssertPtrEquals(tc, NULL, al);
test_teardown();
}
CuSuite *get_ally_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_ally);
SUITE_ADD_TEST(suite, test_ally_null);
SUITE_ADD_TEST(suite, test_allies);
SUITE_ADD_TEST(suite, test_allies_clone);
return suite;
}

View file

@ -500,6 +500,28 @@ static int count_materials(unit *u, const construction *type, int n, int complet
return n;
}
int build_skill(unit *u, int basesk, int skill_mod) {
int effsk, skills;
int dm = get_effect(u, oldpotiontype[P_DOMORE]);
effsk = basesk + skill_mod;
assert(effsk >= 0);
skills = effsk * u->number;
/* technically, nimblefinge and domore should be in a global set of
* "game"-attributes, (as at_skillmod) but for a while, we're leaving
* them in here. */
if (dm != 0) {
/* Auswirkung Schaffenstrunk */
if (dm > u->number) dm = u->number;
change_effect(u, oldpotiontype[P_DOMORE], -dm);
skills += dm * effsk;
}
return skills;
}
/** Use up resources for building an object.
* Build up to 'size' points of 'type', where 'completed'
* of the first object have already been finished. return the
@ -521,28 +543,11 @@ int build(unit * u, const construction * ctype, int completed, int want, int ski
return ECOMPLETE;
}
if (con->skill != NOSKILL) {
int effsk;
int dm = get_effect(u, oldpotiontype[P_DOMORE]);
basesk = effskill(u, con->skill, 0);
if (basesk == 0)
return ENEEDSKILL;
effsk = basesk + skill_mod;
assert(effsk >= 0);
skills = effsk * u->number;
/* technically, nimblefinge and domore should be in a global set of
* "game"-attributes, (as at_skillmod) but for a while, we're leaving
* them in here. */
if (dm != 0) {
/* Auswirkung Schaffenstrunk */
if (dm > u->number) dm = u->number;
change_effect(u, oldpotiontype[P_DOMORE], -dm);
skills += dm * effsk;
}
skills = build_skill(u, basesk, skill_mod);
}
for (; want > 0 && skills > 0;) {
int err, n;

View file

@ -36,7 +36,6 @@ typedef struct build_fixture {
static unit * setup_build(build_fixture *bf) {
test_setup();
test_inject_messagetypes();
init_resources();
test_create_itemtype("stone");
@ -312,7 +311,6 @@ static void test_build_destroy_road_guard(CuTest *tc)
order *ord;
test_setup();
test_inject_messagetypes();
test_create_region(1, 0, 0);
r = test_create_region(0, 0, NULL);
rsetroad(r, D_EAST, 100);
@ -345,7 +343,6 @@ static void test_build_destroy_road_limit(CuTest *tc)
order *ord;
test_setup();
test_inject_messagetypes();
test_create_region(1, 0, 0);
r = test_create_region(0, 0, NULL);
rsetroad(r, D_EAST, 100);
@ -370,6 +367,7 @@ static void test_build_destroy_cmd(CuTest *tc) {
faction *f;
test_setup();
mt_create_error(138);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
u->thisorder = create_order(K_DESTROY, f->locale, NULL);
CuAssertIntEquals(tc, 138, destroy_cmd(u, u->thisorder));

View file

@ -359,15 +359,14 @@ void resolve_building(building *b)
resolve(RESOLVE_BUILDING | b->no, b);
}
int read_building_reference(gamedata * data, building **bp, resolve_fun fun)
int read_building_reference(gamedata * data, building **bp)
{
int id;
READ_INT(data->store, &id);
if (id > 0) {
*bp = findbuilding(id);
if (*bp == NULL) {
*bp = NULL;
ur_add(RESOLVE_BUILDING | id, (void**)bp, fun);
*bp = building_create(id);
}
}
else {
@ -376,17 +375,23 @@ int read_building_reference(gamedata * data, building **bp, resolve_fun fun)
return id;
}
building *building_create(int id)
{
building *b = (building *)calloc(1, sizeof(building));
b->no = id;
bhash(b);
return b;
}
building *new_building(const struct building_type * btype, region * r,
const struct locale * lang)
{
building **bptr = &r->buildings;
building *b = (building *)calloc(1, sizeof(building));
int id = newcontainerid();
building *b = building_create(id);
const char *bname;
char buffer[32];
b->no = newcontainerid();
bhash(b);
b->type = btype;
b->region = r;
while (*bptr)

View file

@ -127,8 +127,9 @@ extern "C" {
const char *write_buildingname(const building * b, char *ibuf,
size_t size);
int buildingcapacity(const struct building *b);
struct building *building_create(int id);
struct building *new_building(const struct building_type *typ,
struct region *r, const struct locale *lang);
struct region *r, const struct locale *lang);
int build_building(struct unit *u, const struct building_type *typ,
int id, int size, struct order *ord);
bool building_finished(const struct building *b);
@ -166,7 +167,7 @@ extern "C" {
void resolve_building(building *b);
void write_building_reference(const struct building *b,
struct storage *store);
int read_building_reference(struct gamedata * data, struct building **bp, resolve_fun fun);
int read_building_reference(struct gamedata * data, struct building **bp);
struct building *findbuilding(int n);

View file

@ -263,7 +263,7 @@ bool b_blocknone(const connection * b, const unit * u, const region * r)
bool b_rvisible(const connection * b, const region * r)
{
return (bool)(b->to == r || b->from == r);
return (b->to == r || b->from == r);
}
bool b_fvisible(const connection * b, const struct faction * f,
@ -412,7 +412,7 @@ b_blockfogwall(const connection * b, const unit * u, const region * r)
UNUSED_ARG(b);
if (!u)
return true;
return (bool)(effskill(u, SK_PERCEPTION, r) > 4); /* Das ist die alte Nebelwand */
return (effskill(u, SK_PERCEPTION, r) > 4); /* Das ist die alte Nebelwand */
}
/** Legacy type used in old Eressea games, no longer in use. */

View file

@ -229,7 +229,7 @@ int curse_read(variant *var, void *owner, gamedata *data)
READ_INT(store, &c->data.i);
}
if (c->type->typ == CURSETYP_REGION) {
int rr = read_region_reference(data, (region **)&c->data.v, NULL);
int rr = read_region_reference(data, (region **)&c->data.v);
if (ur == 0 && rr == 0 && !c->data.v) {
return AT_READ_FAIL;
}

View file

@ -51,7 +51,6 @@ typedef struct {
static void setup_curse(curse_fixture *fix, const char *name) {
test_setup();
test_inject_messagetypes();
fix->r = test_create_region(0, 0, NULL);
fix->u = test_create_unit(test_create_faction(NULL), fix->r);
fix->c = create_curse(fix->u, &fix->r->attribs, ct_find(name), 1.0, 1, 1.0, 0);

29
src/kernel/database.c Normal file
View file

@ -0,0 +1,29 @@
#include "config.h"
#include "database.h"
#include "db/driver.h"
void swapdb_open(void)
{
const char *dbname;
dbname = config_get("game.dbswap");
db_driver_open(DB_SWAP, dbname);
}
void swapdb_close(void)
{
db_driver_close(DB_SWAP);
}
dbrow_id db_string_save(const char *s) {
(void)s;
return 0;
}
dbrow_id dbstring_save(const char *s) {
return db_driver_string_save(s);
}
const char *dbstring_load(dbrow_id id, size_t *size) {
return db_driver_string_load(id, size);
}

11
src/kernel/database.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
#include "db/driver.h"
#include <stddef.h>
void swapdb_open(void);
void swapdb_close(void);
dbrow_id dbstring_save(const char *s);
const char *dbstring_load(dbrow_id id, size_t *size);

View file

@ -3,8 +3,8 @@
#include <kernel/faction.h>
#include <kernel/order.h>
#include "database.h"
#include "db/driver.h"
#include "orderdb.h"
#include <CuTest.h>
#include <tests.h>
@ -12,6 +12,17 @@
#include <stdio.h>
#include <string.h>
static void test_orderdb(CuTest *tc) {
order_data *od = NULL;
const char * s = "GIB enno 1 Hodor";
odata_create(&od, strlen(s) + 1, s);
CuAssertPtrNotNull(tc, od);
CuAssertStrEquals(tc, s, od->_str);
CuAssertTrue(tc, od->_refcount >= 1);
odata_release(od);
}
static void test_save_load_order(CuTest *tc) {
order_data *od;
int id;
@ -39,11 +50,17 @@ static void test_update_faction(CuTest *tc) {
int uid;
test_setup();
db_driver_open(DB_GAME, NULL);
f = test_create_faction(NULL);
uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password);
uid = db_driver_faction_save(f->uid, f->no, 0,
faction_getemail(f),
faction_getpassword(f));
f->uid = uid;
uid = db_driver_faction_save(f->uid, f->no, 0, f->email, f->_password);
uid = db_driver_faction_save(f->uid, f->no, 0,
faction_getemail(f),
faction_getpassword(f));
CuAssertIntEquals(tc, f->uid, uid);
db_driver_close(DB_GAME);
test_teardown();
}
@ -52,6 +69,7 @@ CuSuite *get_db_suite(void)
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_save_load_order);
SUITE_ADD_TEST(suite, test_update_faction);
SUITE_ADD_TEST(suite, test_orderdb);
return suite;
}

View file

@ -4,6 +4,8 @@
struct order_data;
typedef unsigned int dbrow_id;
extern void odata_create(struct order_data **pdata, size_t len, const char *str);
typedef enum database_t {
@ -13,6 +15,8 @@ typedef enum database_t {
int db_driver_open(database_t db, const char *dbname);
void db_driver_close(database_t db);
int db_driver_order_save(const char *str);
struct order_data *db_driver_order_load(int id);
int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password);
dbrow_id db_driver_order_save(const char *str);
struct order_data *db_driver_order_load(dbrow_id id);
dbrow_id db_driver_faction_save(dbrow_id id, int no, int turn, const char *email, const char *password);
dbrow_id db_driver_string_save(const char *s);
const char *db_driver_string_load(dbrow_id id, size_t *size);

View file

@ -9,56 +9,60 @@
#include <sqlite3.h>
#include <assert.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static sqlite3 *g_game_db;
static sqlite3 *g_temp_db;
static sqlite3 *g_swap_db;
static sqlite3_stmt * g_stmt_insert_string;
static sqlite3_stmt * g_stmt_select_string;
static sqlite3_stmt * g_stmt_insert_order;
static sqlite3_stmt * g_stmt_select_order;
static sqlite3_stmt * g_stmt_update_faction;
static sqlite3_stmt * g_stmt_insert_faction;
static int g_order_batchsize;
static int g_order_tx_size;
static int g_insert_batchsize;
static int g_insert_tx_size;
struct order_data *db_driver_order_load(int id)
static void end_transaction(void) {
if (g_insert_tx_size > 0) {
int err;
g_insert_tx_size = 0;
err = sqlite3_exec(g_swap_db, "COMMIT", NULL, NULL, NULL);
assert(err == SQLITE_OK);
}
}
struct order_data *db_driver_order_load(dbrow_id id)
{
struct order_data * od = NULL;
int err;
ERRNO_CHECK();
if (g_order_tx_size > 0) {
g_order_tx_size = 0;
err = sqlite3_exec(g_temp_db, "COMMIT", NULL, NULL, NULL);
assert(err == SQLITE_OK);
}
end_transaction();
err = sqlite3_reset(g_stmt_select_order);
assert(err == SQLITE_OK);
err = sqlite3_bind_int(g_stmt_select_order, 1, id);
assert(err == SQLITE_OK);
do {
err = sqlite3_step(g_stmt_select_order);
if (err == SQLITE_ROW) {
const unsigned char *text;
int bytes;
bytes = sqlite3_column_bytes(g_stmt_select_order, 0);
assert(bytes > 0);
text = sqlite3_column_text(g_stmt_select_order, 0);
odata_create(&od, 1+(size_t)bytes, (const char *)text);
ERRNO_CHECK();
return od;
}
} while (err == SQLITE_ROW);
assert(err == SQLITE_DONE);
err = sqlite3_step(g_stmt_select_order);
if (err == SQLITE_ROW) {
const unsigned char *text;
int bytes;
text = sqlite3_column_text(g_stmt_select_order, 0);
bytes = sqlite3_column_bytes(g_stmt_select_order, 0);
assert(bytes > 0);
odata_create(&od, 1+(size_t)bytes, (const char *)text);
ERRNO_CHECK();
return od;
}
ERRNO_CHECK();
return NULL;
}
int db_driver_order_save(const char *str)
{
dbrow_id db_driver_order_save(const char *str) {
int err;
sqlite3_int64 id;
@ -66,9 +70,9 @@ int db_driver_order_save(const char *str)
ERRNO_CHECK();
if (g_order_batchsize > 0) {
if (g_order_tx_size == 0) {
err = sqlite3_exec(g_temp_db, "BEGIN TRANSACTION", NULL, NULL, NULL);
if (g_insert_batchsize > 0) {
if (g_insert_tx_size == 0) {
err = sqlite3_exec(g_swap_db, "BEGIN TRANSACTION", NULL, NULL, NULL);
assert(err == SQLITE_OK);
}
}
@ -79,29 +83,25 @@ int db_driver_order_save(const char *str)
assert(err == SQLITE_OK);
err = sqlite3_step(g_stmt_insert_order);
assert(err == SQLITE_DONE);
id = sqlite3_last_insert_rowid(g_temp_db);
assert(id <= INT_MAX);
id = sqlite3_last_insert_rowid(g_swap_db);
assert(id > 0 && id <= UINT_MAX);
if (g_order_batchsize > 0) {
if (++g_order_tx_size >= g_order_batchsize) {
err = sqlite3_exec(g_temp_db, "COMMIT", NULL, NULL, NULL);
assert(err == SQLITE_OK);
g_order_tx_size = 0;
if (g_insert_batchsize > 0) {
if (++g_insert_tx_size >= g_insert_batchsize) {
end_transaction();
}
}
ERRNO_CHECK();
return (int)id;
return (dbrow_id)id;
}
int db_driver_faction_save(int id, int no, int turn, const char *email, const char *password)
dbrow_id db_driver_faction_save(dbrow_id id, int no, int turn, const char *email, const char *password)
{
sqlite3_int64 row_id;
int err;
if (!g_game_db) {
return -1;
}
assert(g_game_db);
if (id != 0) {
int rows;
@ -139,8 +139,8 @@ int db_driver_faction_save(int id, int no, int turn, const char *email, const ch
ERRNO_CHECK();
row_id = sqlite3_last_insert_rowid(g_game_db);
assert(row_id <= INT_MAX);
return (int)row_id;
assert(row_id>0 && row_id <= UINT_MAX);
return (dbrow_id)row_id;
}
static int db_open_game(const char *dbname) {
@ -162,19 +162,25 @@ static int db_open_game(const char *dbname) {
static int db_open_swap(const char *dbname) {
int err;
g_order_batchsize = config_get_int("game.dbbatch", 100);
g_insert_batchsize = config_get_int("game.dbbatch", 100);
err = sqlite3_open(dbname, &g_temp_db);
err = sqlite3_open(dbname, &g_swap_db);
assert(err == SQLITE_OK);
err = sqlite3_exec(g_temp_db, "PRAGMA journal_mode=OFF", NULL, NULL, NULL);
err = sqlite3_exec(g_swap_db, "PRAGMA journal_mode=OFF", NULL, NULL, NULL);
assert(err == SQLITE_OK);
err = sqlite3_exec(g_temp_db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
err = sqlite3_exec(g_swap_db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
assert(err == SQLITE_OK);
err = sqlite3_exec(g_temp_db, "CREATE TABLE IF NOT EXISTS orders (id INTEGER PRIMARY KEY, data TEXT NOT NULL)", NULL, NULL, NULL);
err = sqlite3_exec(g_swap_db, "CREATE TABLE IF NOT EXISTS orders (id INTEGER PRIMARY KEY, data TEXT NOT NULL)", NULL, NULL, NULL);
assert(err == SQLITE_OK);
err = sqlite3_prepare_v2(g_temp_db, "INSERT INTO orders (data) VALUES (?)", -1, &g_stmt_insert_order, NULL);
err = sqlite3_exec(g_swap_db, "CREATE TABLE IF NOT EXISTS strings (id INTEGER PRIMARY KEY, data TEXT NOT NULL)", NULL, NULL, NULL);
assert(err == SQLITE_OK);
err = sqlite3_prepare_v2(g_temp_db, "SELECT data FROM orders WHERE id=?", -1, &g_stmt_select_order, NULL);
err = sqlite3_prepare_v2(g_swap_db, "INSERT INTO strings (data) VALUES (?)", -1, &g_stmt_insert_string, NULL);
assert(err == SQLITE_OK);
err = sqlite3_prepare_v2(g_swap_db, "SELECT data FROM strings WHERE id=?", -1, &g_stmt_select_string, NULL);
assert(err == SQLITE_OK);
err = sqlite3_prepare_v2(g_swap_db, "INSERT INTO orders (data) VALUES (?)", -1, &g_stmt_insert_order, NULL);
assert(err == SQLITE_OK);
err = sqlite3_prepare_v2(g_swap_db, "SELECT data FROM orders WHERE id=?", -1, &g_stmt_select_order, NULL);
assert(err == SQLITE_OK);
ERRNO_CHECK();
return 0;
@ -185,7 +191,11 @@ static const char *g_swapname;
int db_driver_open(database_t db, const char *dbname)
{
ERRNO_CHECK();
if (!dbname) {
/* by default, use an in-memory database */
dbname = ":memory:";
}
if (db == DB_SWAP) {
g_swapname = dbname;
return db_open_swap(dbname);
@ -202,18 +212,26 @@ void db_driver_close(database_t db)
ERRNO_CHECK();
if (db == DB_SWAP) {
assert(g_temp_db);
assert(g_swap_db);
err = sqlite3_finalize(g_stmt_select_string);
assert(err == SQLITE_OK);
err = sqlite3_finalize(g_stmt_insert_string);
assert(err == SQLITE_OK);
err = sqlite3_finalize(g_stmt_select_order);
assert(err == SQLITE_OK);
err = sqlite3_finalize(g_stmt_insert_order);
assert(err == SQLITE_OK);
err = sqlite3_close(g_temp_db);
err = sqlite3_close(g_swap_db);
assert(err == SQLITE_OK);
if (g_swapname) {
FILE * F = fopen(g_swapname, "r");
if (F) {
fclose(F);
remove(g_swapname);
if (0 != remove(g_swapname)) {
log_error("could not remove %s: %s", g_swapname,
strerror(errno));
errno = 0;
}
}
}
}
@ -229,3 +247,59 @@ void db_driver_close(database_t db)
ERRNO_CHECK();
}
dbrow_id db_driver_string_save(const char *str) {
int err;
sqlite3_int64 id;
assert(str);
ERRNO_CHECK();
if (g_insert_batchsize > 0) {
if (g_insert_tx_size == 0) {
err = sqlite3_exec(g_swap_db, "BEGIN TRANSACTION", NULL, NULL, NULL);
assert(err == SQLITE_OK);
}
}
err = sqlite3_reset(g_stmt_insert_string);
assert(err == SQLITE_OK);
err = sqlite3_bind_text(g_stmt_insert_string, 1, str, -1, SQLITE_STATIC);
assert(err == SQLITE_OK);
err = sqlite3_step(g_stmt_insert_string);
assert(err == SQLITE_DONE);
id = sqlite3_last_insert_rowid(g_swap_db);
assert(id > 0 && id <= UINT_MAX);
if (g_insert_batchsize > 0) {
if (++g_insert_tx_size >= g_insert_batchsize) {
end_transaction();
}
}
ERRNO_CHECK();
return (dbrow_id)id;
}
const char *db_driver_string_load(dbrow_id id, size_t *size) {
int err;
end_transaction();
err = sqlite3_reset(g_stmt_select_string);
assert(err == SQLITE_OK);
err = sqlite3_bind_int(g_stmt_select_string, 1, id);
assert(err == SQLITE_OK);
err = sqlite3_step(g_stmt_select_string);
if (err == SQLITE_ROW) {
const unsigned char *text;
text = sqlite3_column_text(g_stmt_select_string, 0);
if (size) {
int bytes = sqlite3_column_bytes(g_stmt_select_string, 0);
assert(bytes > 0);
*size = (size_t)bytes;
}
ERRNO_CHECK();
return (const char *)text;
}
ERRNO_CHECK();
return NULL;
}

View file

@ -22,6 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "calendar.h"
#include "config.h"
#include "database.h"
#include "alliance.h"
#include "ally.h"
#include "curse.h"
@ -53,7 +54,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/parser.h>
#include <util/password.h>
#include <util/path.h>
#include <util/resolve.h>
#include <util/rng.h>
#include <util/strings.h>
#include <util/variant.h>
@ -105,8 +105,6 @@ static void free_faction(faction * f)
freelist(f->allies);
free(f->email);
free(f->banner);
free(f->_password);
free(f->name);
if (f->seen_factions) {
selist_free(f->seen_factions);
@ -245,7 +243,7 @@ faction *addfaction(const char *email, const char *password,
f->alliance_joindate = turn;
f->lastorders = turn;
f->_alive = true;
f->_password = NULL;
f->password_id = 0;
f->age = 0;
f->race = frace;
f->magiegebiet = 0;
@ -321,29 +319,25 @@ unit *addplayer(region * r, faction * f)
bool checkpasswd(const faction * f, const char *passwd)
{
const char *pwhash;
if (!passwd) return false;
if (f->_password && password_verify(f->_password, passwd) == VERIFY_FAIL) {
pwhash = faction_getpassword(f);
if (pwhash && password_verify(pwhash, passwd) == VERIFY_FAIL) {
log_info("password check failed: %s", factionname(f));
return false;
}
return true;
}
void resolve_faction(faction *f)
{
resolve(RESOLVE_FACTION | f->no, f);
}
int read_faction_reference(gamedata * data, faction **fp, resolve_fun fun)
int read_faction_reference(gamedata * data, faction **fp)
{
int id;
READ_INT(data->store, &id);
if (id > 0) {
*fp = findfaction(id);
if (*fp == NULL) {
*fp = NULL;
ur_add(RESOLVE_FACTION | id, (void **)fp, fun);
*fp = faction_create(id);
}
}
else {
@ -495,7 +489,7 @@ void destroyfaction(faction ** fp)
handle_event(f->attribs, "destroy", f);
if (f->alliance) {
setalliance(f, 0);
setalliance(f, NULL);
}
funhash(f);
@ -517,35 +511,6 @@ void destroyfaction(faction ** fp)
}
}
int get_alliance(const faction * a, const faction * b)
{
const ally *sf = a->allies;
for (; sf != NULL; sf = sf->next) {
if (sf->faction == b) {
return sf->status;
}
}
return 0;
}
void set_alliance(faction * a, faction * b, int status)
{
ally **sfp;
sfp = &a->allies;
while (*sfp) {
ally *sf = *sfp;
if (sf->faction == b)
break;
sfp = &sf->next;
}
if (*sfp == NULL) {
ally *sf = ally_add(sfp, b);
sf->status = status;
return;
}
(*sfp)->status |= status;
}
void renumber_faction(faction * f, int no)
{
funhash(f);
@ -591,23 +556,30 @@ void faction_setemail(faction * self, const char *email)
self->email = NULL;
}
const char *faction_getbanner(const faction * self)
const char *faction_getbanner(const faction * f)
{
return self->banner ? self->banner : "";
if (f->banner_id > 0) {
return dbstring_load(f->banner_id, NULL);
}
return NULL;
}
void faction_setbanner(faction * self, const char *banner)
void faction_setbanner(faction * f, const char *banner)
{
free(self->banner);
if (banner)
self->banner = str_strdup(banner);
f->banner_id = dbstring_save(banner);
}
const char *faction_getpassword(const faction *f) {
if (f->password_id > 0) {
return dbstring_load(f->password_id, NULL);
}
return NULL;
}
void faction_setpassword(faction * f, const char *pwhash)
{
assert(pwhash);
free(f->_password);
f->_password = str_strdup(pwhash);
f->password_id = dbstring_save(pwhash);
}
bool valid_race(const struct faction *f, const struct race *rc)
@ -844,7 +816,8 @@ int writepasswd(void)
for (f = factions; f; f = f->next) {
fprintf(F, "%s:%s:%s:%d\n",
itoa36(f->no), faction_getemail(f), f->_password, f->uid);
itoa36(f->no), faction_getemail(f),
faction_getpassword(f), f->uid);
}
fclose(F);
return 0;
@ -877,3 +850,11 @@ void free_factions(void) {
free_flist(&factions);
free_flist(&dead_factions);
}
faction *faction_create(int no)
{
faction *f = (faction *)calloc(1, sizeof(faction));
f->no = no;
fhash(f);
return f;
}

View file

@ -21,6 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "skill.h"
#include "types.h"
#include "db/driver.h"
#include <util/resolve.h>
#include <modules/score.h>
@ -70,9 +71,9 @@ extern "C" {
int uid;
int flags;
char *name;
char *banner;
dbrow_id banner_id;
char *email;
char *_password;
dbrow_id password_id;
int max_spelllevel;
struct spellbook *spellbook;
const struct locale *locale;
@ -85,7 +86,7 @@ extern "C" {
int num_people; /* Anzahl Personen ohne Monster */
int num_units;
int options;
struct ally *allies; /* alliedgroup and others should check sf.faction.alive before using a faction from f.allies */
struct allies *allies; /* alliedgroup and others should check sf.faction.alive before using a faction from f.allies */
struct group *groups; /* alliedgroup and others should check sf.faction.alive before using a faction from f.groups */
score_t score;
struct alliance *alliance;
@ -110,6 +111,8 @@ extern "C" {
void fhash(struct faction *f);
void funhash(struct faction *f);
int faction_ally_status(const faction *f, const faction *f2);
struct faction *findfaction(int n);
int max_magicians(const faction * f);
void set_show_item(faction * f, const struct item_type *itype);
@ -124,18 +127,13 @@ extern "C" {
void destroyfaction(faction ** f);
bool faction_alive(const struct faction *f);
void set_alliance(struct faction *a, struct faction *b, int status);
int get_alliance(const struct faction *a, const struct faction *b);
struct faction *faction_create(int no);
struct alliance *f_get_alliance(const struct faction *f);
void write_faction_reference(const struct faction *f,
struct storage *store);
int read_faction_reference(struct gamedata *data, struct faction **fp, resolve_fun fun);
#define RESOLVE_FACTION (TYP_FACTION << 24)
void resolve_faction(struct faction *f);
int read_faction_reference(struct gamedata *data, struct faction **fp);
void renumber_faction(faction * f, int no);
void free_factions(void);
@ -154,6 +152,7 @@ extern "C" {
void faction_setemail(struct faction *self, const char *email);
void faction_setpassword(struct faction *self, const char *pwhash);
const char *faction_getpassword(const struct faction *f);
bool valid_race(const struct faction *f, const struct race *rc);
void faction_getorigin(const struct faction * f, int id, int *x, int *y);

View file

@ -29,20 +29,18 @@
static void test_destroyfaction_allies(CuTest *tc) {
faction *f1, *f2;
region *r;
ally *al;
test_setup();
r = test_create_region(0, 0, NULL);
f1 = test_create_faction(NULL);
test_create_unit(f1, r);
f2 = test_create_faction(NULL);
al = ally_add(&f1->allies, f2);
al->status = HELP_FIGHT;
CuAssertIntEquals(tc, HELP_FIGHT, alliedgroup(0, f1, f2, f1->allies, HELP_ALL));
ally_set(&f1->allies, f2, HELP_FIGHT);
CuAssertIntEquals(tc, HELP_FIGHT, alliedfaction(f1, f2, HELP_ALL));
CuAssertPtrEquals(tc, f2, f1->next);
destroyfaction(&f1->next);
CuAssertIntEquals(tc, false, faction_alive(f2));
CuAssertIntEquals(tc, 0, alliedgroup(0, f1, f2, f1->allies, HELP_ALL));
CuAssertIntEquals(tc, 0, alliedfaction(f1, f2, HELP_ALL));
test_teardown();
}
@ -117,7 +115,7 @@ static void test_addfaction(CuTest *tc) {
CuAssertPtrNotNull(tc, f->name);
CuAssertPtrEquals(tc, NULL, (void *)f->units);
CuAssertPtrEquals(tc, NULL, (void *)f->next);
CuAssertPtrEquals(tc, NULL, (void *)f->banner);
CuAssertPtrEquals(tc, NULL, (void *)faction_getbanner(f));
CuAssertPtrEquals(tc, NULL, (void *)f->spellbook);
CuAssertPtrEquals(tc, NULL, (void *)f->origin);
CuAssertPtrEquals(tc, (void *)factions, (void *)f);
@ -229,6 +227,18 @@ static void test_valid_race(CuTest *tc) {
test_teardown();
}
static void test_dbstrings(CuTest *tc) {
const char *lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
faction *f;
test_setup();
f = test_create_faction(NULL);
faction_setbanner(f, lipsum);
faction_setpassword(f, lipsum + 12);
CuAssertStrEquals(tc, lipsum, faction_getbanner(f));
CuAssertStrEquals(tc, lipsum + 12, faction_getpassword(f));
test_teardown();
}
static void test_set_email(CuTest *tc) {
faction *f;
char email[10];
@ -335,6 +345,7 @@ CuSuite *get_faction_suite(void)
SUITE_ADD_TEST(suite, test_check_passwd);
SUITE_ADD_TEST(suite, test_valid_race);
SUITE_ADD_TEST(suite, test_set_email);
SUITE_ADD_TEST(suite, test_dbstrings);
SUITE_ADD_TEST(suite, test_save_special_items);
return suite;
}

View file

@ -53,7 +53,7 @@ group *new_group(faction * f, const char *name, int gid)
{
group **gp = &f->groups;
int index = gid % GMAXHASH;
group *g = calloc(sizeof(group), 1);
group *g = calloc(1, sizeof(group));
while (*gp)
gp = &(*gp)->next;
@ -69,15 +69,7 @@ group *new_group(faction * f, const char *name, int gid)
static void init_group(faction * f, group * g)
{
ally *a, **an;
an = &g->allies;
for (a = f->allies; a; a = a->next)
if (a->faction) {
ally *ga = ally_add(an, a->faction);
ga->status = a->status;
an = &ga->next;
}
g->allies = allies_clone(f->allies);
}
static group *find_groupbyname(group * g, const char *name)
@ -139,11 +131,7 @@ void free_group(group * g)
if (g->attribs) {
a_removeall(&g->attribs, NULL);
}
while (g->allies) {
ally *a = g->allies;
g->allies = a->next;
free(a);
}
allies_free(g->allies);
free(g->name);
free(g);
}
@ -204,20 +192,14 @@ group *join_group(unit * u, const char *name)
return g;
}
void write_groups(struct storage *store, const faction * f)
void write_groups(struct gamedata *data, const faction * f)
{
group *g;
storage *store = data->store;
for (g = f->groups; g; g = g->next) {
ally *a;
WRITE_INT(store, g->gid);
WRITE_STR(store, g->name);
for (a = g->allies; a; a = a->next) {
if (a->faction && a->faction->_alive) {
write_faction_reference(a->faction, store);
WRITE_INT(store, a->status);
}
}
write_faction_reference(NULL, store);
write_allies(data, g->allies);
a_write(store, g->attribs, g);
WRITE_SECTION(store);
}
@ -228,7 +210,6 @@ void read_groups(gamedata *data, faction * f)
{
struct storage *store = data->store;
for (;;) {
ally **pa;
group *g;
int gid;
char buf[1024];
@ -238,19 +219,7 @@ void read_groups(gamedata *data, faction * f)
break;
READ_STR(store, buf, sizeof(buf));
g = new_group(f, buf, gid);
pa = &g->allies;
for (;;) {
ally *al;
int id;
READ_INT(store, &id);
if (id == 0) break;
al = ally_add(pa, NULL);
al->faction = findfaction(id);
if (!al->faction) {
ur_add(RESOLVE_FACTION | id, (void **)&al->faction, NULL);
}
READ_INT(store, &al->status);
}
read_allies(data, &g->allies);
read_attribs(data, &g->attribs, g);
}
}

View file

@ -30,7 +30,7 @@ extern "C" {
struct faction *f;
struct attrib *attribs;
char *name;
struct ally *allies;
struct allies *allies;
int gid;
int members;
} group;
@ -42,7 +42,7 @@ extern "C" {
extern void free_group(struct group *g);
struct group *new_group(struct faction * f, const char *name, int gid);
extern void write_groups(struct storage *data, const struct faction *f);
extern void write_groups(struct gamedata *data, const struct faction *f);
extern void read_groups(struct gamedata *data, struct faction *f);
#ifdef __cplusplus

View file

@ -28,7 +28,6 @@ static void test_group_readwrite_dead_faction(CuTest *tc) {
faction *f, *f2;
unit * u;
group *g;
ally *al;
int fno;
test_setup();
@ -42,8 +41,8 @@ static void test_group_readwrite_dead_faction(CuTest *tc) {
CuAssertPtrNotNull(tc, u);
g = join_group(u, "group");
CuAssertPtrNotNull(tc, g);
al = ally_add(&g->allies, f);
CuAssertPtrNotNull(tc, al);
ally_set(&g->allies, f, HELP_GIVE);
CuAssertPtrNotNull(tc, g->allies);
CuAssertPtrEquals(tc, f, factions);
destroyfaction(&factions);
@ -73,7 +72,6 @@ static void test_group_readwrite(CuTest * tc)
{
faction * f;
group *g;
ally *al;
int i;
gamedata data;
storage store;
@ -85,9 +83,8 @@ static void test_group_readwrite(CuTest * tc)
new_group(f, "NW", 42);
g = new_group(f, "Egoisten", 43);
key_set(&g->attribs, 44, 44);
al = ally_add(&g->allies, f);
al->status = HELP_GIVE;
write_groups(&store, f);
ally_set(&g->allies, f, HELP_GIVE);
write_groups(&data, f);
WRITE_INT(&store, 47);
free_group(f->groups);
@ -110,9 +107,7 @@ static void test_group_readwrite(CuTest * tc)
g = f->groups->next;
CuAssertIntEquals(tc, 44, key_get(g->attribs, 44));
CuAssertPtrNotNull(tc, g->allies);
CuAssertPtrEquals(tc, NULL, g->allies->next);
CuAssertPtrEquals(tc, f, g->allies->faction);
CuAssertIntEquals(tc, HELP_GIVE, g->allies->status);
CuAssertIntEquals(tc, HELP_GIVE, ally_get(g->allies, f));
test_teardown();
}

View file

@ -67,6 +67,46 @@ variant v)
}
}
static int missing_message_mode;
void message_handle_missing(int mode) {
missing_message_mode = mode;
}
static message *missing_feedback(const char *name, const struct unit *u,
const struct region *r, struct order *ord)
{
if (missing_message_mode == MESSAGE_MISSING_ERROR) {
log_error("trying to create undefined feedback of type \"%s\"\n", name);
}
else if (missing_message_mode == MESSAGE_MISSING_REPLACE) {
if (strcmp(name, "missing_feedback") != 0) {
if (!mt_find("missing_feedback")) {
mt_create_va(mt_new("missing_feedback", NULL), "unit:unit",
"region:region", "command:order", "name:string", MT_NEW_END);
}
return msg_message("missing_feedback", "unit region command name", u, r, ord, name);
}
}
return NULL;
}
static message *missing_message(const char *name) {
if (missing_message_mode == MESSAGE_MISSING_ERROR) {
log_error("trying to create undefined message of type \"%s\"\n", name);
}
else if (missing_message_mode == MESSAGE_MISSING_REPLACE) {
log_warning("trying to create undefined message of type \"%s\"\n", name);
if (strcmp(name, "missing_message") != 0) {
if (!mt_find("missing_message")) {
mt_create_va(mt_new("missing_message", NULL), "name:string", MT_NEW_END);
}
return msg_message("missing_message", "name", name);
}
}
return NULL;
}
struct message *msg_feedback(const struct unit *u, struct order *ord,
const char *name, const char *sig, ...)
{
@ -80,13 +120,7 @@ struct message *msg_feedback(const struct unit *u, struct order *ord,
}
if (!mtype) {
log_warning("trying to create message of unknown type \"%s\"\n", name);
if (!mt_find("missing_feedback")) {
mt_create_va(mt_new("missing_feedback", NULL), "unit:unit",
"region:region", "command:order", "name:string", MT_NEW_END);
}
return msg_message("missing_feedback", "name unit region command",
name, u, u->region, ord);
return missing_feedback(name, u, u->region, ord);
}
var.v = (void *)u;
@ -139,28 +173,6 @@ struct message *msg_feedback(const struct unit *u, struct order *ord,
return msg_create(mtype, args);
}
static int missing_message_mode;
void message_handle_missing(int mode) {
missing_message_mode = mode;
}
static message *missing_message(const char *name) {
if (missing_message_mode == MESSAGE_MISSING_ERROR) {
log_error("trying to create undefined message of type \"%s\"\n", name);
}
else if (missing_message_mode == MESSAGE_MISSING_REPLACE) {
log_warning("trying to create undefined message of type \"%s\"\n", name);
if (strcmp(name, "missing_message") != 0) {
if (!mt_find("missing_message")) {
mt_create_va(mt_new("missing_message", NULL), "name:string", MT_NEW_END);
}
return msg_message("missing_message", "name", name);
}
}
return NULL;
}
message *msg_message(const char *name, const char *sig, ...)
/* msg_message("oops_error", "unit region command", u, r, cmd) */
{

View file

@ -18,6 +18,21 @@ void test_missing_message(CuTest *tc) {
CuAssertPtrNotNull(tc, msg);
CuAssertPtrNotNull(tc, msg->type);
CuAssertStrEquals(tc, msg->type->name, "missing_message");
CuAssertStrEquals(tc, "unknown", (const char *)msg->parameters[0].v);
msg_release(msg);
test_teardown();
}
void test_missing_feedback(CuTest *tc) {
message *msg;
test_setup();
message_handle_missing(MESSAGE_MISSING_REPLACE);
msg = msg_error(NULL, NULL, 77);
CuAssertPtrNotNull(tc, msg);
CuAssertPtrNotNull(tc, msg->type);
CuAssertStrEquals(tc, msg->type->name, "missing_feedback");
CuAssertStrEquals(tc, "error77", (const char *)msg->parameters[3].v);
msg_release(msg);
test_teardown();
}

View file

@ -14,6 +14,8 @@
#include <kernel/config.h>
#include "order.h"
#include "db/driver.h"
#include "skill.h"
#include <util/base36.h>
@ -36,6 +38,22 @@
# define ORD_KEYWORD(ord) (keyword_t)((ord)->command & 0xFFFF)
# define OD_STRING(odata) ((odata) ? (odata)->_str : NULL)
order_data *odata_load(int id)
{
if (id > 0) {
return db_driver_order_load(id);
}
return NULL;
}
int odata_save(order_data *od)
{
if (od->_str) {
return db_driver_order_save(od->_str);
}
return 0;
}
void odata_create(order_data **pdata, size_t len, const char *str)
{
order_data *data;
@ -372,7 +390,7 @@ order *parse_order(const char *s, const struct locale * lang)
sptr = sp;
p = parse_token(&sp, token, sizeof(token));
sk = get_skill(p, lang);
if (!expensive_skill(sk)) {
if (sk == NOSKILL || !expensive_skill(sk)) {
kwd = K_AUTOSTUDY;
}
}

View file

@ -1,43 +0,0 @@
#include <platform.h>
#include "kernel/config.h"
#include "kernel/db/driver.h"
#include "orderdb.h"
#include <util/log.h>
#include <critbit.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
void orderdb_open(void)
{
const char *dbname;
dbname = config_get("game.dbswap");
db_driver_open(DB_SWAP, dbname);
}
void orderdb_close(void)
{
db_driver_close(DB_SWAP);
}
order_data *odata_load(int id)
{
if (id > 0) {
return db_driver_order_load(id);
}
return NULL;
}
int odata_save(order_data *od)
{
if (od->_str) {
return db_driver_order_save(od->_str);
}
return 0;
}

View file

@ -1,16 +0,0 @@
#ifndef H_ORDERDB
#define H_ORDERDB
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
void orderdb_open(void);
void orderdb_close(void);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -28,10 +28,10 @@ extern "C" {
struct plane;
struct storage;
#define PFL_NOCOORDS 1 /* not in use */
#define PFL_NORECRUITS 2
#define PFL_NOALLIANCES 4
#define PFL_LOWSTEALING 8
#define PFL_NOCOORDS 1 /* not implemented */
#define PFL_NORECRUITS 2 /* cannot recruit */
#define PFL_NOALLIANCES 4 /* not implemented */
#define PFL_LOWSTEALING 8 /* not implemented */
#define PFL_NOGIVE 16 /* Übergaben sind unmöglich */
#define PFL_NOATTACK 32 /* Angriffe und Diebstähle sind unmöglich */
#define PFL_NOTERRAIN 64 /* Terraintyp wird nicht angezeigt TODO? */
@ -40,7 +40,7 @@ extern "C" {
#define PFL_NOTEACH 512 /* Lehre außer Betrieb */
#define PFL_NOBUILD 1024 /* Bauen außer Betrieb */
#define PFL_NOFEED 2048 /* Kein Unterhalt nötig */
#define PFL_FRIENDLY 4096 /* everyone is your ally */
#define PFL_FRIENDLY 4096 /* not implemented */
#define PFL_NOORCGROWTH 8192 /* orcs don't grow */
#define PFL_NOMONSTERS 16384 /* no monster randenc */

View file

@ -47,7 +47,6 @@ void test_pool(CuTest *tc) {
faction *f;
region *r;
struct resource_type *rtype;
ally *al;
test_setup();
test_create_world();
@ -74,10 +73,9 @@ void test_pool(CuTest *tc) {
CuAssertIntEquals(tc, 100, get_pooled(u1, rtype, GET_POOLED_SLACK, INT_MAX));
CuAssertIntEquals(tc, 200, get_pooled(u1, rtype, GET_POOLED_SLACK | GET_POOLED_RESERVE, INT_MAX));
al = ally_add(&u3->faction->allies, f);
al->status = HELP_GUARD;
ally_set(&u3->faction->allies, f, HELP_GUARD);
CuAssertIntEquals(tc, 0, get_pooled(u1, rtype, GET_ALLIED_SLACK | GET_ALLIED_RESERVE, INT_MAX));
al->status = HELP_MONEY;
ally_set(&u3->faction->allies, f, HELP_MONEY);
CuAssertIntEquals(tc, 200, get_pooled(u1, rtype, GET_ALLIED_SLACK, INT_MAX));
CuAssertIntEquals(tc, 200, get_pooled(u1, rtype, GET_ALLIED_RESERVE, INT_MAX));
CuAssertIntEquals(tc, 400, get_pooled(u1, rtype, GET_ALLIED_SLACK | GET_ALLIED_RESERVE, INT_MAX));
@ -117,7 +115,6 @@ void test_pool_use(CuTest *tc) {
faction *f;
region *r;
struct item_type *itype;
ally *al;
test_setup();
test_create_world();
@ -135,8 +132,7 @@ void test_pool_use(CuTest *tc) {
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;
ally_set(&u3->faction->allies, f, HELP_MONEY);
CuAssertIntEquals(tc, 10, use_pooled(u1, itype->rtype, GET_SLACK, 10));
CuAssertIntEquals(tc, 40, use_pooled(u1, itype->rtype, GET_SLACK, 50));

View file

@ -79,10 +79,10 @@ const char *racenames[MAXRACES] = {
"clone"
};
#define MAXOPTIONS 4
#define MAX_OPTIONS 4
typedef struct rcoption {
unsigned char key[MAXOPTIONS];
variant value[MAXOPTIONS];
unsigned char key[MAX_OPTIONS];
variant value[MAX_OPTIONS];
} rcoption;
enum {
@ -106,7 +106,7 @@ static void rc_setoption(race *rc, int k, const char *value) {
v = rc->options->value;
} else {
int i;
for (i=0;!v && i < MAXOPTIONS;++i) {
for (i=0;!v && i < MAX_OPTIONS;++i) {
if (rc->options->key[i]==key) {
v = rc->options->value+i;
break;
@ -114,7 +114,7 @@ static void rc_setoption(race *rc, int k, const char *value) {
if (rc->options->key[i]==RCO_NONE) {
v = rc->options->value+i;
rc->options->key[i] = key;
if (i+1 < MAXOPTIONS) {
if (i+1 < MAX_OPTIONS) {
rc->options->key[i+1]=RCO_NONE;
}
break;
@ -145,7 +145,7 @@ static void rc_setoption(race *rc, int k, const char *value) {
static variant *rc_getoption(const race *rc, int key) {
if (rc->options) {
int i;
for (i=0;i!=MAXOPTIONS && rc->options->key[i]!=RCO_NONE;++i) {
for (i=0;i!=MAX_OPTIONS && rc->options->key[i]!=RCO_NONE;++i) {
if (rc->options->key[i]==key) {
return rc->options->value+i;
}
@ -269,7 +269,7 @@ void free_races(void) {
rcoption * opt = races->options;
if (opt) {
for (i=0;i!=MAXOPTIONS && opt->key[i]!=RCO_NONE;++i) {
for (i=0;i!=MAX_OPTIONS && opt->key[i]!=RCO_NONE;++i) {
if (opt->key[i]==RCO_HUNGER) {
free(opt->value[i].v);
}
@ -531,14 +531,9 @@ const char *rc_name_s(const race * rc, name_t n)
const char *raceprefix(const unit * u)
{
attrib *asource = u->faction->attribs;
if (fval(u, UFL_GROUP)) {
attrib *agroup = a_find(u->attribs, &at_group);
if (agroup != NULL)
asource = ((const group *)(agroup->data.v))->attribs;
}
return get_prefix(asource);
group *g = get_group(u);
attrib *attr = g ? g->attribs : u->faction->attribs;
return get_prefix(attr);
}
const char *racename(const struct locale *loc, const unit * u, const race * rc)

View file

@ -242,7 +242,7 @@ static void unhash_uid(region * r)
uidhash[key].r = NULL;
}
static void hash_uid(region * r)
static void rhash_uid(region * r)
{
int uid = r->uid;
for (;;) {
@ -268,7 +268,7 @@ static int hash_requests;
static int hash_misses;
#endif
bool pnormalize(int *x, int *y, const plane * pl)
void pnormalize(int *x, int *y, const plane * pl)
{
if (pl) {
if (x) {
@ -284,7 +284,6 @@ bool pnormalize(int *x, int *y, const plane * pl)
*y = ny % height + pl->miny;
}
}
return false; /* TBD */
}
static region *rfindhash(int x, int y)
@ -343,8 +342,9 @@ region *r_connect(const region * r, direction_t dir)
int x, y;
region *rmodify = (region *)r;
assert(dir >= 0 && dir < MAXDIRECTIONS);
if (r->connect[dir])
if (r->connect[dir]) {
return r->connect[dir];
}
assert(dir < MAXDIRECTIONS);
x = r->x + delta_x[dir];
y = r->y + delta_y[dir];
@ -757,39 +757,41 @@ int rsettrees(const region * r, int ageclass, int value)
return 0;
}
static region *last;
region *region_create(int uid)
{
region *r = (region *)calloc(1, sizeof(region));
assert_alloc(r);
r->uid = uid;
rhash_uid(r);
return r;
}
static unsigned int max_index = 0;
static region *last;
static unsigned int max_index;
void add_region(region *r, int x, int y) {
r->x = x;
r->y = y;
r->_plane = findplane(x, y);
rhash(r);
if (last) {
addlist(&last, r);
}
else {
addlist(&regions, r);
}
last = r;
assert(r->next == NULL);
r->index = ++max_index;
}
region *new_region(int x, int y, struct plane *pl, int uid)
{
region *r;
pnormalize(&x, &y, pl);
r = rfindhash(x, y);
if (r) {
log_error("duplicate region discovered: %s(%d,%d)\n", regionname(r, NULL), x, y);
if (r->units)
log_error("duplicate region contains units\n");
return r;
}
r = (region *)calloc(sizeof(region), 1);
assert_alloc(r);
r->x = x;
r->y = y;
r->uid = uid;
r = region_create(uid);
r->age = 1;
r->_plane = pl;
rhash(r);
hash_uid(r);
if (last)
addlist(&last, r);
else
addlist(&regions, r);
last = r;
assert(r->next == NULL);
r->index = ++max_index;
add_region(r, x, y);
assert(pl == r->_plane);
return r;
}
@ -1263,7 +1265,7 @@ void resolve_region(region *r)
resolve(RESOLVE_REGION | r->uid, r);
}
int read_region_reference(gamedata * data, region **rp, resolve_fun fun)
int read_region_reference(gamedata * data, region **rp)
{
struct storage * store = data->store;
int id = 0;
@ -1271,7 +1273,7 @@ int read_region_reference(gamedata * data, region **rp, resolve_fun fun)
READ_INT(store, &id);
*rp = findregionbyid(id);
if (*rp == NULL) {
ur_add(RESOLVE_REGION | id, (void **)rp, fun);
*rp = region_create(id);
}
return id;
}

View file

@ -225,11 +225,13 @@ extern "C" {
const char *write_regionname(const struct region *r, const struct faction *f,
char *buffer, size_t size);
struct region *region_create(int uid);
void add_region(region *r, int x, int y);
struct region *new_region(int x, int y, struct plane *pl, int uid);
void remove_region(region ** rlist, region * r);
void terraform_region(struct region *r, const struct terrain_type *terrain);
void init_region(struct region *r);
bool pnormalize(int *x, int *y, const struct plane *pl);
void pnormalize(int *x, int *y, const struct plane *pl);
extern const int delta_x[MAXDIRECTIONS];
extern const int delta_y[MAXDIRECTIONS];
@ -252,7 +254,7 @@ extern "C" {
#define RESOLVE_REGION (TYP_REGION << 24)
void resolve_region(region *r);
void write_region_reference(const struct region *r, struct storage *store);
int read_region_reference(struct gamedata *data, region **rp, resolve_fun fun);
int read_region_reference(struct gamedata *data, region **rp);
const char *regionname(const struct region *r, const struct faction *f);

View file

@ -123,7 +123,7 @@ static void read_alliances(gamedata *data)
READ_INT(store, &al->flags);
}
if (data->version >= ALLIANCELEADER_VERSION) {
read_faction_reference(data, &al->_leader, NULL);
read_faction_reference(data, &al->_leader);
READ_INT(store, &id);
}
else {
@ -248,7 +248,7 @@ static void read_owner(gamedata *data, region_owner ** powner)
owner->flags = 0;
}
if (data->version >= OWNER_3_VERSION) {
read_faction_reference(data, &owner->last_owner, NULL);
read_faction_reference(data, &owner->last_owner);
}
else if (data->version >= OWNER_2_VERSION) {
int id;
@ -261,7 +261,7 @@ static void read_owner(gamedata *data, region_owner ** powner)
else {
owner->last_owner = NULL;
}
read_faction_reference(data, &owner->owner, NULL);
read_faction_reference(data, &owner->owner);
*powner = owner;
}
else {
@ -420,10 +420,7 @@ unit *read_unit(gamedata *data)
u_setfaction(u, NULL);
}
else {
u = (unit *)calloc(1, sizeof(unit));
assert_alloc(u);
u->no = n;
uhash(u);
u = unit_create(n);
}
READ_INT(data->store, &n);
@ -440,12 +437,12 @@ unit *read_unit(gamedata *data)
if (unicode_utf8_trim(obuf)!=0) {
log_warning("trim unit %s name to '%s'", itoa36(u->no), obuf);
}
u->_name = obuf[0] ? str_strdup(obuf) : 0;
unit_setname(u, obuf[0] ? obuf : NULL);
READ_STR(data->store, obuf, sizeof(obuf));
if (unicode_utf8_trim(obuf)!=0) {
log_warning("trim unit %s info to '%s'", itoa36(u->no), obuf);
}
u->display = obuf[0] ? str_strdup(obuf) : 0;
unit_setinfo(u, obuf[0] ? obuf : NULL);
READ_INT(data->store, &number);
set_number(u, number);
@ -544,6 +541,7 @@ unit *read_unit(gamedata *data)
void write_unit(gamedata *data, const unit * u)
{
const char *str;
order *ord;
int p = 0;
unsigned int flags = u->flags & UFL_SAVEMASK;
@ -553,7 +551,8 @@ void write_unit(gamedata *data, const unit * u)
assert(u->faction->_alive);
write_faction_reference(u->faction, data->store);
WRITE_STR(data->store, u->_name);
WRITE_STR(data->store, u->display ? u->display : "");
str = unit_getinfo(u);
WRITE_STR(data->store, str ? str : "");
WRITE_INT(data->store, u->number);
WRITE_INT(data->store, u->age);
WRITE_TOK(data->store, u_race(u)->_name);
@ -615,7 +614,7 @@ static void read_regioninfo(gamedata *data, const region *r, char *info, size_t
static region *readregion(gamedata *data, int x, int y)
{
region *r = findregion(x, y);
region *r;
const terrain_type *terrain;
char name[NAMESIZE];
char info[DISPLAYSIZE];
@ -623,26 +622,19 @@ static region *readregion(gamedata *data, int x, int y)
int n;
READ_INT(data->store, &uid);
r = findregionbyid(uid);
if (r == NULL) {
plane *pl = findplane(x, y);
r = new_region(x, y, pl, uid);
r = region_create(uid);
}
else {
assert(uid == 0 || r->uid == uid);
while (r->attribs)
a_remove(&r->attribs, r->attribs);
if (r->land) {
free_land(r->land);
r->land = 0;
}
while (r->resources) {
rawmaterial *rm = r->resources;
r->resources = rm->next;
free(rm);
}
r->land = 0;
/* make sure this was not read earlier */
assert(r->next == NULL);
assert(r->attribs == NULL);
assert(r->land == NULL);
assert(r->resources == NULL);
}
/* add region to the global list: */
add_region(r, x, y);
if (data->version < LANDDISPLAY_VERSION) {
read_regioninfo(data, r, info, sizeof(info));
}
@ -931,7 +923,6 @@ static void read_password(gamedata *data, faction *f) {
else {
faction_setpassword(f, (data->version >= CRYPT_VERSION) ? name : password_hash(name, PASSWORD_DEFAULT));
}
(void)_test_read_password;
}
void _test_read_password(gamedata *data, faction *f) {
@ -939,8 +930,7 @@ void _test_read_password(gamedata *data, faction *f) {
}
static void write_password(gamedata *data, const faction *f) {
WRITE_TOK(data->store, (const char *)f->_password);
(void)_test_write_password;
WRITE_TOK(data->store, faction_getpassword(f));
}
void _test_write_password(gamedata *data, const faction *f) {
@ -957,8 +947,7 @@ faction *read_faction(gamedata * data)
assert(n > 0);
f = findfaction(n);
if (f == NULL) {
f = (faction *)calloc(1, sizeof(faction));
f->no = n;
f = faction_create(n);
}
else {
f->allies = NULL; /* FIXME: mem leak */
@ -1009,7 +998,7 @@ faction *read_faction(gamedata * data)
if (unicode_utf8_trim(name)!=0) {
log_warning("trim faction %s banner to '%s'", itoa36(f->no), name);
};
f->banner = str_strdup(name);
faction_setbanner(f, name);
log_debug(" - Lese Partei %s (%s)", f->name, itoa36(f->no));
@ -1082,19 +1071,17 @@ faction *read_faction(gamedata * data)
/* mistakes were made in the past*/
f->options &= ~WANT_OPTION(O_JSON);
}
read_allies(data, f);
read_allies(data, &f->allies);
read_groups(data, f);
f->spellbook = 0;
if (data->version >= REGIONOWNER_VERSION) {
read_spellbook(FactionSpells() ? &f->spellbook : 0, data, get_spell_level_faction, (void *)f);
}
resolve_faction(f);
return f;
}
void write_faction(gamedata *data, const faction * f)
{
ally *sf;
origin *ur;
assert(f->_alive);
@ -1117,7 +1104,7 @@ void write_faction(gamedata *data, const faction * f)
WRITE_INT(data->store, f->alliance_joindate);
WRITE_STR(data->store, f->name);
WRITE_STR(data->store, f->banner);
WRITE_STR(data->store, faction_getbanner(f));
WRITE_STR(data->store, f->email?f->email:"");
write_password(data, f);
WRITE_TOK(data->store, locale_name(f->locale));
@ -1144,23 +1131,9 @@ void write_faction(gamedata *data, const faction * f)
WRITE_INT(data->store, f->options & ~WANT_OPTION(O_DEBUG));
WRITE_SECTION(data->store);
for (sf = f->allies; sf; sf = sf->next) {
int no;
int status;
assert(sf->faction);
no = sf->faction->no;
status = alliedfaction(NULL, f, sf->faction, HELP_ALL);
if (status != 0) {
WRITE_INT(data->store, no);
WRITE_INT(data->store, sf->status);
}
}
WRITE_INT(data->store, 0);
write_allies(data, f->allies);
WRITE_SECTION(data->store);
write_groups(data->store, f);
write_groups(data, f);
write_spellbook(f->spellbook, data->store);
}
@ -1419,7 +1392,6 @@ int read_game(gamedata *data)
*fp = f;
fp = &f->next;
fhash(f);
}
*fp = 0;
@ -1519,6 +1491,7 @@ int read_game(gamedata *data)
}
}
else {
assert(f->units);
for (u = f->units; u; u = u->nextF) {
if (data->version < SPELL_LEVEL_VERSION) {
sc_mage *mage = get_mage_depr(u);

View file

@ -250,7 +250,6 @@ static void test_readwrite_dead_faction_group(CuTest *tc) {
faction *f, *f2;
unit * u;
group *g;
ally *al;
int fno;
gamedata data;
storage store;
@ -269,8 +268,9 @@ static void test_readwrite_dead_faction_group(CuTest *tc) {
CuAssertPtrNotNull(tc, u);
g = join_group(u, "group");
CuAssertPtrNotNull(tc, g);
al = ally_add(&g->allies, f);
CuAssertPtrNotNull(tc, al);
CuAssertPtrEquals(tc, NULL, g->allies);
ally_set(&g->allies, f, HELP_GIVE);
CuAssertPtrNotNull(tc, g->allies);
CuAssertPtrEquals(tc, f, factions);
destroyfaction(&factions);
@ -432,7 +432,7 @@ static void test_read_password_external(CuTest *tc) {
}
f = test_create_faction(NULL);
faction_setpassword(f, password_hash("secret", PASSWORD_DEFAULT));
CuAssertPtrNotNull(tc, f->_password);
CuAssertPtrNotNull(tc, faction_getpassword(f));
mstream_init(&data.strm);
gamedata_init(&data, &store, RELEASE_VERSION);
WRITE_TOK(data.store, "newpassword");

View file

@ -33,7 +33,6 @@ static void test_create_duplicate_spell(CuTest * tc)
strlist *sl = 0;
test_setup();
test_inject_messagetypes();
test_log_stderr(0); /* suppress the "duplicate spell" error message */
log = test_log_start(LOG_CPERROR, &sl);

View file

@ -474,8 +474,8 @@ attrib_type at_private = {
const char *u_description(const unit * u, const struct locale *lang)
{
if (u->display && u->display[0]) {
return u->display;
if (u->display_id > 0) {
return unit_getinfo(u);
}
else {
char zText[64];
@ -1293,7 +1293,6 @@ void free_unit(unit * u)
{
assert(!u->region);
free(u->_name);
free(u->display);
free_order(u->thisorder);
free_orders(&u->orders);
if (u->skills)
@ -1376,6 +1375,12 @@ void name_unit(unit * u)
}
}
unit *unit_create(int id)
{
unit *u = (unit *)calloc(1, sizeof(unit));
createunitid(u, id);
return u;
}
/** creates a new unit.
*
* @param dname: name, set to NULL to get a default.
@ -1384,7 +1389,7 @@ void name_unit(unit * u)
unit *create_unit(region * r, faction * f, int number, const struct race *urace,
int id, const char *dname, unit * creator)
{
unit *u = (unit *)calloc(1, sizeof(unit));
unit *u = unit_create(id);
assert(urace);
u_setrace(u, urace);
@ -1396,10 +1401,6 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace,
set_number(u, number);
/* die nummer der neuen einheit muss vor name_unit generiert werden,
* da der default name immer noch 'Nummer u->no' ist */
createunitid(u, id);
/* zuerst in die Region setzen, da zb Drachennamen den Regionsnamen
* enthalten */
if (r)
@ -1455,10 +1456,9 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace,
}
/* Gruppen */
if (creator->faction == f && fval(creator, UFL_GROUP)) {
a = a_find(creator->attribs, &at_group);
if (a) {
group *g = (group *)a->data.v;
if (creator->faction == f) {
group *g = get_group(creator);
if (g) {
set_group(u, g);
}
}
@ -1522,16 +1522,20 @@ void unit_setname(unit * u, const char *name)
const char *unit_getinfo(const unit * u)
{
return (const char *)u->display;
if (u->display_id > 0) {
return dbstring_load(u->display_id, NULL);
}
return NULL;
}
void unit_setinfo(unit * u, const char *info)
{
free(u->display);
if (info)
u->display = str_strdup(info);
else
u->display = NULL;
if (info) {
u->display_id = dbstring_save(info);
}
else {
u->display_id = 0;
}
}
int unit_getid(const unit * u)
@ -1798,10 +1802,6 @@ bool unit_name_equals_race(const unit *u) {
return false;
}
bool unit_can_study(const unit *u) {
return !((u_race(u)->flags & RCF_NOLEARN) || fval(u, UFL_WERE));
}
static int read_newunitid(const faction * f, const region * r)
{
int n;

View file

@ -21,6 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/resolve.h>
#include "types.h"
#include "database.h"
#include "skills.h"
#include <stddef.h>
@ -89,7 +90,7 @@ extern "C" {
int no; /* id */
int hp;
char *_name;
char *display;
dbrow_id display_id;
struct faction *faction;
struct building *building;
struct ship *ship;
@ -205,10 +206,11 @@ extern "C" {
int invisible(const struct unit *target, const struct unit *viewer);
void free_unit(struct unit *u);
extern void name_unit(struct unit *u);
extern struct unit *create_unit(struct region *r1, struct faction *f,
void name_unit(struct unit *u);
struct unit *unit_create(int id);
struct unit *create_unit(struct region *r1, struct faction *f,
int number, const struct race *rc, int id, const char *dname,
struct unit *creator);
struct unit *creator);
void uhash(struct unit *u);
void uunhash(struct unit *u);
@ -242,7 +244,6 @@ extern "C" {
const char *unitname(const struct unit *u);
char *write_unitname(const struct unit *u, char *buffer, size_t size);
bool unit_name_equals_race(const struct unit *u);
bool unit_can_study(const struct unit *u);
/* getunit results: */
#define GET_UNIT 0

View file

@ -397,14 +397,13 @@ static void test_unit_description(CuTest *tc) {
rc = test_create_race("hodor");
u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL));
CuAssertPtrEquals(tc, NULL, u->display);
CuAssertStrEquals(tc, 0, u_description(u, lang));
u->display = str_strdup("Hodor");
CuAssertStrEquals(tc, NULL, unit_getinfo(u));
CuAssertStrEquals(tc, NULL, u_description(u, lang));
unit_setinfo(u, "Hodor");
CuAssertStrEquals(tc, "Hodor", u_description(u, NULL));
CuAssertStrEquals(tc, "Hodor", u_description(u, lang));
free(u->display);
u->display = NULL;
unit_setinfo(u, NULL);
locale_setstring(lang, "describe_hodor", "HODOR");
CuAssertStrEquals(tc, "HODOR", u_description(u, lang));

View file

@ -800,7 +800,7 @@ void immigration(void)
void nmr_warnings(void)
{
faction *f, *fa;
#define FRIEND (HELP_GUARD|HELP_MONEY)
#define HELP_NMR (HELP_GUARD|HELP_MONEY)
for (f = factions; f; f = f->next) {
if (!fval(f, FFL_NOIDLEOUT) && turn > f->lastorders) {
ADDMSG(&f->msgs, msg_message("nmr_warning", ""));
@ -816,14 +816,12 @@ void nmr_warnings(void)
warn = 1;
}
}
else if (alliedfaction(NULL, f, fa, FRIEND)
&& alliedfaction(NULL, fa, f, FRIEND)) {
else if (alliedfaction(f, fa, HELP_NMR) && alliedfaction(fa, f, HELP_NMR)) {
warn = 1;
}
if (warn) {
if (msg == NULL) {
msg =
msg_message("warn_dropout", "faction turns", f,
msg = msg_message("warn_dropout", "faction turns", f,
turn - f->lastorders);
}
add_message(&fa->msgs, msg);
@ -1292,11 +1290,12 @@ void quit(void)
int ally_cmd(unit * u, struct order *ord)
{
char token[128];
ally *sf, **sfp;
struct allies **sfp;
faction *f;
int keyword, not_kw;
const char *s;
int sf_status;
init_order_depr(ord);
f = getfaction();
@ -1318,29 +1317,18 @@ int ally_cmd(unit * u, struct order *ord)
sfp = &u->faction->allies;
if (fval(u, UFL_GROUP)) {
attrib *a = a_find(u->attribs, &at_group);
if (a)
sfp = &((group *)a->data.v)->allies;
group *g = get_group(u);
if (g) {
sfp = &g->allies;
}
}
for (sf = *sfp; sf; sf = sf->next)
if (sf->faction == f)
break; /* Gleich die passende raussuchen, wenn vorhanden */
not_kw = getparam(u->faction->locale); /* HELFE partei [modus] NICHT */
if (!sf) {
if (keyword == P_NOT || not_kw == P_NOT) {
/* Wir helfen der Partei gar nicht... */
return 0;
}
else {
sf = ally_add(sfp, f);
sf->status = 0;
}
}
sf_status = ally_get(*sfp, f);
switch (keyword) {
case P_NOT:
sf->status = 0;
sf_status = 0;
break;
case NOPARAM:
@ -1348,60 +1336,57 @@ int ally_cmd(unit * u, struct order *ord)
return 0;
case P_ANY:
if (not_kw == P_NOT)
sf->status = 0;
else
sf->status = HELP_ALL;
sf_status = (not_kw == P_NOT) ? 0 : HELP_ALL;
break;
case P_TRAVEL:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_TRAVEL);
else
sf->status = sf->status | HELP_TRAVEL;
if (not_kw == P_NOT) {
sf_status = sf_status & (HELP_ALL - HELP_TRAVEL);
}
else {
sf_status |= HELP_TRAVEL;
}
break;
case P_GIVE:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_GIVE);
sf_status &= (HELP_ALL - HELP_GIVE);
else
sf->status = sf->status | HELP_GIVE;
sf_status |= HELP_GIVE;
break;
case P_MONEY:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_MONEY);
sf_status &= (HELP_ALL - HELP_MONEY);
else
sf->status = sf->status | HELP_MONEY;
sf_status |= HELP_MONEY;
break;
case P_FIGHT:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_FIGHT);
sf_status &= (HELP_ALL - HELP_FIGHT);
else
sf->status = sf->status | HELP_FIGHT;
sf_status |= HELP_FIGHT;
break;
case P_FACTIONSTEALTH:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_FSTEALTH);
sf_status &= (HELP_ALL - HELP_FSTEALTH);
else
sf->status = sf->status | HELP_FSTEALTH;
sf_status |= HELP_FSTEALTH;
break;
case P_GUARD:
if (not_kw == P_NOT)
sf->status = sf->status & (HELP_ALL - HELP_GUARD);
sf_status &= (HELP_ALL - HELP_GUARD);
else
sf->status = sf->status | HELP_GUARD;
sf_status |= HELP_GUARD;
break;
}
sf->status &= HelpMask();
sf_status &= HelpMask();
ally_set(sfp, f, sf_status);
if (sf->status == 0) { /* Alle HELPs geloescht */
removelist(sfp, sf);
}
return 0;
}
@ -1468,12 +1453,8 @@ int prefix_cmd(unit * u, struct order *ord)
s = gettoken(token, sizeof(token));
if (!s || !*s) {
attrib *a = NULL;
if (fval(u, UFL_GROUP)) {
a = a_find(u->attribs, &at_group);
}
if (a) {
group *g = (group *)a->data.v;
group *g = get_group(u);
if (g) {
a_removeall(&g->attribs, &at_raceprefix);
}
else {
@ -1488,13 +1469,12 @@ int prefix_cmd(unit * u, struct order *ord)
cmistake(u, ord, 299, MSG_EVENT);
}
else {
ap = &u->faction->attribs;
if (fval(u, UFL_GROUP)) {
attrib *a = a_find(u->attribs, &at_group);
if (a) {
group *g = (group *)a->data.v;
ap = &g->attribs;
}
group *g = get_group(u);
if (g) {
ap = &g->attribs;
}
else {
ap = &u->faction->attribs;
}
set_prefix(ap, race_prefixes[var.i]);
}
@ -1542,7 +1522,7 @@ int display_cmd(unit * u, struct order *ord)
break;
case P_UNIT:
s = &u->display;
unit_setinfo(u, getstrtoken());
break;
case P_PRIVAT:
@ -1854,11 +1834,8 @@ int name_cmd(struct unit *u, struct order *ord)
case P_GROUP:
{
attrib *a = NULL;
if (fval(u, UFL_GROUP))
a = a_find(u->attribs, &at_group);
if (a) {
group *g = (group *)a->data.v;
group *g = get_group(u);
if (g) {
s = &g->name;
break;
}
@ -2086,12 +2063,10 @@ int banner_cmd(unit * u, struct order *ord)
{
const char * s;
free(u->faction->banner);
init_order_depr(ord);
s = getstrtoken();
u->faction->banner = s ? str_strdup(s) : 0;
add_message(&u->faction->msgs, msg_message("changebanner", "value",
u->faction->banner));
faction_setbanner(u->faction, s);
add_message(&u->faction->msgs, msg_message("changebanner", "value", s));
return 0;
}
@ -3404,7 +3379,7 @@ int pay_cmd(unit * u, struct order *ord)
static int reserve_i(unit * u, struct order *ord, int flags)
{
char token[128];
if (u->number > 0 && (u_race(u)->ec_flags & ECF_GETITEM)) {
if (u->number > 0) {
int use, count, para;
const item_type *itype;
const char *s;
@ -3438,7 +3413,10 @@ static int reserve_i(unit * u, struct order *ord, int flags)
}
int reserve_cmd(unit * u, struct order *ord) {
return reserve_i(u, ord, GET_DEFAULT);
if ((u_race(u)->ec_flags & ECF_GETITEM)) {
return reserve_i(u, ord, GET_DEFAULT);
}
return 0;
}
int reserve_self(unit * u, struct order *ord) {

View file

@ -140,7 +140,6 @@ static void test_enter_ship(CuTest * tc)
race * rc;
test_setup();
r = test_create_region(0, 0, NULL);
rc = test_create_race("smurf");
u = test_create_unit(test_create_faction(rc), r);
@ -188,12 +187,12 @@ static void test_display_cmd(CuTest *tc) {
ord = create_order(K_DISPLAY, f->locale, "%s Hodor", LOC(f->locale, parameters[P_UNIT]));
CuAssertIntEquals(tc, 0, display_cmd(u, ord));
CuAssertStrEquals(tc, "Hodor", u->display);
CuAssertStrEquals(tc, "Hodor", unit_getinfo(u));
free_order(ord);
ord = create_order(K_DISPLAY, f->locale, LOC(f->locale, parameters[P_UNIT]));
CuAssertIntEquals(tc, 0, display_cmd(u, ord));
CuAssertPtrEquals(tc, NULL, u->display);
CuAssertPtrEquals(tc, NULL, (void *)unit_getinfo(u));
free_order(ord);
ord = create_order(K_DISPLAY, f->locale, "%s Hodor", LOC(f->locale, parameters[P_REGION]));
@ -222,7 +221,6 @@ static void test_rule_force_leave(CuTest *tc) {
}
static void test_force_leave_buildings(CuTest *tc) {
ally *al;
region *r;
unit *u1, *u2, *u3;
building * b;
@ -245,8 +243,7 @@ static void test_force_leave_buildings(CuTest *tc) {
CuAssertPtrNotNull(tc, test_find_messagetype(u3->faction->msgs, "force_leave_building"));
u_set_building(u3, b);
al = ally_add(&u1->faction->allies, u3->faction);
al->status = HELP_GUARD;
ally_set(&u1->faction->allies, u3->faction, HELP_GUARD);
force_leave(r, NULL);
CuAssertPtrEquals_Msg(tc, "allies should not be forced to leave", b, u3->building);
test_teardown();
@ -477,6 +474,10 @@ static void test_limit_new_units(CuTest * tc)
alliance *al;
test_setup();
mt_create_va(mt_new("too_many_units_in_faction", NULL), "unit:unit",
"region:region", "command:order", "allowed:int", MT_NEW_END);
mt_create_va(mt_new("too_many_units_in_alliance", NULL), "unit:unit",
"region:region", "command:order", "allowed:int", MT_NEW_END);
al = makealliance(1, "Hodor");
f = test_create_faction(NULL);
u = test_create_unit(f, test_create_region(0, 0, NULL));
@ -892,6 +893,9 @@ static unit * setup_name_cmd(void) {
faction *f;
test_setup();
mt_create_error(84);
mt_create_error(148);
mt_create_error(12);
mt_create_va(mt_new("renamed_building_seen", NULL), "renamer:unit", "region:region", "building:building", MT_NEW_END);
mt_create_va(mt_new("renamed_building_notseen", NULL), "region:region", "building:building", MT_NEW_END);
f = test_create_faction(NULL);
@ -1090,6 +1094,7 @@ static void test_long_order_multi_long(CuTest *tc) {
/* TODO: write more tests */
unit *u;
test_setup();
mt_create_error(52);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
unit_addorder(u, create_order(K_MOVE, u->faction->locale, NULL));
unit_addorder(u, create_order(K_DESTROY, u->faction->locale, NULL));
@ -1104,6 +1109,7 @@ static void test_long_order_multi_buy(CuTest *tc) {
/* TODO: write more tests */
unit *u;
test_setup();
mt_create_error(52);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
@ -1133,6 +1139,7 @@ static void test_long_order_buy_cast(CuTest *tc) {
/* TODO: write more tests */
unit *u;
test_setup();
mt_create_error(52);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
unit_addorder(u, create_order(K_CAST, u->faction->locale, 0));
@ -1165,6 +1172,7 @@ static void test_ally_cmd_errors(CuTest *tc) {
order *ord;
test_setup();
mt_create_error(66);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
fid = u->faction->no + 1;
CuAssertPtrEquals(tc, NULL, findfaction(fid));
@ -1265,25 +1273,25 @@ static void test_ally_cmd(CuTest *tc) {
ord = create_order(K_ALLY, f->locale, "%s", itoa36(f->no));
ally_cmd(u, ord);
CuAssertPtrEquals(tc, NULL, u->faction->msgs);
CuAssertIntEquals(tc, HELP_ALL, alliedfaction(0, u->faction, f, HELP_ALL));
CuAssertIntEquals(tc, HELP_ALL, ally_get(u->faction->allies, f));
free_order(ord);
ord = create_order(K_ALLY, f->locale, "%s %s", itoa36(f->no), LOC(f->locale, parameters[P_NOT]));
ally_cmd(u, ord);
CuAssertPtrEquals(tc, NULL, u->faction->msgs);
CuAssertIntEquals(tc, 0, alliedfaction(0, u->faction, f, HELP_ALL));
CuAssertIntEquals(tc, 0, ally_get(u->faction->allies, f));
free_order(ord);
ord = create_order(K_ALLY, f->locale, "%s %s", itoa36(f->no), LOC(f->locale, parameters[P_GUARD]));
ally_cmd(u, ord);
CuAssertPtrEquals(tc, NULL, u->faction->msgs);
CuAssertIntEquals(tc, HELP_GUARD, alliedfaction(0, u->faction, f, HELP_ALL));
CuAssertIntEquals(tc, HELP_GUARD, ally_get(u->faction->allies, f));
free_order(ord);
ord = create_order(K_ALLY, f->locale, "%s %s %s", itoa36(f->no), LOC(f->locale, parameters[P_GUARD]), LOC(f->locale, parameters[P_NOT]));
ally_cmd(u, ord);
CuAssertPtrEquals(tc, NULL, u->faction->msgs);
CuAssertIntEquals(tc, 0, alliedfaction(0, u->faction, f, HELP_ALL));
CuAssertIntEquals(tc, 0, ally_get(u->faction->allies, f));
free_order(ord);
test_teardown();
@ -1316,6 +1324,8 @@ static unit * setup_mail_cmd(void) {
faction *f;
test_setup();
mt_create_error(66);
mt_create_error(30);
mt_create_va(mt_new("regionmessage", NULL), "region:region", "sender:unit", "string:string", MT_NEW_END);
mt_create_va(mt_new("unitmessage", NULL), "region:region", "sender:unit", "string:string", "unit:unit", MT_NEW_END);
mt_create_va(mt_new("mail_result", NULL), "message:string", "unit:unit", MT_NEW_END);
@ -1435,6 +1445,8 @@ static void test_show_without_item(CuTest *tc)
struct locale *loc;
test_setup();
mt_create_error(21);
mt_create_error(36);
mt_create_va(mt_new("displayitem", NULL), "weight:int", "item:resource", "description:string", MT_NEW_END);
loc = get_or_create_locale("de");
@ -1479,7 +1491,6 @@ static void test_show_race(CuTest *tc) {
message * msg;
test_setup();
mt_create_va(mt_new("msg_event", NULL), "string:string", MT_NEW_END);
test_create_race("human");
rc = test_create_race("elf");
@ -1495,8 +1506,8 @@ static void test_show_race(CuTest *tc) {
ord = create_order(K_RESHOW, loc, "Mensch");
reshow_cmd(u, ord);
CuAssertTrue(tc, test_find_messagetype(u->faction->msgs, "error21") != NULL);
CuAssertTrue(tc, test_find_messagetype(u->faction->msgs, "msg_event") == NULL);
CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "error21"));
CuAssertPtrEquals(tc, NULL, test_find_messagetype(u->faction->msgs, "msg_event"));
test_clear_messages(u->faction);
free_order(ord);

View file

@ -1213,7 +1213,7 @@ target_resists_magic(unit * magician, void *obj, int objtyp, int t_bonus)
bool is_magic_resistant(unit * magician, unit * target, int resist_bonus)
{
return (bool)target_resists_magic(magician, target, TYP_UNIT,
return target_resists_magic(magician, target, TYP_UNIT,
resist_bonus);
}

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 1998-2017, Enno Rehling <enno@eressea.de>
Copyright (c) 1998-2018, Enno Rehling <enno@eressea.de>
Katja Zedel <katze@felidae.kn-bremen.de
Christian Schlittchen <corwin@amber.kn-bremen.de>
@ -192,7 +192,7 @@ static int parse_args(int argc, char **argv)
else if (argi[1] == '-') { /* long format */
if (strcmp(argi + 2, "version") == 0) {
printf("Eressea version %s, "
"Copyright (C) 2017 Enno Rehling et al.\n",
"Copyright (C) 2018 Enno Rehling et al.\n",
eressea_version());
return 1;
#ifdef USE_CURSES

View file

@ -71,7 +71,7 @@ attrib_type at_market = {
bool markets_module(void)
{
return (bool)config_get_int("modules.market", 0);
return config_get_int("modules.market", 0) != 0;
}
void do_markets(void)

View file

@ -50,7 +50,7 @@ static void xmasgate_write(const trigger * t, struct storage *store)
static int xmasgate_read(trigger * t, struct gamedata *data)
{
if (read_building_reference(data, (building **)&t->data.v, NULL) <= 0) {
if (read_building_reference(data, (building **)&t->data.v) <= 0) {
return AT_READ_FAIL;
}
return AT_READ_OK;

View file

@ -557,7 +557,7 @@ static order *monster_learn(unit * u)
const struct locale *lang = u->faction->locale;
/* can these monsters even study? */
if (!unit_can_study(u)) {
if (!check_student(u, NULL, SK_PERCEPTION)) {
return NULL;
}
@ -832,8 +832,7 @@ void plan_monsters(faction * f)
}
}
}
if (long_order == NULL && unit_can_study(u)) {
if (long_order == NULL && check_student(u, NULL, SK_WEAPONLESS)) {
/* Einheiten, die Waffenlosen Kampf lernen k<>nnten, lernen es um
* zu bewachen: */
if (rc->bonus[SK_WEAPONLESS] != -99) {

View file

@ -892,7 +892,7 @@ static void drifting_ships(region * r)
static bool present(region * r, unit * u)
{
return (bool)(u && u->region == r);
return (u && u->region == r);
}
static void caught_target(region * r, unit * u)

View file

@ -153,7 +153,6 @@ static void test_ship_has_harbormaster_same_faction(CuTest * tc) {
static void test_ship_has_harbormaster_ally(CuTest * tc) {
unit *u;
move_fixture mf;
ally *al;
test_setup();
setup_harbor(&mf);
@ -161,8 +160,7 @@ static void test_ship_has_harbormaster_ally(CuTest * tc) {
u = test_create_unit(test_create_faction(NULL), mf.r);
u->building = mf.b;
building_set_owner(u);
al = ally_add(&u->faction->allies, mf.u->faction);
al->status = HELP_GUARD;
ally_set(&u->faction->allies, mf.u->faction, HELP_GUARD);
CuAssertIntEquals(tc, SA_HARBOUR, check_ship_allowed(mf.sh, mf.r));
test_teardown();

View file

@ -1,42 +0,0 @@
#include <platform.h>
#include "kernel/config.h"
#include "kernel/db/driver.h"
#include "orderdb.h"
#include <util/log.h>
#include <critbit.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
void orderdb_open(void)
{
const char *dbname;
dbname = config_get("game.dbswap");
db_driver_open(DB_SWAP, dbname);
}
void orderdb_close(void)
{
db_driver_close(DB_SWAP);
}
order_data *odata_load(int id)
{
if (id > 0) {
return db_driver_order_load(id);
}
return NULL;
}
int odata_save(order_data *od)
{
if (od->_str) {
return db_driver_order_save(od->_str);
}
return 0;
}

View file

@ -1,25 +0,0 @@
#ifndef H_ORDERDB
#define H_ORDERDB
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct order_data {
const char *_str;
int _refcount;
} order_data;
void odata_create(order_data **pdata, size_t len, const char *str);
void odata_release(order_data * od);
void odata_addref(order_data *od);
void orderdb_open(void);
void orderdb_close(void);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,28 +0,0 @@
#include <platform.h>
#include <kernel/config.h>
#include "orderdb.h"
#include <CuTest.h>
#include <tests.h>
#include <string.h>
static void test_orderdb(CuTest *tc) {
order_data *od = NULL;
const char * s = "GIB enno 1 Hodor";
odata_create(&od, strlen(s) + 1, s);
CuAssertPtrNotNull(tc, od);
CuAssertStrEquals(tc, s, od->_str);
CuAssertTrue(tc, od->_refcount >= 1);
odata_release(od);
}
CuSuite *get_orderdb_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_orderdb);
return suite;
}

View file

@ -30,6 +30,8 @@ static void setup_piracy(void) {
st_boat = test_create_shiptype("boat");
st_boat->cargo = 1000;
mt_create_error(144);
mt_create_error(146);
mt_create_va(mt_new("piratenovictim", NULL),
"ship:ship", "unit:unit", "region:region", MT_NEW_END);
mt_create_va(mt_new("piratesawvictim", NULL),

View file

@ -15,12 +15,19 @@
#include <stddef.h>
#include <CuTest.h>
static void setup_renumber(CuTest *tc) {
test_setup_ex(tc);
mt_create_error(114);
mt_create_error(115);
mt_create_error(116);
}
static void test_renumber_faction(CuTest *tc) {
unit *u;
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
no = u->faction->no;
uno = (no > 1) ? no - 1 : no + 1;
@ -38,7 +45,7 @@ static void test_renumber_faction_duplicate(CuTest *tc) {
int no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
mt_create_va(mt_new("renumber_inuse", NULL), "id:int", MT_NEW_END);
f2 = test_create_faction(NULL);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
@ -58,7 +65,7 @@ static void test_renumber_faction_invalid(CuTest *tc) {
int no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(0), test_create_region(0, 0, 0));
no = f->no;
lang = f->locale;
@ -88,7 +95,7 @@ static void test_renumber_building(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
u->building = test_create_building(u->region, NULL);
no = u->building->no;
@ -106,7 +113,7 @@ static void test_renumber_building_duplicate(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
u->building = test_create_building(u->region, NULL);
uno = u->building->no;
@ -125,7 +132,7 @@ static void test_renumber_ship(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
u->ship = test_create_ship(u->region, NULL);
no = u->ship->no;
@ -142,7 +149,7 @@ static void test_renumber_ship_twice(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
u->ship = test_create_ship(u->region, NULL);
no = u->ship->no;
@ -164,7 +171,7 @@ static void test_renumber_ship_duplicate(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
u->ship = test_create_ship(u->region, NULL);
uno = u->ship->no;
@ -183,7 +190,7 @@ static void test_renumber_unit(CuTest *tc) {
int uno, no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
no = u->no;
uno = (no > 1) ? no - 1 : no + 1;
@ -201,7 +208,7 @@ static void test_renumber_unit_duplicate(CuTest *tc) {
int no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
no = u->no;
u2 = test_create_unit(f, u->region);
@ -220,7 +227,7 @@ static void test_renumber_unit_limit(CuTest *tc) {
int no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
no = u->no;
lang = f->locale;
@ -238,7 +245,7 @@ static void test_renumber_unit_invalid(CuTest *tc) {
int no;
const struct locale *lang;
test_setup_ex(tc);
setup_renumber(tc);
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
no = u->no;
lang = f->locale;

View file

@ -902,6 +902,7 @@ void report_region(struct stream *out, const region * r, faction * f)
assert(f);
assert(r);
memset(edges, 0, sizeof(edges));
for (d = 0; d != MAXDIRECTIONS; d++) {
/* Nachbarregionen, die gesehen werden, ermitteln */
region *r2 = rconnect(r, d);
@ -1510,81 +1511,93 @@ report_template(const char *filename, report_context * ctx, const char *bom)
return 0;
}
static void
show_allies(const faction * f, const ally * allies, char *buf, size_t size)
{
int allierte = 0;
int i = 0, h, hh = 0, dh = 0;
const ally *sf;
for (sf = allies; sf; sf = sf->next) {
int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
if (mode > 0) {
++allierte;
static int count_allies_cb(struct allies *all, faction *af, int status, void *udata) {
int *num = (int *)udata;
if (status > 0) {
++*num;
}
return 0;
}
struct show_s {
sbstring sbs;
const faction *f;
int num_allies;
};
static int show_allies_cb(struct allies *all, faction *af, int status, void *udata) {
struct show_s * show = (struct show_s *)udata;
const faction * f = show->f;
int mode = alliance_status(f, af, status);
--show->num_allies;
if (sbs_length(&show->sbs) > 0) {
/* not the first entry */
if (0 == show->num_allies) {
sbs_strcat(&show->sbs, LOC(f->locale, "list_and"));
}
else {
sbs_strcat(&show->sbs, ", ");
}
}
if (allierte > 0) {
sbstring sbs;
sbs_init(&sbs, buf, size);
for (sf = allies; sf; sf = sf->next) {
int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
if (mode <= 0)
continue;
i++;
if (dh) {
if (i == allierte) {
sbs_strcat(&sbs, LOC(f->locale, "list_and"));
}
else {
sbs_strcat(&sbs, ", ");
sbs_strcat(&show->sbs, factionname(af));
sbs_strcat(&show->sbs, " (");
if ((mode & HELP_ALL) == HELP_ALL) {
sbs_strcat(&show->sbs, LOC(f->locale, parameters[P_ANY]));
}
else {
int h, hh = 0;
for (h = 1; h <= HELP_TRAVEL; h *= 2) {
int p = MAXPARAMS;
if ((mode & h) == h) {
switch (h) {
case HELP_TRAVEL:
p = P_TRAVEL;
break;
case HELP_MONEY:
p = P_MONEY;
break;
case HELP_FIGHT:
p = P_FIGHT;
break;
case HELP_GIVE:
p = P_GIVE;
break;
case HELP_GUARD:
p = P_GUARD;
break;
case HELP_FSTEALTH:
p = P_FACTIONSTEALTH;
break;
}
}
dh = 1;
hh = 0;
sbs_strcat(&sbs, factionname(sf->faction));
sbs_strcat(&sbs, " (");
if ((mode & HELP_ALL) == HELP_ALL) {
sbs_strcat(&sbs, LOC(f->locale, parameters[P_ANY]));
}
else {
for (h = 1; h <= HELP_TRAVEL; h *= 2) {
int p = MAXPARAMS;
if ((mode & h) == h) {
switch (h) {
case HELP_TRAVEL:
p = P_TRAVEL;
break;
case HELP_MONEY:
p = P_MONEY;
break;
case HELP_FIGHT:
p = P_FIGHT;
break;
case HELP_GIVE:
p = P_GIVE;
break;
case HELP_GUARD:
p = P_GUARD;
break;
case HELP_FSTEALTH:
p = P_FACTIONSTEALTH;
break;
}
}
if (p != MAXPARAMS) {
if (hh) {
sbs_strcat(&sbs, ", ");
}
sbs_strcat(&sbs, LOC(f->locale, parameters[p]));
hh = 1;
}
if (p != MAXPARAMS) {
if (hh) {
sbs_strcat(&show->sbs, ", ");
}
sbs_strcat(&show->sbs, LOC(f->locale, parameters[p]));
hh = 1;
}
sbs_strcat(&sbs, ")");
}
sbs_strcat(&sbs, ".");
}
sbs_strcat(&show->sbs, ")");
return 0;
}
static void
show_allies(const faction * f, struct allies * allies, char *buf, size_t size)
{
int num_allies = 0;
allies_walk(allies, count_allies_cb, &num_allies);
if (num_allies > 0) {
struct show_s show;
show.f = f;
show.num_allies = num_allies;
sbs_init(&show.sbs, buf, size);
allies_walk(allies, show_allies_cb, &show);
sbs_strcat(&show.sbs, ".");
}
}
@ -1711,16 +1724,19 @@ static void list_address(struct stream *out, const faction * uf, selist * seenfa
while (flist != NULL) {
const faction *f = (const faction *)selist_get(flist, qi);
if (!is_monsters(f)) {
const char *str;
char buf[8192];
char label = '-';
str = faction_getbanner(f);
sprintf(buf, "%s: %s; %s", factionname(f), faction_getemail(f),
f->banner ? f->banner : "");
str ? str : "");
if (uf == f)
label = '*';
else if (is_allied(uf, f))
else if (is_allied(uf, f)) {
label = 'o';
else if (alliedfaction(NULL, uf, f, HELP_ALL))
}
else if (alliedfaction(uf, f, HELP_ALL))
label = '+';
paragraph(out, buf, 4, 0, label);
}

View file

@ -683,7 +683,7 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
int i, dh;
int getarnt = fval(u, UFL_ANON_FACTION);
const char *pzTmp, *str;
bool isbattle = (bool)(mode == seen_battle);
bool isbattle = (mode == seen_battle);
item *itm, *show = NULL;
faction *fv;
char *bufp = buf;
@ -697,9 +697,8 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
if (!isbattle) {
if (u->faction == f) {
if (fval(u, UFL_GROUP)) {
attrib *a = a_find(u->attribs, &at_group);
if (a) {
group *g = (group *)a->data.v;
group *g = get_group(u);
if (g) {
bufp = STRLCPY(bufp, ", ", size);
bufp = STRLCPY(bufp, groupid(g, f), size);
}
@ -917,7 +916,7 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
}
if (!isbattle) {
int printed = 0;
order *ord;;
order *ord;
for (ord = u->old_orders; ord; ord = ord->next) {
keyword_t kwd = getkeyword(ord);
if (is_repeated(kwd)) {
@ -969,7 +968,7 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
dh = 0;
if (!getarnt) {
if (alliedfaction(rplane(u->region), f, fv, HELP_ALL)) {
if (alliedfaction(f, fv, HELP_ALL)) {
dh = 1;
}
}
@ -1134,7 +1133,6 @@ static void cb_add_address(region *r, unit *ut, void *cbdata) {
if (data->lastf != sf && cansee_unit(ut, u, data->stealthmod)) {
add_seen_faction_i(data->flist, sf);
data->lastf = sf;
break;
}
}
}
@ -1554,14 +1552,6 @@ void prepare_report(report_context *ctx, faction *f)
rule_lighthouse_units = config_get_int("rules.lighthouse.unit_capacity", 0) != 0;
}
if (f->age <= 2) {
if ((f->flags&FFL_PWMSG) == 0) {
/* TODO: this assumes unencrypted passwords */
f->flags |= FFL_PWMSG;
ADDMSG(&f->msgs, msg_message("changepasswd", "value", f->_password));
}
}
ctx->f = f;
ctx->report_time = time(NULL);
ctx->addresses = NULL;

View file

@ -177,7 +177,6 @@ static void test_bufunit_fstealth(CuTest *tc) {
faction *f1, *f2;
region *r;
unit *u;
ally *al;
char buf[256];
struct locale *lang;
@ -232,8 +231,7 @@ static void test_bufunit_fstealth(CuTest *tc) {
u->flags &= ~UFL_ANON_FACTION;
/* we see the same thing as them when we are an ally */
al = ally_add(&f1->allies, f2);
al->status = HELP_FSTEALTH;
ally_set(&f1->allies, f2, HELP_FSTEALTH);
bufunit(f2, u, seen_unit, buf, sizeof(buf));
CuAssertStrEquals(tc, "Hodor (1), TWW (2) (UFO (1)), 1 human.", buf);
@ -442,22 +440,34 @@ static void test_get_addresses_fstealth(CuTest *tc) {
static void test_get_addresses_travelthru(CuTest *tc) {
report_context ctx;
faction *f, *f2, *f1;
faction *f, *f4, *f3, *f2, *f1;
region *r1, *r2;
unit *u;
race *rc;
test_setup();
f = test_create_faction(NULL);
f1 = test_create_faction(NULL);
f2 = test_create_faction(NULL);
r1 = test_create_region(0, 0, NULL);
r2 = test_create_region(1, 0, 0);
u = test_create_unit(f, r2);
travelthru_add(r1, u);
f1 = test_create_faction(NULL);
u = test_create_unit(f1, r1);
f2 = test_create_faction(NULL);
set_factionstealth(u, f2);
u->building = test_create_building(u->region, test_create_buildingtype("tower"));
rc = rc_get_or_create("dragon");
rc->flags |= RCF_UNARMEDGUARD;
f3 = test_create_faction(rc);
u = test_create_unit(f3, r1);
setguard(u, true);
f4 = test_create_faction(NULL);
u = test_create_unit(f4, r1);
set_level(u, SK_STEALTH, 1);
prepare_report(&ctx, f);
CuAssertPtrEquals(tc, r1, ctx.first);
CuAssertPtrEquals(tc, NULL, ctx.last);
@ -466,7 +476,9 @@ static void test_get_addresses_travelthru(CuTest *tc) {
CuAssertTrue(tc, selist_contains(ctx.addresses, f, NULL));
CuAssertTrue(tc, !selist_contains(ctx.addresses, f1, NULL));
CuAssertTrue(tc, selist_contains(ctx.addresses, f2, NULL));
CuAssertIntEquals(tc, 2, selist_length(ctx.addresses));
CuAssertTrue(tc, selist_contains(ctx.addresses, f3, NULL));
CuAssertTrue(tc, !selist_contains(ctx.addresses, f4, NULL));
CuAssertIntEquals(tc, 3, selist_length(ctx.addresses));
finish_reports(&ctx);
test_teardown();
}
@ -791,7 +803,6 @@ static void test_insect_warnings(CuTest *tc) {
test_setup();
test_create_calendar();
test_inject_messagetypes();
f = test_create_faction(test_create_race("insect"));
CuAssertIntEquals(tc, SEASON_AUTUMN, get_gamedate(1083, &gd)->season);
@ -819,7 +830,6 @@ static void test_newbie_warning(CuTest *tc) {
faction *f;
test_setup();
test_inject_messagetypes();
f = test_create_faction(NULL);
config_set_int("NewbieImmunity", 3);
@ -902,7 +912,7 @@ CuSuite *get_reports_suite(void)
SUITE_ADD_TEST(suite, test_region_distance);
SUITE_ADD_TEST(suite, test_region_distance_max);
SUITE_ADD_TEST(suite, test_region_distance_ql);
SUITE_ADD_TEST(suite, test_newbie_password_message);
DISABLE_TEST(suite, test_newbie_password_message);
SUITE_ADD_TEST(suite, test_prepare_report);
SUITE_ADD_TEST(suite, test_seen_neighbours);
SUITE_ADD_TEST(suite, test_seen_travelthru);

View file

@ -118,7 +118,9 @@ skill_t get_skill(const char *s, const struct locale * lang)
int skill_cost(skill_t sk) {
static int config;
static int costs[MAXSKILLS];
int cost;
int cost = -1;
assert(sk >= 0 && sk < MAXSKILLS);
switch (sk) {
case SK_SPY:
cost = 100;
@ -148,5 +150,6 @@ int skill_cost(skill_t sk) {
}
bool expensive_skill(skill_t sk) {
assert(sk >= 0 && sk < MAXSKILLS);
return (sk == SK_MAGIC) || skill_cost(sk) > 0;
}

View file

@ -27,10 +27,6 @@
#include <string.h>
#include <assert.h>
static void setup_spells(void) {
test_inject_messagetypes();
}
static void test_good_dreams(CuTest *tc) {
struct region *r;
struct faction *f1, *f2;
@ -40,7 +36,6 @@ static void test_good_dreams(CuTest *tc) {
curse *curse;
test_setup();
setup_spells();
test_create_world();
r = findregion(0, 0);
f1 = test_create_faction(NULL);
@ -70,7 +65,6 @@ static void test_dreams(CuTest *tc) {
castorder co;
test_setup();
setup_spells();
r = test_create_region(0, 0, NULL);
f1 = test_create_faction(NULL);
f2 = test_create_faction(NULL);
@ -98,7 +92,6 @@ static void test_bad_dreams(CuTest *tc) {
curse *curse;
test_setup();
setup_spells();
test_create_world();
r = findregion(0, 0);
f1 = test_create_faction(NULL);
@ -129,7 +122,6 @@ static void test_view_reality(CuTest *tc) {
castorder co;
test_setup();
setup_spells();
mt_create_va(mt_new("spell_astral_only", NULL),
"unit:unit", "region:region", "command:order", MT_NEW_END);
mt_create_va(mt_new("viewreality_effect", NULL),
@ -165,7 +157,6 @@ static void test_watch_region(CuTest *tc) {
region *r;
faction *f;
test_setup();
setup_spells();
r = test_create_region(0, 0, NULL);
f = test_create_faction(NULL);
CuAssertIntEquals(tc, -1, get_observer(r, f));

View file

@ -1539,12 +1539,7 @@ int sp_undeadhero(struct castorder * co)
/* new units gets some stats from old unit */
if (du->display) {
unit_setinfo(u, du->display);
}
else {
unit_setinfo(u, NULL);
}
unit_setinfo(u, unit_getinfo(du));
unit_setstatus(u, du->status);
setguard(u, false);
for (ilist = &du->items; *ilist;) {

View file

@ -524,6 +524,48 @@ static void msg_teachers(struct selist *teachers, struct unit *u, skill_t sk) {
selist_foreach_ex(teachers, cb_msg_teach, &cbdata);
}
bool check_student(const struct unit *u, struct order *ord, skill_t sk) {
int err = 0;
if (sk < 0) {
err = 77;
}
/* Hack: Talente mit Malus -99 koennen nicht gelernt werden */
else if (u_race(u)->bonus[sk] == -99) {
err = 771;
}
else {
static int config;
static bool learn_newskills;
if (config_changed(&config)) {
learn_newskills = config_get_int("study.newskills", 1) != 0;
}
if (!learn_newskills) {
skill *sv = unit_skill(u, sk);
if (sv == NULL) {
/* we can only learn skills we already have */
err = 771;
}
}
}
if (err) {
if (ord) {
cmistake(u, ord, err, MSG_EVENT);
}
return false;
}
if ((u_race(u)->flags & RCF_NOLEARN) || fval(u, UFL_WERE)) {
if (ord) {
ADDMSG(&u->faction->msgs,
msg_feedback(u, ord, "error_race_nolearn", "race", u_race(u)));
}
return false;
}
return true;
}
int study_cmd(unit * u, order * ord)
{
region *r = u->region;
@ -537,7 +579,6 @@ int study_cmd(unit * u, order * ord)
skill_t sk;
int maxalchemy = 0;
int speed_rule = (study_rule_t)config_get_int("study.speedup", 0);
bool learn_newskills = config_get_int("study.newskills", 1) != 0;
static const race *rc_snotling;
static int rc_cache;
@ -545,32 +586,12 @@ int study_cmd(unit * u, order * ord)
rc_snotling = get_race(RC_SNOTLING);
}
if (!unit_can_study(u)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race",
u_race(u)));
return -1;
}
(void)init_order(ord, u->faction->locale);
sk = getskill(u->faction->locale);
if (sk < 0) {
cmistake(u, ord, 77, MSG_EVENT);
if (!check_student(u, ord, sk)) {
return -1;
}
/* Hack: Talente mit Malus -99 koennen nicht gelernt werden */
if (u_race(u)->bonus[sk] == -99) {
cmistake(u, ord, 771, MSG_EVENT);
return -1;
}
if (!learn_newskills) {
skill *sv = unit_skill(u, sk);
if (sv == NULL) {
/* we can only learn skills we already have */
cmistake(u, ord, 771, MSG_EVENT);
return -1;
}
}
/* snotlings koennen Talente nur bis T8 lernen */
if (u_race(u) == rc_snotling) {

View file

@ -48,6 +48,7 @@ extern "C" {
skill_t getskill(const struct locale *lang);
bool is_migrant(struct unit *u);
int study_cost(struct unit *u, skill_t sk);
bool check_student(const struct unit *u, struct order *ord, skill_t sk);
typedef void(*learn_fun)(struct unit *u, skill_t sk, int days);

View file

@ -58,6 +58,11 @@ typedef struct {
} study_fixture;
static void setup_study(void) {
test_setup();
mt_create_error(178);
mt_create_error(65);
mt_create_va(mt_new("teach_asgood", NULL),
"unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END);
mt_create_va(mt_new("studycost", NULL),
"unit:unit", "region:region", "cost:int", "skill:int", MT_NEW_END);
mt_create_va(mt_new("teach_teacher", NULL),
@ -81,7 +86,7 @@ static void setup_teacher(study_fixture *fix, skill_t sk) {
struct locale *lang;
assert(fix);
test_setup();
setup_study();
config_set("study.random_progress", "0");
r = test_create_region(0, 0, NULL);
f = test_create_faction(NULL);
@ -148,7 +153,7 @@ static void test_study_bug_2194(CuTest *tc) {
struct locale * loc;
building * b;
test_setup();
setup_study();
random_source_inject_constant(0.0);
init_resources();
loc = test_create_locale();
@ -205,7 +210,7 @@ static void test_produceexp(CuTest *tc) {
unit *u;
g_tc = tc;
test_setup();
setup_study();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 2);
config_set("study.produceexp", "20");
@ -220,7 +225,7 @@ static void test_academy_building(CuTest *tc) {
building * b;
message * msg;
test_setup();
setup_study();
mt_create_va(mt_new("teach_asgood", NULL),
"unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END);
@ -271,7 +276,6 @@ static void test_academy_bonus(CuTest *tc) {
struct locale * loc;
building * b;
test_setup();
setup_study();
random_source_inject_constant(0.0);
@ -328,7 +332,8 @@ static void test_academy_bonus(CuTest *tc) {
void test_learn_skill_single(CuTest *tc) {
unit *u;
skill *sv;
test_setup();
setup_study();
config_set("study.random_progress", "0");
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
learn_skill(u, SK_ALCHEMY, STUDYDAYS);
@ -347,7 +352,8 @@ void test_learn_skill_single(CuTest *tc) {
void test_learn_skill_multi(CuTest *tc) {
unit *u;
skill *sv;
test_setup();
setup_study();
config_set("study.random_progress", "0");
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 10);
@ -367,7 +373,8 @@ void test_learn_skill_multi(CuTest *tc) {
static void test_demon_skillchanges(CuTest *tc) {
unit * u;
const race * rc;
test_setup();
setup_study();
rc = test_create_race("demon");
CuAssertPtrEquals(tc, (void *)rc, (void *)get_race(RC_DAEMON));
u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL));
@ -380,7 +387,8 @@ static void test_demon_skillchanges(CuTest *tc) {
static void test_study_cmd(CuTest *tc) {
unit *u;
test_setup();
setup_study();
init_resources();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
u->thisorder = create_order(K_STUDY, u->faction->locale, "CROSSBOW");
@ -399,7 +407,6 @@ static void test_study_magic(CuTest *tc) {
const struct locale *lang;
const struct item_type *itype;
test_setup();
setup_study();
init_resources();
f = test_create_faction(NULL);
@ -432,7 +439,6 @@ static void test_study_magic(CuTest *tc) {
static void test_study_cost_magic(CuTest *tc) {
unit * u;
test_setup();
setup_study();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
@ -456,7 +462,6 @@ static void test_study_cost(CuTest *tc) {
unit *u;
const struct item_type *itype;
test_setup();
setup_study();
itype = test_create_silver();
@ -484,7 +489,6 @@ static void test_teach_magic(CuTest *tc) {
faction *f;
const struct item_type *itype;
test_setup();
setup_study();
init_resources();
itype = get_resourcetype(R_SILVER)->itype;
@ -510,7 +514,8 @@ static void test_teach_magic(CuTest *tc) {
static void test_teach_cmd(CuTest *tc) {
unit *u, *ut;
test_setup();
setup_study();
init_resources();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 10);
@ -530,7 +535,8 @@ static void test_teach_cmd(CuTest *tc) {
static void test_teach_two(CuTest *tc) {
unit *u1, *u2, *ut;
test_setup();
setup_study();
init_resources();
u1 = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u1, 5);
@ -560,7 +566,7 @@ static void test_teach_two_skills(CuTest *tc) {
faction *f;
region *r;
test_setup();
setup_study();
init_resources();
f = test_create_faction(NULL);
r = test_create_region(0, 0, NULL);
@ -590,7 +596,8 @@ static void test_teach_two_skills(CuTest *tc) {
static void test_teach_one_to_many(CuTest *tc) {
unit *u, *ut;
test_setup();
setup_study();
init_resources();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 20);
@ -611,7 +618,7 @@ static void test_teach_one_to_many(CuTest *tc) {
static void test_teach_many_to_one(CuTest *tc) {
unit *u, *u1, *u2;
test_setup();
setup_study();
init_resources();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 20);
@ -636,14 +643,9 @@ static void test_teach_many_to_one(CuTest *tc) {
static void test_teach_message(CuTest *tc) {
unit *u, *u1, *u2;
attrib *a;
ally *al;
teaching_info *teach;
test_setup();
mt_create_va(mt_new("teach_teacher", NULL),
"teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END);
mt_create_va(mt_new("teach_student", NULL),
"teacher:unit", "student:unit", "skill:int", MT_NEW_END);
setup_study();
init_resources();
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
scale_number(u, 20);
@ -652,8 +654,7 @@ static void test_teach_message(CuTest *tc) {
set_level(u1, SK_CROSSBOW, TEACHDIFFERENCE);
u1->thisorder = create_order(K_TEACH, u->faction->locale, itoa36(u->no));
u2 = test_create_unit(test_create_faction(NULL), u->region);
al = ally_add(&u->faction->allies, u2->faction);
al->status = HELP_GUARD;
ally_set(&u->faction->allies, u2->faction, HELP_GUARD);
set_level(u2, SK_CROSSBOW, TEACHDIFFERENCE);
u2->thisorder = create_order(K_TEACH, u->faction->locale, itoa36(u->no));
CuAssertTrue(tc, !alliedunit(u, u1->faction, HELP_GUARD));
@ -683,7 +684,7 @@ static void test_teach_many_to_many(CuTest *tc) {
region *r;
faction *f;
test_setup();
setup_study();
init_resources();
f = test_create_faction(NULL);
r = test_create_region(0, 0, NULL);

View file

@ -138,7 +138,6 @@ int RunAllTests(int argc, char *argv[])
ADD_SUITE(monsters);
ADD_SUITE(move);
ADD_SUITE(names);
ADD_SUITE(orderdb);
ADD_SUITE(orderfile);
ADD_SUITE(otherfaction);
ADD_SUITE(piracy);

View file

@ -305,15 +305,10 @@ void test_create_calendar(void) {
month_season[8] = SEASON_SUMMER;
}
void test_inject_messagetypes(void)
{
message_handle_missing(MESSAGE_MISSING_REPLACE);
}
void test_setup_test(CuTest *tc, const char *file, int line) {
test_log_stderr(LOG_CPERROR);
test_reset();
message_handle_missing(MESSAGE_MISSING_ERROR);
message_handle_missing(MESSAGE_MISSING_REPLACE);
if (tc) {
log_debug("start test: %s", tc->name);
}
@ -325,6 +320,7 @@ void test_setup_test(CuTest *tc, const char *file, int line) {
void test_teardown(void)
{
message_handle_missing(MESSAGE_MISSING_IGNORE);
test_reset();
test_log_stderr(0);
}

View file

@ -76,7 +76,6 @@ extern "C" {
void assert_string_parameter(struct CuTest * tc, struct message *msg, int index, const char *arg);
void disabled_test(void *suite, void (*)(struct CuTest *), const char *name);
void test_inject_messagetypes(void);
#define DISABLE_TEST(SUITE, TEST) disabled_test(SUITE, TEST, #TEST)

View file

@ -87,7 +87,7 @@ static int changefaction_read(trigger * t, gamedata *data)
changefaction_data *td = (changefaction_data *)t->data.v;
read_unit_reference(data, &td->unit, NULL);
return read_faction_reference(data, &td->faction, NULL) > 0 ? AT_READ_OK : AT_READ_FAIL;
return read_faction_reference(data, &td->faction) > 0 ? AT_READ_OK : AT_READ_FAIL;
}
trigger_type tt_changefaction = {

View file

@ -94,12 +94,12 @@ static int createunit_read(trigger * t, gamedata *data)
int id;
int result = AT_READ_OK;
id = read_faction_reference(data, &td->f, NULL);
id = read_faction_reference(data, &td->f);
if (id <= 0) {
result = AT_READ_FAIL;
}
read_region_reference(data, &td->r, NULL);
read_region_reference(data, &td->r);
td->race = read_race_reference(data->store);
if (!td->race) {
result = AT_READ_FAIL;

View file

@ -75,8 +75,8 @@ static void gate_write(const trigger * t, struct storage *store)
static int gate_read(trigger * t, gamedata *data)
{
gate_data *gd = (gate_data *)t->data.v;
int bc = read_building_reference(data, &gd->gate, NULL);
int rc = read_region_reference(data, &gd->target, NULL);
int bc = read_building_reference(data, &gd->gate);
int rc = read_region_reference(data, &gd->target);
if (bc <= 0 && rc <= 0) {
return AT_READ_FAIL;

View file

@ -167,7 +167,7 @@ void get_food(region * r)
struct faction *owner = region_get_owner(r);
/* if the region is owned, and the owner is nice, then we'll get
* food from the peasants - should not be used with WORK */
if (owner != NULL && (get_alliance(owner, u->faction) & HELP_MONEY)) {
if (owner != NULL && alliedfaction(owner, u->faction, HELP_MONEY)) {
int rm = rmoney(r);
int use = (rm < need) ? rm : need;
rsetmoney(r, rm - use);

View file

@ -1,6 +1,7 @@
#include <platform.h>
#include "upkeep.h"
#include <kernel/ally.h>
#include <kernel/config.h>
#include <kernel/faction.h>
#include <kernel/region.h>
@ -117,7 +118,7 @@ void test_upkeep_from_friend(CuTest * tc)
f1 = test_create_faction(test_create_race("human"));
f2 = test_create_faction(test_create_race("human"));
assert(f1 && f2);
set_alliance(f1, f2, HELP_MONEY);
ally_set(&f1->allies, f2, HELP_MONEY);
u1 = test_create_unit(f1, r);
u2 = test_create_unit(f2, r);
assert(r && u1 && u2);

View file

@ -58,8 +58,8 @@ static const char *getbuf_utf8(FILE * F)
eatwhite(bp, &white); /* decoding errors will get caught later on, don't have to check */
bp += white;
comment = (bool)(comment && cont);
quote = (bool)(quote && cont);
comment = (comment && cont);
quote = (quote && cont);
if (tail[1] == 0) {
/* we read the maximum number of bytes! */

View file

@ -192,6 +192,16 @@ message_type *mt_create_va(message_type *mtype, ...)
return mt_create(mtype, args, i - 1);
}
message_type *mt_create_feedback(const char *name) {
return mt_create_va(mt_new(name, NULL), "unit:unit", "region:region", "command:order", MT_NEW_END);
}
message_type *mt_create_error(int error) {
char name[16];
snprintf(name, sizeof(name), "error%d", error);
return mt_create_feedback(name);
}
static variant copy_arg(const arg_type * atype, variant data)
{
assert(atype != NULL);

View file

@ -64,6 +64,8 @@ extern "C" {
struct message_type *mt_new(const char *name, const char *section);
/** message_type registry (optional): **/
struct message_type *mt_create(struct message_type *, const char *args[], int nargs);
struct message_type *mt_create_feedback(const char *name);
struct message_type *mt_create_error(int error);
struct message_type *mt_create_va(struct message_type *, ...);
const struct message_type *mt_find(const char *);

View file

@ -103,7 +103,7 @@ static int wormhole_read(variant *var, void *owner, struct gamedata *data)
if (data->version < ATTRIBOWNER_VERSION) {
READ_INT(data->store, NULL);
}
id = read_region_reference(data, (region **)&var->v, NULL);
id = read_region_reference(data, (region **)&var->v);
return (id <= 0) ? AT_READ_FAIL : AT_READ_OK;
}