Merge remote-tracking branch 'upstream/master' into develop

Conflicts:
	.travis.yml
	s/build
	s/cmake-init
	s/runtests
	src/buildno.h
	src/kernel/config.c
	src/kernel/save.c
	src/kernel/unit.c
	src/laws.c
	src/move.c
This commit is contained in:
Enno Rehling 2015-08-03 19:43:26 +02:00
commit 2288b8fb27
6 changed files with 50 additions and 60 deletions

View File

@ -530,7 +530,9 @@ int alliedunit(const unit * u, const faction * f2, int mode)
ally *sf; ally *sf;
int automode; int automode;
assert(u && u->region); /* the unit should be in a region, but it's possible that u->number==0 (TEMP units) */ 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) if (u->faction == f2)
return mode; return mode;
if (u->faction != NULL && f2 != NULL) { if (u->faction != NULL && f2 != NULL) {

View File

@ -233,7 +233,7 @@ static faction *factionorders(void)
f->no, pass)); f->no, pass));
return 0; return 0;
} }
/* Die Partei hat sich zumindest gemeldet, so daß sie noch /* Die Partei hat sich zumindest gemeldet, so dass sie noch
* nicht als untätig gilt */ * nicht als untätig gilt */
/* TODO: +1 ist ein Workaround, weil cturn erst in process_orders /* TODO: +1 ist ein Workaround, weil cturn erst in process_orders
@ -309,8 +309,8 @@ int readorders(const char *filename)
* Partei, eine neue Einheit oder das File-Ende. Das switch() wird erneut * Partei, eine neue Einheit oder das File-Ende. Das switch() wird erneut
* durchlaufen, und die entsprechende Funktion aufgerufen. Man darf buf * durchlaufen, und die entsprechende Funktion aufgerufen. Man darf buf
* auf alle Fälle nicht überschreiben! Bei allen anderen Einträgen hier * auf alle Fälle nicht überschreiben! Bei allen anderen Einträgen hier
* muß buf erneut gefüllt werden, da die betreffende Information in nur * muss buf erneut gefüllt werden, da die betreffende Information in nur
* einer Zeile steht, und nun die nächste gelesen werden muß. */ * einer Zeile steht, und nun die nächste gelesen werden muss. */
case P_NEXT: case P_NEXT:
f = NULL; f = NULL;
@ -1603,7 +1603,6 @@ int readgame(const char *filename, bool backup)
while (--p >= 0) { while (--p >= 0) {
unit *u = read_unit(&gdata); unit *u = read_unit(&gdata);
sc_mage *mage;
if (gdata.version < JSON_REPORT_VERSION) { if (gdata.version < JSON_REPORT_VERSION) {
if (u->_name && fval(u->faction, FFL_NPC)) { if (u->_name && fval(u->faction, FFL_NPC)) {
@ -1618,21 +1617,6 @@ int readgame(const char *filename, bool backup)
up = &u->next; up = &u->next;
update_interval(u->faction, u->region); update_interval(u->faction, u->region);
mage = get_mage(u);
if (mage) {
faction *f = u->faction;
int skl = effskill(u, SK_MAGIC);
if (!fval(f, FFL_NPC) && f->magiegebiet == M_GRAY) {
log_error("faction %s had magic=gray, fixing (%s)\n", factionname(f), magic_school[mage->magietyp]);
f->magiegebiet = mage->magietyp;
}
if (f->max_spelllevel < skl) {
f->max_spelllevel = skl;
}
if (mage->spellcount < 0) {
mage->spellcount = 0;
}
}
} }
} }
log_printf(stdout, "\n"); log_printf(stdout, "\n");
@ -1656,6 +1640,7 @@ int readgame(const char *filename, bool backup)
for (f = factions; f; f = f->next) { for (f = factions; f; f = f->next) {
if (f->flags & FFL_NPC) { if (f->flags & FFL_NPC) {
f->alive = 1; f->alive = 1;
f->magiegebiet = M_GRAY;
if (f->no == 0) { if (f->no == 0) {
int no = 666; int no = 666;
while (findfaction(no)) while (findfaction(no))
@ -1666,8 +1651,23 @@ int readgame(const char *filename, bool backup)
} }
else { else {
for (u = f->units; u; u = u->nextF) { for (u = f->units; u; u = u->nextF) {
sc_mage *mage = get_mage(u);
if (mage) {
faction *f = u->faction;
int skl = effskill(u, SK_MAGIC);
if (f->magiegebiet == M_GRAY) {
log_error("faction %s had magic=gray, fixing (%s)\n", factionname(f), magic_school[mage->magietyp]);
f->magiegebiet = mage->magietyp;
}
if (f->max_spelllevel < skl) {
f->max_spelllevel = skl;
}
if (mage->spellcount < 0) {
mage->spellcount = 0;
}
}
if (u->number > 0) { if (u->number > 0) {
f->alive = 1; f->alive = true;
break; break;
} }
} }

View File

@ -1274,25 +1274,10 @@ static int item_modification(const unit * u, skill_t sk, int val)
return val; return val;
} }
static int update_gbdream(const unit * u, int bonus, curse *c, const curse_type *gbdream_ct, int sign){ static int att_modification(const unit * u, skill_t sk)
if (curse_active(c) && c->type == gbdream_ct) {
double effect = curse_geteffect(c);
unit *mage = c->magician;
/* wir suchen jeweils den groessten Bonus und den groestsen Malus */
if (sign * effect > sign * bonus) {
if (mage == NULL || mage->number == 0
|| (sign>0?alliedunit(mage, u->faction, HELP_GUARD):!alliedunit(mage, u->faction, HELP_GUARD))) {
bonus = (int)effect;
}
}
}
return bonus;
}
int att_modification(const unit * u, skill_t sk)
{ {
double result = 0; double result = 0;
static bool init = false; static bool init = false; // TODO: static variables are bad global state
static const curse_type *skillmod_ct, *gbdream_ct, *worse_ct; static const curse_type *skillmod_ct, *gbdream_ct, *worse_ct;
curse *c; curse *c;
@ -1321,15 +1306,21 @@ int att_modification(const unit * u, skill_t sk)
/* TODO hier kann nicht mit get/iscursed gearbeitet werden, da nur der /* TODO hier kann nicht mit get/iscursed gearbeitet werden, da nur der
* jeweils erste vom Typ C_GBDREAM zurueckgegen wird, wir aber alle * jeweils erste vom Typ C_GBDREAM zurueckgegen wird, wir aber alle
* durchsuchen und aufaddieren muessen */ * durchsuchen und aufaddieren muessen */
if (u->region) { if (gbdream_ct && u->region) {
int bonus = 0, malus = 0; int bonus = 0, malus = 0;
attrib *a = a_find(u->region->attribs, &at_curse); attrib *a = a_find(u->region->attribs, &at_curse);
while (a && a->type == &at_curse) { while (a && a->type == &at_curse) {
curse *c = (curse *)a->data.v; curse *c = (curse *)a->data.v;
bonus = update_gbdream(u, bonus, c, gbdream_ct, 1); if (curse_active(c) && c->type == gbdream_ct) {
malus = update_gbdream(u, malus, c, gbdream_ct, -1); int effect = curse_geteffect_int(c);
bool allied = alliedunit(c->magician, u->faction, HELP_GUARD);
if (allied) {
if (effect > bonus) bonus = effect;
} else {
if (effect < malus) malus = effect;
}
}
a = a->next; a = a->next;
} }
result = result + bonus + malus; result = result + bonus + malus;

View File

@ -183,7 +183,7 @@ static void live(region * r)
reduce_skill(u, sb, weeks); reduce_skill(u, sb, weeks);
ADDMSG(&u->faction->msgs, msg_message("dumbeffect", ADDMSG(&u->faction->msgs, msg_message("dumbeffect",
"unit weeks skill", u, weeks, (skill_t)sb->id)); "unit weeks skill", u, weeks, (skill_t)sb->id));
} /* sonst Glück gehabt: wer nix weiß, kann nix vergessen... */ } /* sonst Glück gehabt: wer nix weiss, kann nix vergessen... */
change_effect(u, oldpotiontype[P_FOOL], -effect); change_effect(u, oldpotiontype[P_FOOL], -effect);
} }
age_unit(r, u); age_unit(r, u);
@ -402,7 +402,7 @@ static void migrate(region * r)
* wer fragt das? Die Baumwanderung war abhängig von der * wer fragt das? Die Baumwanderung war abhängig von der
* Auswertungsreihenfolge der regionen, * Auswertungsreihenfolge der regionen,
* das hatte ich geändert. jemand hat es wieder gelöscht, toll. * das hatte ich geändert. jemand hat es wieder gelöscht, toll.
* ich habe es wieder aktiviert, muß getestet werden. * ich habe es wieder aktiviert, muss getestet werden.
*/ */
*hp = m->next; *hp = m->next;
m->next = free_migrants; m->next = free_migrants;
@ -442,7 +442,7 @@ static void horses(region * r)
/* Pferde wandern in Nachbarregionen. /* Pferde wandern in Nachbarregionen.
* Falls die Nachbarregion noch berechnet * Falls die Nachbarregion noch berechnet
* werden muß, wird eine migration-Struktur gebildet, * werden muss, wird eine migration-Struktur gebildet,
* die dann erst in die Berechnung der Nachbarstruktur einfließt. * die dann erst in die Berechnung der Nachbarstruktur einfließt.
*/ */
@ -632,7 +632,7 @@ growing_trees(region * r, const int current_season, const int last_weeks_season)
a->data.sa[0] = (short)rtrees(r, 0); a->data.sa[0] = (short)rtrees(r, 0);
a->data.sa[1] = (short)rtrees(r, 1); a->data.sa[1] = (short)rtrees(r, 1);
} }
/* wir haben 6 Wochen zum wachsen, jeder Same/Sproß hat 18% Chance /* wir haben 6 Wochen zum wachsen, jeder Same/Spross hat 18% Chance
* zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */ * zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */
growth = 1800; growth = 1800;
@ -1990,7 +1990,7 @@ int mail_cmd(unit * u, struct order *ord)
s = gettoken(token, sizeof(token)); s = gettoken(token, sizeof(token));
/* Falls kein Parameter, ist das eine Einheitsnummer; /* Falls kein Parameter, ist das eine Einheitsnummer;
* das Füllwort "AN" muß wegfallen, da gültige Nummer! */ * das Füllwort "AN" muss wegfallen, da gültige Nummer! */
do { do {
cont = 0; cont = 0;
@ -3495,11 +3495,11 @@ void update_long_order(unit * u)
switch (keyword) { switch (keyword) {
/* Wenn gehandelt wird, darf kein langer Befehl ausgeführt /* Wenn gehandelt wird, darf kein langer Befehl ausgeführt
* werden. Da Handel erst nach anderen langen Befehlen kommt, * werden. Da Handel erst nach anderen langen Befehlen kommt,
* muß das vorher abgefangen werden. Wir merken uns also * muss das vorher abgefangen werden. Wir merken uns also
* hier, ob die Einheit handelt. */ * hier, ob die Einheit handelt. */
case K_BUY: case K_BUY:
case K_SELL: case K_SELL:
/* Wenn die Einheit handelt, muß der Default-Befehl gelöscht /* Wenn die Einheit handelt, muss der Default-Befehl gelöscht
* werden. * werden.
* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen * Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen
* mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern * mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern
@ -3522,7 +3522,7 @@ void update_long_order(unit * u)
if (hunger) { if (hunger) {
return; return;
} }
/* Wenn die Einheit handelt, muß der Default-Befehl gelöscht /* Wenn die Einheit handelt, muss der Default-Befehl gelöscht
* werden. */ * werden. */
if (trade) { if (trade) {

View File

@ -366,7 +366,7 @@ static int canwalk(unit * u)
return E_CANWALK_TOOMANYCARTS; return E_CANWALK_TOOMANYCARTS;
/* Es muß nicht zwingend an den Wagen liegen, aber egal... (man /* Es muß nicht zwingend an den Wagen liegen, aber egal... (man
* könnte z.B. auch 8 Eisen abladen, damit ein weiterer Wagen als * könnte z.B. auch 8 Eisen abladen, damit ein weiterer Wagen als
* Fracht draufpaßt) */ * Fracht draufpasst) */
return E_CANWALK_TOOHEAVY; return E_CANWALK_TOOHEAVY;
} }

View File

@ -20,13 +20,10 @@
#include <assert.h> #include <assert.h>
static struct castorder *test_create_castorder(castorder *order, unit *u, const char *name, int level, float force, int range) { static void test_create_castorder(castorder *order, unit *u, int level, float force, int range) {
struct locale * lang; struct locale * lang;
spell *sp;
lang = get_or_create_locale("en"); lang = get_or_create_locale("en");
sp = create_spell(name, 0); create_castorder(order, u, NULL, NULL, u->region, level, force, range, create_order(K_CAST, lang, ""), NULL);
return order = create_castorder(order, u, NULL, sp, u->region, level, force, range, create_order(K_CAST, lang, ""), NULL);
} }
static void test_dreams(CuTest *tc) { static void test_dreams(CuTest *tc) {
@ -39,12 +36,12 @@ static void test_dreams(CuTest *tc) {
test_cleanup(); test_cleanup();
test_create_world(); test_create_world();
r=findregion(0, 0); r=findregion(0, 0);
f1 = test_create_faction(test_create_race("human")); f1 = test_create_faction(0);
f2 = test_create_faction(test_create_race("human")); f2 = test_create_faction(0);
u1 = test_create_unit(f1, r); u1 = test_create_unit(f1, r);
u2 = test_create_unit(f2, r); u2 = test_create_unit(f2, r);
test_create_castorder(&order, u1, "goodreams", 10, 10., 0); test_create_castorder(&order, u1, 10, 10., 0);
level = sp_gooddreams(&order); level = sp_gooddreams(&order);
CuAssertIntEquals(tc, 10, level); CuAssertIntEquals(tc, 10, level);
@ -57,7 +54,7 @@ static void test_dreams(CuTest *tc) {
CuAssertIntEquals(tc, 1, get_modifier(u1, SK_MELEE, 11, r, false)); CuAssertIntEquals(tc, 1, get_modifier(u1, SK_MELEE, 11, r, false));
CuAssertIntEquals(tc, 0, get_modifier(u2, SK_MELEE, 11, r, false)); CuAssertIntEquals(tc, 0, get_modifier(u2, SK_MELEE, 11, r, false));
test_create_castorder(&order, u1, "baddreams", 10, 10., 0); test_create_castorder(&order, u1, 10, 10., 0);
level = sp_baddreams(&order); level = sp_baddreams(&order);
CuAssertIntEquals(tc, 10, level); CuAssertIntEquals(tc, 10, level);