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;
|
||||
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)
|
||||
return mode;
|
||||
if (u->faction != NULL && f2 != NULL) {
|
||||
|
|
|
@ -233,7 +233,7 @@ static faction *factionorders(void)
|
|||
f->no, pass));
|
||||
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 */
|
||||
|
||||
/* 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
|
||||
* durchlaufen, und die entsprechende Funktion aufgerufen. Man darf buf
|
||||
* auf alle Fälle nicht überschreiben! Bei allen anderen Einträgen hier
|
||||
* muß buf erneut gefüllt werden, da die betreffende Information in nur
|
||||
* einer Zeile steht, und nun die nächste gelesen werden muß. */
|
||||
* muss buf erneut gefüllt werden, da die betreffende Information in nur
|
||||
* einer Zeile steht, und nun die nächste gelesen werden muss. */
|
||||
|
||||
case P_NEXT:
|
||||
f = NULL;
|
||||
|
@ -1603,7 +1603,6 @@ int readgame(const char *filename, bool backup)
|
|||
|
||||
while (--p >= 0) {
|
||||
unit *u = read_unit(&gdata);
|
||||
sc_mage *mage;
|
||||
|
||||
if (gdata.version < JSON_REPORT_VERSION) {
|
||||
if (u->_name && fval(u->faction, FFL_NPC)) {
|
||||
|
@ -1618,21 +1617,6 @@ int readgame(const char *filename, bool backup)
|
|||
up = &u->next;
|
||||
|
||||
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");
|
||||
|
@ -1656,6 +1640,7 @@ int readgame(const char *filename, bool backup)
|
|||
for (f = factions; f; f = f->next) {
|
||||
if (f->flags & FFL_NPC) {
|
||||
f->alive = 1;
|
||||
f->magiegebiet = M_GRAY;
|
||||
if (f->no == 0) {
|
||||
int no = 666;
|
||||
while (findfaction(no))
|
||||
|
@ -1666,8 +1651,23 @@ int readgame(const char *filename, bool backup)
|
|||
}
|
||||
else {
|
||||
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) {
|
||||
f->alive = 1;
|
||||
f->alive = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1274,25 +1274,10 @@ static int item_modification(const unit * u, skill_t sk, int val)
|
|||
return val;
|
||||
}
|
||||
|
||||
static int update_gbdream(const unit * u, int bonus, curse *c, const curse_type *gbdream_ct, int sign){
|
||||
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)
|
||||
static int att_modification(const unit * u, skill_t sk)
|
||||
{
|
||||
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;
|
||||
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
|
||||
* jeweils erste vom Typ C_GBDREAM zurueckgegen wird, wir aber alle
|
||||
* durchsuchen und aufaddieren muessen */
|
||||
if (u->region) {
|
||||
if (gbdream_ct && u->region) {
|
||||
int bonus = 0, malus = 0;
|
||||
attrib *a = a_find(u->region->attribs, &at_curse);
|
||||
while (a && a->type == &at_curse) {
|
||||
curse *c = (curse *)a->data.v;
|
||||
|
||||
bonus = update_gbdream(u, bonus, c, gbdream_ct, 1);
|
||||
malus = update_gbdream(u, malus, c, gbdream_ct, -1);
|
||||
|
||||
if (curse_active(c) && c->type == gbdream_ct) {
|
||||
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;
|
||||
}
|
||||
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);
|
||||
ADDMSG(&u->faction->msgs, msg_message("dumbeffect",
|
||||
"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);
|
||||
}
|
||||
age_unit(r, u);
|
||||
|
@ -402,7 +402,7 @@ static void migrate(region * r)
|
|||
* wer fragt das? Die Baumwanderung war abhängig von der
|
||||
* Auswertungsreihenfolge der regionen,
|
||||
* 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;
|
||||
m->next = free_migrants;
|
||||
|
@ -442,7 +442,7 @@ static void horses(region * r)
|
|||
|
||||
/* Pferde wandern in Nachbarregionen.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
@ -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[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 */
|
||||
growth = 1800;
|
||||
|
||||
|
@ -1990,7 +1990,7 @@ int mail_cmd(unit * u, struct order *ord)
|
|||
s = gettoken(token, sizeof(token));
|
||||
|
||||
/* 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 {
|
||||
cont = 0;
|
||||
|
@ -3495,11 +3495,11 @@ void update_long_order(unit * u)
|
|||
switch (keyword) {
|
||||
/* Wenn gehandelt wird, darf kein langer Befehl ausgeführt
|
||||
* 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. */
|
||||
case K_BUY:
|
||||
case K_SELL:
|
||||
/* Wenn die Einheit handelt, muß der Default-Befehl gelöscht
|
||||
/* Wenn die Einheit handelt, muss der Default-Befehl gelöscht
|
||||
* werden.
|
||||
* Wird je diese Ausschliesslichkeit aufgehoben, muss man aufpassen
|
||||
* mit der Reihenfolge von Kaufen, Verkaufen etc., damit es Spielern
|
||||
|
@ -3522,7 +3522,7 @@ void update_long_order(unit * u)
|
|||
if (hunger) {
|
||||
return;
|
||||
}
|
||||
/* Wenn die Einheit handelt, muß der Default-Befehl gelöscht
|
||||
/* Wenn die Einheit handelt, muss der Default-Befehl gelöscht
|
||||
* werden. */
|
||||
|
||||
if (trade) {
|
||||
|
|
|
@ -366,7 +366,7 @@ static int canwalk(unit * u)
|
|||
return E_CANWALK_TOOMANYCARTS;
|
||||
/* Es muß nicht zwingend an den Wagen liegen, aber egal... (man
|
||||
* könnte z.B. auch 8 Eisen abladen, damit ein weiterer Wagen als
|
||||
* Fracht draufpaßt) */
|
||||
* Fracht draufpasst) */
|
||||
|
||||
return E_CANWALK_TOOHEAVY;
|
||||
}
|
||||
|
|
|
@ -20,13 +20,10 @@
|
|||
#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;
|
||||
spell *sp;
|
||||
|
||||
lang = get_or_create_locale("en");
|
||||
sp = create_spell(name, 0);
|
||||
return order = create_castorder(order, u, NULL, sp, u->region, level, force, range, create_order(K_CAST, lang, ""), NULL);
|
||||
create_castorder(order, u, NULL, NULL, u->region, level, force, range, create_order(K_CAST, lang, ""), NULL);
|
||||
}
|
||||
|
||||
static void test_dreams(CuTest *tc) {
|
||||
|
@ -39,12 +36,12 @@ static void test_dreams(CuTest *tc) {
|
|||
test_cleanup();
|
||||
test_create_world();
|
||||
r=findregion(0, 0);
|
||||
f1 = test_create_faction(test_create_race("human"));
|
||||
f2 = test_create_faction(test_create_race("human"));
|
||||
f1 = test_create_faction(0);
|
||||
f2 = test_create_faction(0);
|
||||
u1 = test_create_unit(f1, 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);
|
||||
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, 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);
|
||||
CuAssertIntEquals(tc, 10, level);
|
||||
|
||||
|
|
Loading…
Reference in New Issue