Eintragsdetails ansehen
ID | Projekt | Kategorie | Sichtbarkeit | Meldungsdatum | Zuletzt aktualisiert |
---|---|---|---|---|---|
0002166 | Eressea | Kampf | öffentlich | 2015-11-24 23:01 | 2017-12-05 19:50 |
Reporter | Thoran | Bearbeitung durch | Enno | ||
Priorität | normal | Schweregrad | schwerer Fehler | Reproduzierbar | nicht getestet |
Status | geschlossen | Lösung | erledigt | ||
Produktversion | 3.7.0 | ||||
Zielversion | 3.7.4 | Behoben in Version | 3.7.4 | ||
Zusammenfassung | 0002166: Unsterbliche Hirntöter? | ||||
Beschreibung | Zusammen mit einer befreundeten Partei beschäftigen sich einige meiner Einheiten damit, im Astralraum Hirntöter zu erschlagen. Auch diese Woche gab es wieder einen Kampf im Nebel (Auszüge s.u.). Wir prügeln 6 Runden lag auf 9 Hirntöter ein und allein meine Zwerge erzielen mehr als 1200 Treffer mit Flammenschwertern. Entweder sind das die robustesten Hirntöter in ganz Eressea oder man kann ihnen seit dieser Woche nichts mehr anhaben. Bis einschl. letzter Auswertung war es gar kein Problem, die Hirntöter meistens in der ersten Kampfrunde zu beseitigen. | ||||
Zusätzliche Informationen |
Der Kampf wurde ausgelöst von Nikes Narrentruppe (1ie9) und Thorans Axtträger (d08a). Heer 0: Nikes Narrentruppe (1ie9) ... Heer 1: Monster (ii) Kämpft gegen: Heer 0(1ie9), Heer 2(d08a) Hilft: Heer 1(ii) ... in der 1. Kampflinie:
Heer 2: Thorans Axtträger (d08a) Kämpft gegen: Heer 1(ii) Hilft: Heer 0(1ie9), Heer 2(d08a) Attacke gegen: Heer 1(ii) ... in der 1. Kampflinie:
Einheiten vor der 0. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 1. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 2. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 3. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 4. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 5. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17 4 Krieger von SjH Geisterjäger | Helden (jag0) benutzen ihre Flammenschwerter. SjH Geisterjäger | Helden (jag0) tötete 0 Krieger. 7 Krieger von SjA Topor I (5jqx) benutzen ihre Flammenschwerter. SjA Topor I (5jqx) tötete 0 Krieger. 2 Krieger von Geisterjaeger (ftjq) benutzen ihre Flammenschwerter. Geisterjaeger (ftjq) tötete 0 Krieger. 7 Krieger von 1. Rotte Rivevyd - 'Die Glühenden' (1knq) benutzen ihre Flammenschwerter.
Einheiten vor der 6. Runde: Heer 0(1ie9): 145, Heer 1(ii): 9, Heer 2(d08a): 17
| ||||
Tags | Keine Tags zugeordnet. | ||||
Partei | d08a | ||||
Spiel | E2 | ||||
Report | 955 | ||||
Da werde ich wohl in die Spieldaten schauen müssen, ob diese Einheiten irgendwie besonders sind. |
|
Naja - bis einschließlich Auswertung 954 sind die Hirntöter immer "ohne Murren" gestorben. Also ist entweder diese eine Hirntötereinheit besonders oder meine Einheiten leidern unter einem Fluch oder in der Implementierung von Monstern/Kampfregeln hat sich was geändert. Da mir so etwas erstmalig diese Auswertung untergekommen ist, tippe ich mal auf Letzteres. |
|
Du bist nicht zufällig Empfänger von Testauswertungen für E2? Sonst könntest Du selber mal gucken, ob sich vor der Einführung von 3.7 Diskrepanzen zwischen Kämpfen in den beiden Reporten gezeigt haben (was auf Änderungen im Code schließen ließe). |
|
Auf die Idee hätte ich auch schon vorher mal kommen können! Auswertung 954: ---snip--- In Nebel (0,0) findet ein Kampf statt. ... Heer 1: Monster (ii) Kämpft gegen: Heer 0(1ie9), Heer 3(d08a) Hilft: Heer 1(ii), Heer 2(-?-) ... in der 1. Kampflinie:
Testauswertung 954: ---snip--- In Nebel (0,0) findet ein Kampf statt. ... Heer 1: Monster (ii) Kämpft gegen: Heer 0(1ie9), Heer 3(d08a) Hilft: Heer 1(ii), Heer 2(-?-) ... in der 1. Kampflinie:
Auch letzte Woche (also vor Einführung von 3.7) haben also in der Testauswertung alle Hirntöter den Kampf überlebt, während in der normalen Auswertung (V3.6.6) die Hirntöter in der ersten Kampfrunde gestorben sind. |
|
Danke! Das sollte bei der Suche nach der Ursache helfen, denke ich. |
|
Zu dem "mehr als 1200 Treffer mit Flammenschwertern", es ist aber schon noch so, dass Helden mit Flammenschwertern nur eine magische Flammenattacke und die restlichen 9 normal (wie Laenschwert?) machen, oder? |
|
Tatsächlich 10 normale Attacken (die gegen Hirntöter wirkungslos sind) und 1 magische Feuerballattacke (Feuerball Stufe 1) zusätzlich. Jeder Feuerball wird dann statistisch als weitere Attacke gewertet. Das Waffentalent ist hier also rein defensiv wirkungsvoll um weniger getroffen zu werden. |
|
Auszug aus dem Monster-Report (falls das hilft):
|
|
Zur Frage mit dem magischen Angriffen: Hier ist es relativ unerheblich, wieviele magische Angriffe die Flammenschwerthelden tatsächlich machen, sofern es nur mindestens einer pro Kampfrunde ist. Wir kämpfen im Nebel schon seit einiger Zeit gegen die Hirntöter (ist halt eine Art Beschäftigungstherapie). Auf meiner Seite sind da 17 Helden mit 17 Flammenschwerter dabei. Auf Seiten von Nikes Narrentruppe sind es weitere 13 Flammenschwerter. Das macht also pro Kampfwoche (einen magische Treffer mit dem Flammenschwert pro Kampfrunde angenommen - wir gewinnen immer der Taktikerrunde, deshalb also 6 Kampfrunden maximal): 6*(17+13) = 180 magische Treffer. Erfahrungsgemäß schaffen wir damit die Hirntöter immer relativ schnell und nur ganz ganz selten überleben da mal welche eine Kampfwoche (dann sind aber auch deutlich mehr Hirntöter in der Region als die paar, um die es hier geht). Zu den Talentwerten der Hirntöter: Die haben kein Ausdauertalent. Ich kenne jetzt nicht ihre normalen Trefferpunkte - aber in der angegebenen Form sollten die nicht sonderlich viele Feuerbälle/Flammenschwerthiebe einstecken können. Das Waffentalent meiner Zwerge liegt bei 29 bzw. 26 - also deutlich über dem Talent im waffenlosen Kampf der Hirntöter. Also ist höchstwahrscheinlich so gut wie jeder Hieb auch ein Treffer. |
|
Mir ist aufgefallen das Enno hier https://github.com/eressea/server/commit/15ff621cbb7d64aac19bc0508de4f42fca87799d Änderungen an terminate und der Rüstungsberechnung / Magic resistens gemacht hat (alle in eine eigene Funktion gesteckt. Dabei hat er aber in der battle.h das extern von terminate entfernt:
Die Flammenschwerter werden aber in der weapons.c abgehandelt, welche terminate aufruft. Dazu sollte das schon extern sein, oder? Mich überrascht das da der compiler nicht meckert, aber andererseits wir das auch über wp->type->attack(&ta, wp->type, &dead); gemacht, und der Funktionsname steht in der xml Datei für die Flammenschwerter (attack_firesword). Ich denke irgendwo da liegt das Problem, vermutlich reicht es das extern wieder vor das terminate zu schreiben. |
|
Tatsache, wenn man sich die Kampfberichte mal anschaut, haben die magischen Flammenschwertattacken die letzten beiden Runden tatsächlich keine Opfer verursacht: 100 Krieger von 7. Schwadron Blau (kj2) benutzen ihre Flammenschwerter.
Gegen normale Untote. |
|
Ich muss wohl mal extern erklären (ich habe das früher auch falsch verstanden). extern ist kein Hint an den Linker, wie dllexport oder so etwas. Das extern Keyword ist für Variablen, damit die nur an einer Stelle definiert werden (sonst jammert der Linker über doppelte Symbole). Wenn man Variablen in einer .h Datei deklariert, muss man die extern deklarieren, weil sie im .c File definiert sind. Also, "int my_global;" darf nur in einer .c Datei stehen. Damit die anderen .c Module es aber benutzen können, wird ihnen davon in der .h Datei erzählt. Wenn dort auch "int my_global;" stünde, würde jedes .c Modul, dass ein #include "my_stuff.h" macht, die Variable neu definieren (weil #include in C wörtlich "lieber Präprozessor, klatsch die Zeilen aus dieser .h Datei hier in meinen Source" heisst). Wenn man aber extern davor schreibt, heisst das "ich weiss, das nach dem Linken irgendwo in unserem Binary eine Variable sieses Typs/Namens sein wird, und die meine ich hier". Für Funktionen braucht man das nicht, weil der Compiler weiß, was eine Deklaration und was eine Definition ist. Ich darf in beliebig vielen Modulen "int foo(void);" schreiben, solange die Funktion keinen Body hat. Es ist optional, extern davor zu schreiben, aber verwirrend. Früher habe ich das im Header einfach vor alles gemacht, weil ich keine Ahnung hatte. Heute sehe ich das als technical debt des Codes an, und lösche es, wann immer ich in einem Header sowieso schon editiere. |
|
Ich glaueb also eher, dass es an der Magieresistenz liegt, aber die Stelle im Code (Änderung an terminate) ist eine gute Idee, wo das schief gelaufen sein könnte. |
|
Oh, vielen Danke. Wieder was gelernt. Aber dann müssen wir uns noch mal die ausgelagerte Rüstungsschutzberechnung anschauen, da wird auch die Magieresistenz berechnet, und wenn die irgendwie auf 100% kommt, dann wäre magischer Schaden ja auch 0. Ich denke irgendwo da liegt das Problem. |
|
Ich werde heute mal gucken, was die Werte sind, in den diversen Branches, mit den Daten für Report 955. Der Kampf sollte ja einfach reproduzierbar sein (einfacher als die doofen Seeschlangen jedenfalls). |
|
Ich glaube ich hab's: Beim Eintritt in calculate_armor ist magres = 0.0, und dann kommt diese Zeile: double res = magres - magic_resistance(du) * 3.0; da wird die berechnete Resistenz ganz doll negativ. Die Formel ist bekloppt, ich muss mal gucken wie die vor der Änderung war, und entsprechende Tests schreiben. |
|
Die wurde irgendwo in terminate mit 1.0 initialisiert, und dann immer die magres abgezogen, und zum schluss das Ergebniss mit dem Schaden multipliziert. Besser man macht das mit der Magress schön als Werte zwischen 1 und 100 (also Prozente) und dann erst ganz am Schluss beim anwenden auf den Schaden die eigentlich Berechnung. Ist einfach Übersichtlicher. |
|
Dazu kommt noch, die Magieresistenz der Einheit bestimmt sich hauptsächlich aus ihrem Magietalent, und das haben diese Hirntöter ja massenhaft. Aber die Formel ist pervers. Leider heute morgen viel zu tun, noch nicht nach dem Original geguckt. |
|
Notiz für mich: Das war in 3.6.6 noch anders, dort sah die alte Formel so aus wie in https://gist.github.com/ennorehling/7e96ad529e32c658cb6a |
|
Wenn ich da statt 0.0 wieder 1.0 hinein plugge, kommt als Magieresistenz 70% raus, nicht -30%. Da die mit dem Schaden multipliziert wird, hat das scheinbar Hitpoints zurück gegeben (damage -0,3 ist negativ), statt reduzierten Schaden zu machen (damage 0.7). Ich werde da noch etwas coverage drumrum bauen, und einen PR vorbereiten. Problem ist so gut wie gelöst. |
|
Wann wird das denn aktiv geschaltet? Im Astralraum sind Hirntöter ja unproblematisch und da könnte man auf das nächste offizielle Release warten. Aber es gibt ab und an auch mal Hirntöter in der normalen Ebene und die können recht nervig sein, wenn sie nicht zu vernichten sind. |
|
Danke, das bestätigt, dass ich zumindest in diesem Punkt C (auch erst kürzlich) verstanden habe. Zumindest den Teil mit dem magischen Schaden kann ich erklären: battle.c:1222 ar = calculate_armor(dt, dwtype, awtype, magic ? &res : 0); if (ar < 0) { return false; }
Da wird in calculate_armor die Magieresistzenz berechnet, dann aber falsch benutzt. Es müsste _max(da * (1.0 - res), 0) heißen. Das löst wahrscheinlich diesen Bug, aber nicht 0002168. Total Off Topic: Kennt ihr das Firefox-Plugin Lazarus: Form Recovery? Das speichert sämtliche Formulareingaben für eine gewisse Zeit, so dass man sie später wieder zurückkriegt, falls der Browser abstürzt oder die Seite Schluckauf hat. Das hat mir hier auf Mantis schon so viel Ärger erstpart... |
|
Dieser bug ist nominiert für eine Reparatur vor der Auswertung heute Abend. |
|
Änderungsdatum | Benutzername | Feld | Änderung |
---|---|---|---|
2015-11-24 23:01 | Thoran | Neuer Eintrag | |
2015-11-28 13:21 | Enno | Bearbeitung durch | => Enno |
2015-11-28 13:21 | Enno | Status | neu => zugewiesen |
2015-11-28 13:21 | Enno | Notiz hinzugefügt: 0006326 | |
2015-11-28 13:31 | Thoran | Notiz hinzugefügt: 0006328 | |
2015-11-28 13:46 | Enno | Notiz hinzugefügt: 0006329 | |
2015-11-28 14:00 | Thoran | Notiz hinzugefügt: 0006330 | |
2015-11-28 14:10 | Enno | Notiz hinzugefügt: 0006331 | |
2015-11-29 14:39 | argelas | Notiz hinzugefügt: 0006334 | |
2015-12-01 22:45 | defaitist | Notiz hinzugefügt: 0006338 | |
2015-12-02 12:07 | Enno | Notiz hinzugefügt: 0006343 | |
2015-12-02 12:20 | Thoran | Notiz hinzugefügt: 0006344 | |
2015-12-03 16:13 | CTD | Notiz hinzugefügt: 0006351 | |
2015-12-03 17:47 | defaitist | Notiz hinzugefügt: 0006353 | |
2015-12-05 10:29 | Solthar | Beziehung hinzugefügt | verwandt mit 0002168 |
2015-12-05 11:05 | Enno | Notiz hinzugefügt: 0006359 | |
2015-12-05 11:33 | Enno | Notiz hinzugefügt: 0006360 | |
2015-12-05 11:34 | CTD | Notiz hinzugefügt: 0006361 | |
2015-12-05 11:36 | Enno | Notiz hinzugefügt: 0006362 | |
2015-12-05 11:53 | Enno | Notiz hinzugefügt: 0006363 | |
2015-12-05 12:45 | CTD | Notiz hinzugefügt: 0006364 | |
2015-12-05 12:58 | Enno | Notiz hinzugefügt: 0006365 | |
2015-12-05 13:31 | Enno | Notiz hinzugefügt: 0006366 | |
2015-12-05 13:59 | Enno | Notiz hinzugefügt: 0006367 | |
2015-12-05 15:07 | Thoran | Notiz hinzugefügt: 0006368 | |
2015-12-05 15:13 | Solthar | Notiz hinzugefügt: 0006369 | |
2015-12-05 17:19 | Enno | Notiz hinzugefügt: 0006370 | |
2015-12-05 17:19 | Enno | Zielversion | => 3.7.4 |
2015-12-05 17:20 | Enno | Notiz hinzugefügt: 0006371 | |
2015-12-05 17:20 | Enno | Status | zugewiesen => erledigt |
2015-12-05 17:20 | Enno | Behoben in Version | => 3.7.4 |
2015-12-05 17:20 | Enno | Lösung | offen => erledigt |
2017-12-05 19:50 | Enno | Status | erledigt => geschlossen |
2023-05-28 14:25 | Enno | Kategorie | ATTACKIERE => Kampf |