Eintragsdetails ansehen

IDProjektKategorieSichtbarkeitZuletzt aktualisiert
0002194EresseaLERNE/LEHREöffentlich2017-12-05 19:50
ReporterEnnoBearbeitung durchEnno 
PrioritätnormalAuswirkungkleinerer FehlerReproduzierbarnicht getestet
Status geschlossenLösungerledigt 
Produktversion3.8.4 
Zielversion3.9.1Behoben in Version3.9.1 
Zusammenfassung0002194: LEHRE in Akademien gibt Lehrern den falschen Bonus
Beschreibung

In teach_cmd wird die Liste der gelehrten Einheiten abgeackert, und für jede der Skill betrachtet, den sie lernt. Dabei wird eine Variable sk gesetzt. Wenn der Skill nicht gelehrt werden kann, wird hier eine Fehlermeldung an den Lehrer ausgegeben.

Wenn allerdings der Lehrer in einer Akademie steht, dann wird hier auch der Akademie-Bonus an den Lehrer vergeben. Dies geschieht jedoch außerhalb der Schleife, und der Lehrer bekommt diesen Bonus für den zuletzt betrachteten Skill (sk). Das kann durchaus ein Skill sein, den er nicht lehren durfte!

Schritte zur Reproduktion

Einheit 72hw in Datenfile 967 lehrt eine lange Liste von Einheiten, und soll dann einen Bonus auf Magie kriegen. Das bombt, weil eine 3-Personen Einheit nicht Magie lernen darf.

Zusätzliche Informationen

Wenn da nicht das assert in add_skill wäre, hätte man sich damit zusätzliche Magier machen können, über das Limit hinaus. Generell kann man damit allerdings teure Talente lernen, ohne zu bezahlen (das ist wohl ein Effekt der Akademie), selbst wenn man sie bisher nicht hatte (das ist allerdings wiederum so nicht gedacht).

Parteivoda
SpielE2
Report968

Notizen / Dateien

Enno

Enno

2016-03-04 20:07

Administrator   ~0006496

Habe ein paar Hinweise gesammelt:

Einheit 329828, "Alchemist", in Gebäude 1153103, AaCademy
LEHREN npwd 72hw jvhz o9en xa69 mix3 jtoo oaL1 abgr bvuh gm6h
sk==SK_MAGIC und academy == 510 nach der while Schleife

Die letzte Einheit, gm6h, ist eine 3-Personen Einheit, die LERNE MAGIE 600 als Befehl hat, aber natürlich keine Magie kann. Sie gehört der Partei Iarn-doriath (1483035). Beide Parteien haben FFL_CURSED gesetzt.

Enno

Enno

2016-03-04 20:54

Administrator   ~0006497

Habe jetzt einen Test, der das reproduziert.

Enno

Enno

2016-03-06 22:20

Administrator   ~0006499

Test zu schreiben, die die korrekte Funktion der Akademie prüfen, ist nicht so einfach. Ich will schon länger gerne learn_skill inijzieren können, weil man schwer inspizieren kann, ob das aufgerufen wurde, und das oft braucht. Warum ist das in unit.c? Ein Refactoring machen, und nach study.c verschieben? A propos refactoring: Der gesamte Akademie-Code könnte gut in ein eigenes Modul, der verkompliziert das Lesen von teach_cmd (und wahrscheinlich learn_cmd auch).

Enno

Enno

2016-03-07 13:17

Administrator   ~0006500

Jetzt habe ich gerade LERNE/LEHRE kaputt gemacht, glaube ich. test_study_with_bad_teacher geht in meinem lokalen Code nicht mehr :-(

Enno

Enno

2016-03-25 09:38

Administrator   ~0006511

Auch nach dem Refactoring ist das noch kaputt. Es triggert aber nur, wenn der Lehrer einen erfolgreichen Lernversuch hat, deshalb ist das Testen mit dem 967er Datenfile unzuverlässig. Hier muss ein richtiger Unit-Test geschrieben werden, der learn_skill inijziert und schaut, dass in der Situation nicht Magie gelernt wird.

Enno

Enno

2016-03-25 17:06

Administrator   ~0006512

Es gabe einen (deaktivierten) Test, der hat aber die neue Injektion nicht benutzt, sondern das assert getriggert :-( Habe ich repariert, und einen Hack gemacht, der verhindert dass Akademie-Lehrer einen Skill lernen, den sie nicht gelehrt haben.

https://github.com/eressea/server/pull/502

Enno

Enno

2016-03-25 17:09

Administrator   ~0006513

Wird in Version 3.9 gefixt sein. Ich hoffe mal, dass der Bug nicht vorher schon zuschlägt.

Eintrags-Historie

Änderungsdatum Benutzername Feld Änderung
2016-02-29 13:27 Enno Neuer Eintrag
2016-02-29 13:27 Enno Status neu => zugewiesen
2016-02-29 13:27 Enno Bearbeitung durch => Enno
2016-03-04 20:07 Enno Notiz hinzugefügt: 0006496
2016-03-04 20:54 Enno Notiz hinzugefügt: 0006497
2016-03-06 22:20 Enno Notiz hinzugefügt: 0006499
2016-03-07 13:17 Enno Notiz hinzugefügt: 0006500
2016-03-25 09:38 Enno Notiz hinzugefügt: 0006511
2016-03-25 17:06 Enno Notiz hinzugefügt: 0006512
2016-03-25 17:09 Enno Notiz hinzugefügt: 0006513
2016-03-25 17:09 Enno Status zugewiesen => erledigt
2016-03-25 17:09 Enno Behoben in Version => 3.9.1
2016-03-25 17:09 Enno Lösung offen => erledigt
2016-08-08 12:39 Enno Zielversion => 3.9.1
2017-12-05 19:50 Enno Status erledigt => geschlossen