diff --git a/CMakeLists.txt b/CMakeLists.txt index b1211955a..7e7311253 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,12 @@ else (MSVC) find_package (Curses) endif (MSVC) -find_package (SQLite3) -find_package (BerkeleyDB) +if (ERESSEA_DB STREQUAL "db") +find_package (BerkeleyDB REQUIRED QUIET) +else() +find_package (SQLite3 REQUIRED QUIET) +endif() + find_package (LibXml2 REQUIRED) find_package (ToLua REQUIRED) if (TOLUA_FOUND) diff --git a/s/build b/s/build index e47ecf903..636777541 100755 --- a/s/build +++ b/s/build @@ -31,15 +31,18 @@ if [ ! -d $ROOT/$BUILD ]; then fi echo "build eressea" +CMAKE_ARGS=".." cd $ROOT/$BUILD BRANCH=$(git status -s -b | head -1 | cut -d\ -f 2 | sed 's/\..*//') if [ "$BRANCH" = "master" ] ; then VERSION=$(git describe --match 'v*.*.*' --tags | sed 's/^v//') echo "$BRANCH $VERSION" -cmake -DERESSEA_VERSION="$VERSION" .. +CMAKE_ARGS="-DERESSEA_VERSION=$VERSION ${CMAKE_ARGS}" else REV=$(git rev-parse --short HEAD) -cmake -DERESSEA_BUILDNO="$REV" .. +CMAKE_ARGS="-DERESSEA_BUILDNO=$REV $CMAKE_ARGS" fi + +cmake ${CMAKE_ARGS} make $MAKEOPTS && make test cd $OLDPWD diff --git a/s/cmake-init b/s/cmake-init index 3d4e073a7..7adbc9a0b 100755 --- a/s/cmake-init +++ b/s/cmake-init @@ -1,5 +1,20 @@ #!/bin/sh +ERESSEA_DB=sqlite +if [ -e /usr/include/db.h ] ; then +ERESSEA_DB=db +fi + +# Parse command line arguments +while [ ! -z "$1" ] ; do +if [ "$1" = "--with-db" ] ; then +ERESSEA_DB=db +elif [ "$1" = "--with-sqlite" ] ; then +ERESSEA_DB=sqlite +fi +shift 1 +done + ROOT=$(git rev-parse --show-toplevel) [ -z $BUILD ] && BUILD=Debug [ -z "$CC" ] && [ ! -z `which clang` ] && CC="clang" @@ -15,8 +30,6 @@ mkdir -p $BIN_DIR rm -f $BUILD ln -sf $BIN_DIR $BUILD -rm -f CMakeCache.txt - # use anything installed in /opt or /usr LIBRARY_PATH=/opt/lib:/opt/lib/$MACHINE:/usr/lib/$MACHINE INCLUDE_PATH=/opt/include:/usr/include @@ -30,11 +43,6 @@ if [ -d $HOME/usr ]; then fi DEST=$(dirname $ROOT)/server -ARGS=" -DCMAKE_BUILD_TYPE=$BUILD \ - -DCMAKE_LIBRARY_PATH=$LIBRARY_PATH \ - -DCMAKE_PREFIX_PATH=$PREFIX_PATH \ - -DCMAKE_INSTALL_PREFIX=$DEST" -# -DCMAKE_INCLUDE_PATH=$INCLUDE_PATH git submodule update --init @@ -46,7 +54,17 @@ elif [ -d /usr/local/include/lua5.1 ]; then LUA_DIR=/usr/local LUA_VERSION="5.1" fi -export LUA_DIR + +cat >| $BUILD/config.cmake <> $BUILD/config.cmake path="$(which tolua)" if [ "$HAVE_TOLUA" = "0" ] || [ -z $path ] ; then @@ -59,7 +77,7 @@ if [ "$HAVE_TOLUA" = "0" ] || [ -z $path ] ; then echo "building tolua..." cd tolua make - ARGS="$ARGS -DPC_TOLUA_DIR=$ROOT/tolua" + echo 'SET(PC_TOLUA_DIR "$ROOT/tolua" CACHE PATH "tolua root")' >> $BUILD/config.cmake else echo "tolua is $path" fi @@ -68,6 +86,6 @@ unset path set -e cd $BIN_DIR -cmake .. $ARGS $* +cmake -C config.cmake .. $* cd $OLDPWD diff --git a/scripts/run-turn.lua b/scripts/run-turn.lua index 88744db94..34340d43c 100644 --- a/scripts/run-turn.lua +++ b/scripts/run-turn.lua @@ -129,7 +129,6 @@ function process(rules, orders) end turn_begin() - init_summary() -- run the turn: if eressea.read_orders(orders) ~= 0 then diff --git a/src/bindings.c b/src/bindings.c index 96ba2691d..b399dbdb8 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -518,26 +518,15 @@ static int tolua_write_passwords(lua_State * L) return 0; } -static struct summary *sum_begin = 0; -static int tolua_init_summary(lua_State * L) -{ - UNUSED_ARG(L); - sum_begin = make_summary(); - return 0; -} - static int tolua_write_summary(lua_State * L) { + struct summary *sum; UNUSED_ARG(L); - if (sum_begin) { - struct summary *sum_end = make_summary(); - report_summary(sum_end, sum_begin, false); - report_summary(sum_end, sum_begin, true); - free_summary(sum_end); - free_summary(sum_begin); - sum_begin = 0; - return 0; - } + + sum = make_summary(); + report_summary(sum, false); + report_summary(sum, true); + free_summary(sum); return 0; } /* @@ -1073,7 +1062,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "init_reports", tolua_init_reports); tolua_function(L, TOLUA_CAST "write_reports", tolua_write_reports); tolua_function(L, TOLUA_CAST "write_report", tolua_write_report); - tolua_function(L, TOLUA_CAST "init_summary", tolua_init_summary); tolua_function(L, TOLUA_CAST "write_summary", tolua_write_summary); tolua_function(L, TOLUA_CAST "write_passwords", tolua_write_passwords); tolua_function(L, TOLUA_CAST "message_unit", tolua_message_unit); diff --git a/src/summary.c b/src/summary.c index 160346ba2..79ffd1b6d 100644 --- a/src/summary.c +++ b/src/summary.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -52,8 +53,8 @@ typedef struct summary { int peasants; int nunits; int playerpop; - double playermoney; - double peasantmoney; + long long int playermoney; + long long int peasantmoney; int armed_men; int poprace[MAXRACES]; int factionrace[MAXRACES]; @@ -111,22 +112,6 @@ int update_nmrs(void) return newplayers; } -static char *pcomp(double i, double j) -{ - static char buf[32]; - sprintf(buf, "%.0f (%s%.0f)", i, (i >= j) ? "+" : "", i - j); - return buf; -} - -static char *rcomp(int i, int j) -{ - static char buf[32]; - sprintf(buf, "%d (%s%d,%s%d%%)", - i, (i >= j) ? "+" : "", i - j, (i >= j) ? "+" : "", - j ? ((i - j) * 100) / j : 0); - return buf; -} - static void out_faction(FILE * file, const struct faction *f) { if (alliances != NULL) { @@ -185,10 +170,73 @@ static void writeturn(void) fclose(f); } -void report_summary(summary * s, summary * o, bool full) +static int count_umlaut(const char *s) +{ + int result = 0; + const char *cp; + for (cp = s; *cp; ++cp) { + ucs4_t ucs = *cp; + if (ucs & 0x80) { + size_t size; + ++result; + unicode_utf8_to_ucs4(&ucs, cp, &size); + cp += size; + } + } + return result; +} + +static void summarize_races(const summary *s, FILE *F, bool full) { + int i; + for (i = 0; i < MAXRACES; i++) { + if (s->poprace[i] > 0) { + const char *pad = " "; + int lpad = (int)strlen(pad); + const race *rc = get_race(i); + const char *rcname = LOC(default_locale, rc_name_s(rc, NAME_PLURAL)); + lpad -= count_umlaut(rcname); + assert(lpad >= 0); + if (full) { + fputs(pad + lpad, F); + fprintf(F, "%20s: ", rcname); + fprintf(F, "%8d\n", s->poprace[i]); + } + else if (i != RC_TEMPLATE && i != RC_CLONE) { + if (playerrace(rc)) { + fputs(pad + lpad, F); + fprintf(F, "%16s: ", rcname); + fprintf(F, "%8d\n", s->poprace[i]); + } + } + } + } +} + +static void summarize_players(const summary *s, FILE *F) { + int i; + const char * suffix = LOC(default_locale, "stat_tribe_p"); + + for (i = 0; i < MAXRACES; i++) { + if (i != RC_TEMPLATE && i != RC_CLONE && s->factionrace[i]) { + const race *rc = get_race(i); + if (rc && playerrace(rc)) { + const char * pad = " "; + int lpad = (int)strlen(pad); + const char *rccat = LOC(default_locale, rc_name_s(rc, NAME_CATEGORY)); + lpad -= count_umlaut(rccat); + assert(lpad >= 0); + fputs(pad + lpad, F); + fprintf(F, "%16s%s:", rccat, suffix); + fprintf(F, "%8d\n", s->factionrace[i]); + } + } + } +} + +void report_summary(const summary * s, bool full) { FILE *F = NULL; - int i, newplayers = 0; + int newplayers = 0; faction *f; char zText[4096]; int timeout = NMRTimeout(); @@ -212,120 +260,82 @@ void report_summary(summary * s, summary * o, bool full) #endif log_info("writing summary to file: parteien.\n"); fprintf(F, "%s\n%s\n\n", game_name(), gamedate2(default_locale)); - fprintf(F, "Auswertung Nr: %d\n\n", turn); - fprintf(F, "Parteien: %s\n", pcomp(s->factions, o->factions)); - fprintf(F, "Einheiten: %s\n", pcomp(s->nunits, o->nunits)); - fprintf(F, "Spielerpopulation: %s\n", pcomp(s->playerpop, o->playerpop)); - fprintf(F, " davon bewaffnet: %s\n", pcomp(s->armed_men, o->armed_men)); - fprintf(F, " Helden: %s\n", pcomp(s->heroes, o->heroes)); + fprintf(F, "Auswertung Nr: %8d\n\n", turn); + fprintf(F, "Parteien: %8d\n", s->factions); + fprintf(F, "Einheiten: %8d\n", s->nunits); + fprintf(F, "Spielerpopulation: %8d\n", s->playerpop); + fprintf(F, " davon bewaffnet: %8d\n", s->armed_men); + fprintf(F, " Helden: %8d\n", s->heroes); if (full) { - fprintf(F, "Regionen: %d\n", (int)listlen(regions)); - fprintf(F, "Bewohnte Regionen: %d\n", s->inhabitedregions); - fprintf(F, "Landregionen: %d\n", s->landregionen); - fprintf(F, "Spielerregionen: %d\n", s->regionen_mit_spielern); - fprintf(F, "Landspielerregionen: %d\n", s->landregionen_mit_spielern); - fprintf(F, "Inaktive Vulkane: %d\n", s->inactive_volcanos); - fprintf(F, "Aktive Vulkane: %d\n\n", s->active_volcanos); + fprintf(F, "Regionen: %8d\n", (int)listlen(regions)); + fprintf(F, "Bewohnte Regionen: %8d\n", s->inhabitedregions); + fprintf(F, "Landregionen: %8d\n", s->landregionen); + fprintf(F, "Spielerregionen: %8d\n", s->regionen_mit_spielern); + fprintf(F, "Landspielerregionen: %8d\n", s->landregionen_mit_spielern); + fprintf(F, "Inaktive Vulkane: %8d\n", s->inactive_volcanos); + fprintf(F, "Aktive Vulkane: %8d\n\n", s->active_volcanos); } - for (i = 0; i < MAXRACES; i++) { - if (i != RC_TEMPLATE && i != RC_CLONE && s->factionrace[i]) { - const race *rc = get_race(i); - if (rc && playerrace(rc)) { - fprintf(F, "%13s%s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_CATEGORY)), - LOC(default_locale, "stat_tribe_p"), pcomp(s->factionrace[i], - o->factionrace[i])); - } - } - } + summarize_players(s, F); if (full) { fprintf(F, "\n"); { struct language *plang = s->languages; while (plang != NULL) { - struct language *olang = o->languages; - int nold = 0; - while (olang && olang->locale != plang->locale) - olang = olang->next; - if (olang) - nold = olang->number; - fprintf(F, "Sprache %12s: %s\n", locale_name(plang->locale), - rcomp(plang->number, nold)); + fprintf(F, "Sprache %2s: %8d\n", locale_name(plang->locale), + plang->number); plang = plang->next; } } } fprintf(F, "\n"); - if (full) { - for (i = 0; i < MAXRACES; i++) { - if (s->poprace[i]) { - const race *rc = get_race(i); - fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_PLURAL)), - rcomp(s->poprace[i], o->poprace[i])); - } - } - } - else { - for (i = 0; i < MAXRACES; i++) { - if (i != RC_TEMPLATE && i != RC_CLONE && s->poprace[i]) { - const race *rc = get_race(i); - if (playerrace(rc)) { - fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name_s(rc, NAME_PLURAL)), - rcomp(s->poprace[i], o->poprace[i])); - } - } - } - } + summarize_races(s, F, full); if (full) { - fprintf(F, "\nWaffen: %s\n", pcomp(s->waffen, o->waffen)); - fprintf(F, "Ruestungen: %s\n", - pcomp(s->ruestungen, o->ruestungen)); - fprintf(F, "ungezaehmte Pferde: %s\n", pcomp(s->pferde, o->pferde)); - fprintf(F, "gezaehmte Pferde: %s\n", - pcomp(s->spielerpferde, o->spielerpferde)); - fprintf(F, "Schiffe: %s\n", pcomp(s->schiffe, o->schiffe)); - fprintf(F, "Gebaeude: %s\n", pcomp(s->gebaeude, o->gebaeude)); + fprintf(F, "\nWaffen: %8d\n", s->waffen); + fprintf(F, "Ruestungen: %8d\n", s->ruestungen); + fprintf(F, "ungezaehmte Pferde: %8d\n", s->pferde); + fprintf(F, "gezaehmte Pferde: %8d\n", s->spielerpferde); + fprintf(F, "Schiffe: %8d\n", s->schiffe); + fprintf(F, "Gebaeude: %8d\n", s->gebaeude); - fprintf(F, "\nBauernpopulation: %s\n", pcomp(s->peasants, o->peasants)); + fprintf(F, "\nBauernpopulation: %8d\n", s->peasants); - fprintf(F, "Population gesamt: %d\n\n", s->playerpop + s->peasants); + fprintf(F, "Population gesamt: %8d\n\n", s->playerpop + s->peasants); - fprintf(F, "Reichtum Spieler: %s Silber\n", - pcomp(s->playermoney, o->playermoney)); - fprintf(F, "Reichtum Bauern: %s Silber\n", - pcomp(s->peasantmoney, o->peasantmoney)); - fprintf(F, "Reichtum gesamt: %s Silber\n\n", - pcomp(s->playermoney + s->peasantmoney, - o->playermoney + o->peasantmoney)); + fprintf(F, "Reichtum Spieler: %12lld Silber\n", s->playermoney); + fprintf(F, "Reichtum Bauern: %12lld Silber\n", s->peasantmoney); + fprintf(F, "Reichtum gesamt: %12lld Silber\n\n", + s->playermoney + s->peasantmoney); } - fprintf(F, "\n\n"); + fprintf(F, "\n"); newplayers = update_nmrs(); if (nmrs) { + int i; for (i = 0; i <= timeout; ++i) { if (i == timeout) { - fprintf(F, "+ NMR:\t\t %d\n", nmrs[i]); + fprintf(F, "+ NMR: %3d\n", nmrs[i]); } else { - fprintf(F, "%d NMR:\t\t %d\n", i, nmrs[i]); + fprintf(F, "%d NMR: %3d\n", i, nmrs[i]); } } } if (age) { if (age[2] != 0) { - fprintf(F, "Erstabgaben:\t %d%%\n", 100 - (dropouts[0] * 100 / age[2])); + fprintf(F, "Erstabgaben: %3d%%\n", 100 - (dropouts[0] * 100 / age[2])); } if (age[3] != 0) { - fprintf(F, "Zweitabgaben:\t %d%%\n", 100 - (dropouts[1] * 100 / age[3])); + fprintf(F, "Zweitabgaben: %3d%%\n", 100 - (dropouts[1] * 100 / age[3])); } } - fprintf(F, "Neue Spieler:\t %d\n", newplayers); + fprintf(F, "Neue Spieler: %d\n", newplayers); if (full) { if (factions) { @@ -336,6 +346,7 @@ void report_summary(summary * s, summary * o, bool full) } if (timeout>0 && full) { + int i; fprintf(F, "\n\nFactions with NMRs:\n"); for (i = timeout; i > 0; --i) { for (f = factions; f; f = f->next) { diff --git a/src/summary.h b/src/summary.h index b12d74009..22832e4cb 100644 --- a/src/summary.h +++ b/src/summary.h @@ -19,7 +19,7 @@ extern "C" { struct summary; - void report_summary(struct summary *n, struct summary *o, bool full); + void report_summary(const struct summary *sum, bool full); struct summary *make_summary(void); void free_summary(struct summary *sum); int update_nmrs(void); diff --git a/src/summary.test.c b/src/summary.test.c index 6448c5e66..5df4849c3 100644 --- a/src/summary.test.c +++ b/src/summary.test.c @@ -15,7 +15,7 @@ static void test_summary(CuTest * tc) test_create_faction(NULL); test_create_faction(NULL); sum = make_summary(); - report_summary(sum, sum, true); + report_summary(sum, true); CuAssertIntEquals(tc, 0, remove("parteien.full")); CuAssertIntEquals(tc, 0, remove("datum")); CuAssertIntEquals(tc, 0, remove("turn"));