From 38a754844ee3bfa12769e8f07427d52430197b27 Mon Sep 17 00:00:00 2001 From: CTD1 Date: Tue, 15 Jul 2014 15:24:21 +0200 Subject: [PATCH 1/4] =?UTF-8?q?BUG=200001980:=20Gegener=20h=C3=A4lt=20Burg?= =?UTF-8?q?=20obwohl=20alle=20geflohen=20sind!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http://bugs.eressea.de/view.php?id=1980 Der Test unten erzeugt eine Temp-Einheit welche nach dem Kampf die Burg hält, trotz einer vernichtenden Niederlage innerhalb von 2 Kampfrunden. Der Angreifer darf die Burg zwar betreten, bekommt aber nicht das Kommando. Grund ist das beim Betreten der Burg via u_set_building() nur dann die betretende Einheit zum Burgenbesitzer wird wenn es keinen Burgenbesitzer gibt. Die eher aufgerufene Funktion building_owner() versucht zwar nach dem Kampf einen neuen Burgenbesitzer zu finden, da sich zu diesem Zeitpunkt aber nur eine Tote Einheit und einen Temp Einheit, beide mit 0 Personen, in der Bug befinden schlägt dies Fehl. Es wird von der Funktion zwar 0 zurückgegeben, aber b->_owner wird nicht zurückgesetzt (Vermutlich da der Server an anderer Stelle sonst annimmt das noch nie jemand in der Burg war). Daher die Ãœberprüfung bei u_set_building ob der Burgenbesitzer tot ist, und wenn ja wird die betretende Einheit neuer Burgenbesitzer. local r1 = region.create(1, 2, "plain") local f1 = faction.create("a@b.de", "human", "de") local f2 = faction.create("c@d.de", "human", "de") f1.age=20 f2.age=20 local b1 = building.create(r1, "castle") b1.size = 100 local u0 = unit.create(f1, r1, 10) u0.building = b1 u0:add_item("money", u0.number * 100) u0:clear_orders() u0:add_order("KÄMPFE") u0:add_order("MACHE TEMP 1") u0:add_order("ENDE") local u1 = unit.create(f1, r1, 100) u1.building = b1 u1:add_item("money", u1.number * 100) u1:clear_orders() u1:add_order("KÄMPFE FLIEHE") u1:add_order("GIB TEMP 1 ALLES PERSONEN") u1:add_order("GIB TEMP 1 ALLES") u1:add_order("GIB TEMP 1 Kommando") local u2 = unit.create(f2, r1, 101) u2:add_item("sword", u2.number) u2:add_item("money", u2.number * 100) u2:set_skill("melee", 16) u2:clear_orders() u2:add_order("KÄMPFE") u2:add_order("ATTACKIEREN " .. itoa36(u1.id)) u2:add_order("BETRETE BURG " .. itoa36(b1.id)) process_orders() Das sollte für Schiffe eigentlich das gleiche sein, also da die gleiche Änderung. --- src/kernel/unit.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 55e5e4a91..5e90f4ca6 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -69,7 +69,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. attrib_type at_creator = { "creator" - /* Rest ist NULL; temporäres, nicht alterndes Attribut */ + /* Rest ist NULL; tempor�res, nicht alterndes Attribut */ }; #define UMAXHASH MAXUNITS @@ -619,7 +619,7 @@ void usetcontact(unit * u, const unit * u2) } bool ucontact(const unit * u, const unit * u2) -/* Prüft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */ +/* Pr�ft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */ { attrib *ru; if (u->faction == u2->faction) @@ -776,7 +776,7 @@ ship *leftship(const unit * u) { attrib *a = a_find(u->attribs, &at_leftship); - /* Achtung: Es ist nicht garantiert, daß der Rückgabewert zu jedem + /* Achtung: Es ist nicht garantiert, da� der R�ckgabewert zu jedem * Zeitpunkt noch auf ein existierendes Schiff zeigt! */ if (a) @@ -789,7 +789,7 @@ void u_set_building(unit * u, building * b) { assert(!u->building); /* you must leave first */ u->building = b; - if (b && !b->_owner) { + if (b && (!b->_owner || b->_owner->number <= 0)) { building_set_owner(u); } } @@ -798,7 +798,7 @@ void u_set_ship(unit * u, ship * sh) { assert(!u->ship); /* you must leave_ship */ u->ship = sh; - if (sh && !sh->_owner) { + if (sh && !sh->_owner || sh->_owner->number <= 0) { ship_set_owner(u); } } @@ -930,7 +930,7 @@ void transfermen(unit * u, unit * u2, int n) if (n == 0) return; assert(n > 0); - /* "hat attackiert"-status wird übergeben */ + /* "hat attackiert"-status wird �bergeben */ if (u2) { skill *sv, *sn; @@ -1016,7 +1016,7 @@ void transfermen(unit * u, unit * u2, int n) set_number(u2, u2->number + n); hp -= u->hp; u2->hp += hp; - /* TODO: Das ist schnarchlahm! und gehört nicht hierhin */ + /* TODO: Das ist schnarchlahm! und geh�rt nicht hierhin */ a = a_find(u2->attribs, &at_effect); while (a && a->type == &at_effect) { attrib *an = a->next; @@ -1050,7 +1050,7 @@ struct building *inside_building(const struct unit *u) /* Unterhalt nicht bezahlt */ return NULL; } else if (u->building->size < u->building->type->maxsize) { - /* Gebäude noch nicht fertig */ + /* Geb�ude noch nicht fertig */ return NULL; } else { int p = 0, cap = buildingcapacity(u->building); @@ -1118,7 +1118,7 @@ void u_setfaction(unit * u, faction * f) } } -/* vorsicht Sprüche können u->number == RS_FARVISION haben! */ +/* vorsicht Spr�che k�nnen u->number == RS_FARVISION haben! */ void set_number(unit * u, int count) { assert(count >= 0); @@ -1268,8 +1268,8 @@ static 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 zurückgegen wird, wir aber alle - * durchsuchen und aufaddieren müssen */ + * jeweils erste vom Typ C_GBDREAM zur�ckgegen wird, wir aber alle + * durchsuchen und aufaddieren m�ssen */ if (u->region) { double bonus = 0, malus = 0; attrib *a = a_find(u->region->attribs, &at_curse); @@ -1278,7 +1278,7 @@ static int att_modification(const unit * u, skill_t sk) if (curse_active(c) && c->type == gbdream_ct) { double mod = curse_geteffect(c); unit *mage = c->magician; - /* wir suchen jeweils den größten Bonus und den größten Malus */ + /* wir suchen jeweils den gr��ten Bonus und den gr��ten Malus */ if (mod > bonus) { if (mage == NULL || mage->number == 0 || alliedunit(mage, u->faction, HELP_GUARD)) { @@ -1489,7 +1489,7 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace, if (r) move_unit(u, r, NULL); - /* u->race muss bereits gesetzt sein, wird für default-hp gebraucht */ + /* u->race muss bereits gesetzt sein, wird f�r default-hp gebraucht */ /* u->region auch */ u->hp = unit_max_hp(u) * number; @@ -1505,7 +1505,7 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace, /* erbt Kampfstatus */ setstatus(u, creator->status); - /* erbt Gebäude/Schiff */ + /* erbt Geb�ude/Schiff */ if (creator->region == r) { if (creator->building) { u_set_building(u, creator->building); @@ -1686,7 +1686,7 @@ int unit_max_hp(const unit * u) p = pow(effskill(u, SK_STAMINA) / 2.0, 1.5) * 0.2; h += (int)(h * p + 0.5); } - /* der healing curse verändert die maximalen hp */ + /* der healing curse ver�ndert die maximalen hp */ if (heal_ct) { curse *c = get_curse(u->region->attribs, heal_ct); if (c) { From 6987c61d9735b609e466b45faa9818c14e34ab05 Mon Sep 17 00:00:00 2001 From: CTD1 Date: Tue, 15 Jul 2014 15:34:42 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=20Bug=200002014:=20Zwergenausr=C3=BCstung?= =?UTF-8?q?=20kann=20nicht=20hergestellt=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nicht auf die Fraction Rasse checken, (die ist normalerweise Halbling, kann aber auch Zwerg sein wenn mit der Starteinheit eigenartige Dinge gemacht wurden) sondern ob der Hersteller eine Zwergen oder Golem ist. Da Zwergensachen nur von Zwergen benutzt werden können, stellt es keinen Vorteil für andere Völker da wenn sie über Golems Zwergensachen machen können. --- src/kernel/item.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/kernel/item.c b/src/kernel/item.c index e8879ae00..201dc06ec 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -656,7 +656,7 @@ use_birthdayamulet(unit * u, const struct item_type *itype, int amount, #define FL_ITEM_MOUNT ((1<<4) | FL_ITEM_ANIMAL) /* ist ein Reittier */ /* ------------------------------------------------------------- */ -/* Kann auch von Nichtmagier benutzt werden, modifiziert Taktik für diese +/* Kann auch von Nichtmagier benutzt werden, modifiziert Taktik fuer diese * Runde um -1 - 4 Punkte. */ static int use_tacticcrystal(unit * u, const struct item_type *itype, int amount, @@ -667,8 +667,8 @@ use_tacticcrystal(unit * u, const struct item_type *itype, int amount, int duration = 1; /* wirkt nur eine Runde */ curse *c; float effect; - float power = 5; /* Widerstand gegen Antimagiesprüche, ist in diesem - Fall egal, da der curse für den Kampf gelten soll, + float power = 5; /* Widerstand gegen Antimagiesprueche, ist in diesem + Fall egal, da der curse fuer den Kampf gelten soll, der vor den Antimagiezaubern passiert */ effect = (float)(rng_int() % 6 - 1); @@ -685,8 +685,8 @@ use_tacticcrystal(unit * u, const struct item_type *itype, int amount, typedef struct t_item { const char *name; - /* [0]: Einzahl für eigene; [1]: Mehrzahl für eigene; - * [2]: Einzahl für Fremde; [3]: Mehrzahl für Fremde */ + /* [0]: Einzahl fuer eigene; [1]: Mehrzahl fuer eigene; + * [2]: Einzahl fuer Fremde; [3]: Mehrzahl fuer Fremde */ bool is_resource; skill_t skill; int minskill; @@ -712,7 +712,7 @@ static int mod_dwarves_only(const unit * u, const region * r, skill_t sk, int value) { unused_arg(r); - if (u->faction->race == get_race(RC_DWARF)) { + if (u_race(u) == get_race(RC_DWARF) || (u_race(u)->flags & RCF_IRONGOLEM)) { return value; } return -118; @@ -779,7 +779,7 @@ use_warmthpotion(struct unit *u, const struct item_type *itype, int amount, if (u->faction->race == get_race(RC_INSECT)) { fset(u, UFL_WARMTH); } else { - /* nur für insekten: */ + /* nur fuer insekten: */ cmistake(u, ord, 163, MSG_EVENT); return ECUSTOM; } From aae6ac34d9a789e7071d5fd49f32191e9556b0ea Mon Sep 17 00:00:00 2001 From: CTD1 Date: Tue, 15 Jul 2014 15:37:09 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Bug=200002014:=20Zwergenausr=C3=BCstung=20k?= =?UTF-8?q?ann=20nicht=20hergestellt=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testcase auf Rasse Halbling geändert. --- scripts/tests/e3a.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tests/e3a.lua b/scripts/tests/e3a.lua index 4ddeddc1c..fc0031efb 100644 --- a/scripts/tests/e3a.lua +++ b/scripts/tests/e3a.lua @@ -697,7 +697,7 @@ end function test_golem_use_four_iron() local r0 = region.create(0, 0, "plain") - local f1 = faction.create("noreply@eressea.de", "dwarf", "de") + local f1 = faction.create("noreply@eressea.de", "halfling", "de") local u1 = unit.create(f1, r0, 3) u1.race = "irongolem" u1:set_skill("weaponsmithing", 1) From 700a88fd797f7be820b106194d4648ce91bf2a71 Mon Sep 17 00:00:00 2001 From: CTD1 Date: Tue, 15 Jul 2014 15:46:02 +0200 Subject: [PATCH 4/4] Umlaute in Kommentaren sind doof. --- src/kernel/unit.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 5e90f4ca6..c965b6d9f 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -69,7 +69,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. attrib_type at_creator = { "creator" - /* Rest ist NULL; tempor�res, nicht alterndes Attribut */ + /* Rest ist NULL; temporaeres, nicht alterndes Attribut */ }; #define UMAXHASH MAXUNITS @@ -619,7 +619,7 @@ void usetcontact(unit * u, const unit * u2) } bool ucontact(const unit * u, const unit * u2) -/* Pr�ft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */ +/* Prueft, ob u den Kontaktiere-Befehl zu u2 gesetzt hat. */ { attrib *ru; if (u->faction == u2->faction) @@ -776,7 +776,7 @@ ship *leftship(const unit * u) { attrib *a = a_find(u->attribs, &at_leftship); - /* Achtung: Es ist nicht garantiert, da� der R�ckgabewert zu jedem + /* Achtung: Es ist nicht garantiert, dass der Rueckgabewert zu jedem * Zeitpunkt noch auf ein existierendes Schiff zeigt! */ if (a) @@ -930,7 +930,7 @@ void transfermen(unit * u, unit * u2, int n) if (n == 0) return; assert(n > 0); - /* "hat attackiert"-status wird �bergeben */ + /* "hat attackiert"-status wird uebergeben */ if (u2) { skill *sv, *sn; @@ -1016,7 +1016,7 @@ void transfermen(unit * u, unit * u2, int n) set_number(u2, u2->number + n); hp -= u->hp; u2->hp += hp; - /* TODO: Das ist schnarchlahm! und geh�rt nicht hierhin */ + /* TODO: Das ist schnarchlahm! und gehoert nicht hierhin */ a = a_find(u2->attribs, &at_effect); while (a && a->type == &at_effect) { attrib *an = a->next; @@ -1050,7 +1050,7 @@ struct building *inside_building(const struct unit *u) /* Unterhalt nicht bezahlt */ return NULL; } else if (u->building->size < u->building->type->maxsize) { - /* Geb�ude noch nicht fertig */ + /* Gebaeude noch nicht fertig */ return NULL; } else { int p = 0, cap = buildingcapacity(u->building); @@ -1118,7 +1118,7 @@ void u_setfaction(unit * u, faction * f) } } -/* vorsicht Spr�che k�nnen u->number == RS_FARVISION haben! */ +/* vorsicht Sprueche koennen u->number == RS_FARVISION haben! */ void set_number(unit * u, int count) { assert(count >= 0); @@ -1268,8 +1268,8 @@ static 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 zur�ckgegen wird, wir aber alle - * durchsuchen und aufaddieren m�ssen */ + * jeweils erste vom Typ C_GBDREAM zurueckgegen wird, wir aber alle + * durchsuchen und aufaddieren muessen */ if (u->region) { double bonus = 0, malus = 0; attrib *a = a_find(u->region->attribs, &at_curse); @@ -1278,7 +1278,7 @@ static int att_modification(const unit * u, skill_t sk) if (curse_active(c) && c->type == gbdream_ct) { double mod = curse_geteffect(c); unit *mage = c->magician; - /* wir suchen jeweils den gr��ten Bonus und den gr��ten Malus */ + /* wir suchen jeweils den groesten Bonus und den groesten Malus */ if (mod > bonus) { if (mage == NULL || mage->number == 0 || alliedunit(mage, u->faction, HELP_GUARD)) { @@ -1489,7 +1489,7 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace, if (r) move_unit(u, r, NULL); - /* u->race muss bereits gesetzt sein, wird f�r default-hp gebraucht */ + /* u->race muss bereits gesetzt sein, wird fuer default-hp gebraucht */ /* u->region auch */ u->hp = unit_max_hp(u) * number; @@ -1505,7 +1505,7 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace, /* erbt Kampfstatus */ setstatus(u, creator->status); - /* erbt Geb�ude/Schiff */ + /* erbt Gebaeude/Schiff */ if (creator->region == r) { if (creator->building) { u_set_building(u, creator->building); @@ -1686,7 +1686,7 @@ int unit_max_hp(const unit * u) p = pow(effskill(u, SK_STAMINA) / 2.0, 1.5) * 0.2; h += (int)(h * p + 0.5); } - /* der healing curse ver�ndert die maximalen hp */ + /* der healing curse veraendert die maximalen hp */ if (heal_ct) { curse *c = get_curse(u->region->attribs, heal_ct); if (c) {