forked from github/server
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:
commit
2288b8fb27
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
16
src/laws.c
16
src/laws.c
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue