Eintragsdetails ansehen
ID | Projekt | Kategorie | Sichtbarkeit | Meldungsdatum | Zuletzt aktualisiert |
---|---|---|---|---|---|
0002350 | Eressea | LERNE/LEHRE | öffentlich | 2017-07-25 18:25 | 2022-08-08 14:56 |
Reporter | Solthar | Bearbeitung durch | Enno | ||
Priorität | normal | Schweregrad | kleinerer Fehler | Reproduzierbar | nicht getestet |
Status | geschlossen | Lösung | erledigt | ||
Produktversion | 3.12.4 | ||||
Zielversion | 3.13.0 | Behoben in Version | 3.13.0 | ||
Zusammenfassung | 0002350: Orks lernen so gut wie andere Rassen? | ||||
Beschreibung | Aus der Anleitung: "Orks sind langsame Denker und lernen generell alle Nichtkampftalente etwas langsamer als andere Rassen." Ich habe auf eine aktuelle Frage hin mal in den Code geschaut und konnten nicht sehen, wo das implementiert ist. Daraufhin einen Test geschrieben mit dem Ergebnis, dass Orks genau so gut wie andere Menschen lernen. Ist mein Test falsch oder wurde das irgendwann mal heimlich abgeschafft? | ||||
Schritte zur Reproduktion | function test_orklearn() eressea.settings.set('study.random_progress', '1') local r1 = region.create(0, 0, "plain") local f1 = faction.create("human", "noorc@eressea.de", "de") local f2 = faction.create("orc", "orc@eressea.de", "de")
end
| ||||
Tags | Keine Tags zugeordnet. | ||||
Angehängte Dateien | |||||
Partei | N/A | ||||
Spiel | E2 | ||||
Report | 1035 | ||||
Wieso gibt es eigentlich keine Dokumentation zu dem dämlichen Markup von Mantis?!? |
|
Du meinst https://en.wikipedia.org/wiki/Markdown ? |
|
Verantwortlich dafür sollte die Funktion study_days() sein, wie sie in study.c benutzt wird. Orks haben durch e3a/races.xml generell -5 "Lerntage" auf Talente: <race name="orc" studyspeed="-5" ...>
Aber bei den Waffentalenten kriegen sie +5, z.B.: Allerdings haben sie diese Modifikationen scheinbar nicht in eressea/races.xml? Und dann gibt es auch noch res/races/orc.xml, wo die Modifikation ebenfalls fehlt - allerdigns scheint diese Datei nirgends verwendet zu werden. Das gibt mir in der Tat Grund anzunehmen, dass das in E2 nicht mehr funktioniert, und hier ein Bug vorliegt. |
|
Ich sollte erst einmal einen richtigen Test schreiben. |
|
@Solthar: Probier doch mal dein Skript mit der o.g. Änderung an den Orks in der XML Datei, oder einfach mit E3 Regeln. |
|
Nein, es gab noch einen zweiten Fehler in xmlreader, siehe Patch. Ich hätte gerne einen richtigen Test dazu geschrieben, aber
Tut mir leid, dass ich mich so dumm anstelle, es ist einfach schon wieder zu lange her, dass ich am Code gearbeitet habe. Es bleibe dann noch zu entscheiden ob die -5 der gewünschte Malus sind. Meine Tests zeigen, dass das bei Stufe 10 ungefähr -1 ausmacht, bei Stufe 20 etwa -2, wenn man nur lernt. studypatch.diff (3,957 Bytes)
diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 69eda95..804b7e8 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -1172,7 +1172,7 @@ <familiar race="wolf"/> <familiar race="rat"/> </race> - <race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> + <race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> <ai splitsize="10000" moverandom="yes" learn="yes"/> <param name="recruit_multi" value="0.5"/> <skill name="alchemy" modifier="1"/> diff --git a/res/races/orc.xml b/res/races/orc.xml index 4f4d96e..a003375 100644 --- a/res/races/orc.xml +++ b/res/races/orc.xml @@ -1,5 +1,5 @@ <?xml version="1.0" ?> -<race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> +<race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> <ai splitsize="10000" moverandom="yes" learn="yes"/> <param name="recruit_multi" value="0.5"/> <skill name="alchemy" modifier="1"/> diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index a9d3879..423f166 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -1320,6 +1320,12 @@ static void parse_ai(race * rc, xmlNodePtr node) rc->flags |= RCF_ATTACK_MOVED; } +static void set_study_speed(race *rc, skill_t sk, int modifier){ + if (!rc->study_speed) + rc->study_speed = calloc(1, MAXSKILLS); + rc->study_speed[sk] = (char)modifier; +} + static int parse_races(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -1338,6 +1344,7 @@ static int parse_races(xmlDocPtr doc) xmlXPathObjectPtr result; int k, study_speed_base, attacks; struct att *attack; + skill_t sk; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue != NULL); @@ -1467,11 +1474,15 @@ static int parse_races(xmlDocPtr doc) xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "skill", xpath); memset(rc->bonus, 0, sizeof(rc->bonus)); + if (study_speed_base != 0) { + for (sk = 0; sk < MAXSKILLS; ++sk) { + set_study_speed(rc, sk, study_speed_base); + } + } for (k = 0; k != result->nodesetval->nodeNr; ++k) { xmlNodePtr node = result->nodesetval->nodeTab[k]; int mod = xml_ivalue(node, "modifier", 0); int speed = xml_ivalue(node, "speed", study_speed_base); - skill_t sk; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue != NULL); @@ -1479,9 +1490,7 @@ static int parse_races(xmlDocPtr doc) if (sk != NOSKILL) { rc->bonus[sk] = (char)mod; if (speed) { - if (!rc->study_speed) - rc->study_speed = calloc(1, MAXSKILLS); - rc->study_speed[sk] = (char)speed; + set_study_speed(rc, sk, speed); } } else { |
|
Ich finde die Regel eigentlich eher besch***en, weil sie noch ein Sondefall ist, der nur von einer einzigen Rasse benutzt wird. Viel Code, der entsprechend schlecht getestet ist, und kaum gebraucht wird. Mir wäre es lieber, wenn wir das ganze als "normale" Talentmodifikation ausdrücken könnten. Die Auswirkung der Lernschwäche auf das Spiel bringt ja auch kein echt neues Element: Man kann halt Pech haben, dann muss man eine Woche länger lernen. Zusätzliches Mikromanagement ist kein Feature, und vor allem kein guter Rassennachteil. |
|
Ich sehe das Problem, dass der xmlreader Patch loest, aber das tritt nur dann auf, wenn die Rasse zwar |
|
Zur Frage, wie man Tests fuer xmlreader schreibt: Gar nicht. Ich will die XML-Dateien eh abschaffen. In einem Unit-Test einfach die Rasse mit test_create_race() erstellen, und die Werte, die der xmlreader setzen wuerde, von Hand selber setzen. Damit findet man keine Fehler im xmlreader Code, aber wir wollten ja vor allem wissen, ob Funktionen wie study_days das tun, was wir erwarten. Dort kann man dann auch random injizieren. |
|
Eher umgekehrt: wenn es einen globalen Modifier gab, wurde der nicht für Talente übernommen, für die es kein |
|
Habe gesehen, dass STUDYDAYS nicht konsequent benutzt wird. Deswegen ein neuer Patch. Ich mache auch einen PR, wenn ich dazu komme. studypatch-2.diff (9,333 Bytes)
diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 69eda95..804b7e8 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -1172,7 +1172,7 @@ <familiar race="wolf"/> <familiar race="rat"/> </race> - <race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> + <race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> <ai splitsize="10000" moverandom="yes" learn="yes"/> <param name="recruit_multi" value="0.5"/> <skill name="alchemy" modifier="1"/> diff --git a/res/races/orc.xml b/res/races/orc.xml index 4f4d96e..a003375 100644 --- a/res/races/orc.xml +++ b/res/races/orc.xml @@ -1,5 +1,5 @@ <?xml version="1.0" ?> -<race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> +<race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"> <ai splitsize="10000" moverandom="yes" learn="yes"/> <param name="recruit_multi" value="0.5"/> <skill name="alchemy" modifier="1"/> diff --git a/src/battle.c b/src/battle.c index 343bd75..568e810 100644 --- a/src/battle.c +++ b/src/battle.c @@ -958,12 +958,12 @@ void drain_exp(struct unit *u, int n) skill *sv = unit_skill(u, sk); if (sv) { while (n > 0) { - if (n >= 30 * u->number) { + if (n >= STUDYDAYS * u->number) { reduce_skill(u, sv, 1); - n -= 30; + n -= STUDYDAYS; } else { - if (rng_int() % (30 * u->number) < n) + if (rng_int() % (STUDYDAYS * u->number) < n) reduce_skill(u, sv, 1); n = 0; } diff --git a/src/kernel/skills.c b/src/kernel/skills.c index b951b77..e6d3723 100644 --- a/src/kernel/skills.c +++ b/src/kernel/skills.c @@ -153,7 +153,7 @@ int rc_skillmod(const struct race *rc, const region * r, skill_t sk) int level_days(int level) { - return 30 * ((level + 1) * level / 2); + return STUDYDAYS * ((level + 1) * level / 2); } int level(int days) diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index a9d3879..423f166 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -1320,6 +1320,12 @@ static void parse_ai(race * rc, xmlNodePtr node) rc->flags |= RCF_ATTACK_MOVED; } +static void set_study_speed(race *rc, skill_t sk, int modifier){ + if (!rc->study_speed) + rc->study_speed = calloc(1, MAXSKILLS); + rc->study_speed[sk] = (char)modifier; +} + static int parse_races(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -1338,6 +1344,7 @@ static int parse_races(xmlDocPtr doc) xmlXPathObjectPtr result; int k, study_speed_base, attacks; struct att *attack; + skill_t sk; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue != NULL); @@ -1467,11 +1474,15 @@ static int parse_races(xmlDocPtr doc) xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "skill", xpath); memset(rc->bonus, 0, sizeof(rc->bonus)); + if (study_speed_base != 0) { + for (sk = 0; sk < MAXSKILLS; ++sk) { + set_study_speed(rc, sk, study_speed_base); + } + } for (k = 0; k != result->nodesetval->nodeNr; ++k) { xmlNodePtr node = result->nodesetval->nodeTab[k]; int mod = xml_ivalue(node, "modifier", 0); int speed = xml_ivalue(node, "speed", study_speed_base); - skill_t sk; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue != NULL); @@ -1479,9 +1490,7 @@ static int parse_races(xmlDocPtr doc) if (sk != NOSKILL) { rc->bonus[sk] = (char)mod; if (speed) { - if (!rc->study_speed) - rc->study_speed = calloc(1, MAXSKILLS); - rc->study_speed[sk] = (char)speed; + set_study_speed(rc, sk, speed); } } else { diff --git a/src/study.c b/src/study.c index 9ea0a86..f05e1a9 100644 --- a/src/study.c +++ b/src/study.c @@ -176,13 +176,13 @@ const attrib_type at_learning = { static int study_days(unit * student, skill_t sk) { - int speed = 30; + int speed = STUDYDAYS; if (u_race(student)->study_speed) { speed += u_race(student)->study_speed[sk]; - if (speed < 30) { + if (speed < STUDYDAYS) { skill *sv = unit_skill(student, sk); if (sv == 0) { - speed = 30; + speed = STUDYDAYS; } } } @@ -209,7 +209,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk, return 0; } - n = 30 * student->number; + n = STUDYDAYS * student->number; a = a_find(student->attribs, &at_learning); if (a != NULL) { teach = (teaching_info *)a->data.v; @@ -231,7 +231,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk, * Student auch in unterschiedlichen Gebaeuden stehen duerfen */ if (academy_can_teach(teacher, student, sk)) { /* Jeder Schueler zusaetzlich +10 Tage wenn in Uni. */ - teach->value += (n / 30) * 10; /* learning erhoehen */ + teach->value += (n / STUDYDAYS) * EXPERIENCEDAYS; /* learning erhoehen */ /* Lehrer zusaetzlich +1 Tag pro Schueler. */ if (academy) { *academy += n; @@ -268,7 +268,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk, * die Talentaenderung (enno). */ - nteaching = MAX(0, nteaching - student->number * 30); + nteaching = MAX(0, nteaching - student->number * STUDYDAYS); } return n; @@ -301,14 +301,14 @@ int teach_cmd(unit * u, struct order *ord) return 0; } - teaching = u->number * 30 * TEACHNUMBER; + teaching = u->number * STUDYDAYS * TEACHNUMBER; if ((i = get_effect(u, oldpotiontype[P_FOOL])) > 0) { /* Trank "Dumpfbackenbrot" */ i = MIN(i, u->number * TEACHNUMBER); /* Trank wirkt pro Schueler, nicht pro Lehrer */ - teaching -= i * 30; + teaching -= i * STUDYDAYS; change_effect(u, oldpotiontype[P_FOOL], -i); - j = teaching / 30; + j = teaching / STUDYDAYS; ADDMSG(&u->faction->msgs, msg_message("teachdumb", "teacher amount", u, j)); } if (teaching == 0) @@ -747,12 +747,12 @@ int study_cmd(unit * u, order * ord) if (get_effect(u, oldpotiontype[P_WISE])) { l = MIN(u->number, get_effect(u, oldpotiontype[P_WISE])); - teach->value += l * 10; + teach->value += l * EXPERIENCEDAYS; change_effect(u, oldpotiontype[P_WISE], -l); } if (get_effect(u, oldpotiontype[P_FOOL])) { l = MIN(u->number, get_effect(u, oldpotiontype[P_FOOL])); - teach->value -= l * 30; + teach->value -= l * STUDYDAYS; change_effect(u, oldpotiontype[P_FOOL], -l); } @@ -761,11 +761,11 @@ int study_cmd(unit * u, order * ord) /* p ist Kosten ohne Uni, studycost mit; wenn * p!=studycost, ist die Einheit zwangsweise * in einer Uni */ - teach->value += u->number * 10; + teach->value += u->number * EXPERIENCEDAYS; } if (is_cursed(r->attribs, C_BADLEARN, 0)) { - teach->value -= u->number * 10; + teach->value -= u->number * EXPERIENCEDAYS; } multi *= study_speedup(u, sk, speed_rule); @@ -828,7 +828,7 @@ int study_cmd(unit * u, order * ord) static int produceexp_days(void) { static int config, rule; if (config_changed(&config)) { - rule = config_get_int("study.produceexp", 10); + rule = config_get_int("study.produceexp", EXPERIENCEDAYS); } return rule; } diff --git a/src/study.h b/src/study.h index 0f8ae70..8362f7c 100644 --- a/src/study.h +++ b/src/study.h @@ -39,6 +39,7 @@ extern "C" { typedef void(*learn_fun)(struct unit *u, skill_t sk, int days); #define STUDYDAYS 30 +#define EXPERIENCEDAYS 10 void learn_skill(struct unit *u, skill_t sk, int days); void produceexp(struct unit *u, skill_t sk, int n); |
|
Ich gebe dir recht, dass das für eine Rasse alleine wahrscheinlich nicht lohnt, weil es kein "tolles" Feature ist. Dem Rest deines Argumentes allerdings nicht: Der Zufall spielt bei allen Rassen die gleiche Rolle beim Lernen. Man müsste sich genau anschauen, ob ohne das Feature zu gut sind und ggbf. irgend einen Modifier verändern. Oder sich was Besseres überlegen. Es gibt meiner Meinung nach zu wenig interessante Rasseneigenschaften. Beispiele für gelungene Features sind für mich Meermenschen, Dämonen, E3-Goblins und evtl. noch E2-Elfen. |
|
Fest steht, dass der Fehler im xmlreader nie aufgefallen wäre, wenn nicht zufällig die Frage im Forum in Kombination mit dem fehlenden Konfigurationsparameter gekommen wäre. Ich bin überzeugt, es gibt noch eine Menge solcher "schlummernder" Fehler. Einige davon sind durch Unittests allein kaum zu finden. |
|
Ja, und dass der xmlreader Code so schlecht zu testen ist, ist ein Grund, warum der irgendwann weg soll. Das ist nur leider ein ziemlich großes Projekt. |
|
"Orks haben durch e3a/races.xml generell -5 "Lerntage" auf Talente: <race name="orc" studyspeed="-5" ...>
Aber bei den Waffentalenten kriegen sie +5, z.B.: Es gibt, um das ganze noch komplizierter zu machen, unterschiedliche Regelungen für E2 und E3. Das oben beschriebene sollte nur für E3 gelten, dort lernen Orks Waffetalente schneller und alles andere langsamer. In E2 gibt es für Waffentalente keine Modifikation, sie lernen nur nicht Waffentalente langsamer. (Im übrigen bin ich noch immer der Meinung, dass der Taktikbonus von +1 bei Orks weg gehört, der war um das Verwässern abzuschwächen, das gibt es aber seit ewigkeiten nicht mehr. Aber das ist erstens eine andere Baustelle und zweitens ist der Zug schon lange abgefahren.) |
|
PR akzeptiert. |
|
Das Markdown ist immer noch eine Katastrophe :-( |
|
Änderungsdatum | Benutzername | Feld | Änderung |
---|---|---|---|
2017-07-25 18:25 | Solthar | Neuer Eintrag | |
2017-07-26 09:57 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 10:02 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 11:28 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 11:28 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 11:29 | Solthar | Notiz hinzugefügt: 0007354 | |
2017-07-26 12:07 | Enno | Notiz hinzugefügt: 0007355 | |
2017-07-26 16:08 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 16:09 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 16:09 | Solthar | Schritte zur Reproduzierung aktualisiert | |
2017-07-26 21:46 | Enno | Notiz hinzugefügt: 0007356 | |
2017-07-26 21:47 | Enno | Bearbeitung durch | => Enno |
2017-07-26 21:47 | Enno | Status | neu => anerkannt |
2017-07-26 21:47 | Enno | Notiz hinzugefügt: 0007357 | |
2017-07-27 10:04 | Enno | Notiz hinzugefügt: 0007358 | |
2017-07-27 13:20 | Solthar | Datei hinzugefügt: studypatch.diff | |
2017-07-27 13:20 | Solthar | Notiz hinzugefügt: 0007359 | |
2017-07-27 13:47 | Enno | Notiz hinzugefügt: 0007360 | |
2017-07-27 13:49 | Enno | Notiz hinzugefügt: 0007361 | |
2017-07-27 13:53 | Enno | Notiz hinzugefügt: 0007362 | |
2017-07-27 14:34 | Solthar | Notiz hinzugefügt: 0007363 | |
2017-07-27 14:36 | Solthar | Datei hinzugefügt: studypatch-2.diff | |
2017-07-27 14:36 | Solthar | Notiz hinzugefügt: 0007364 | |
2017-07-27 14:44 | Solthar | Notiz hinzugefügt: 0007365 | |
2017-07-27 14:48 | Solthar | Notiz hinzugefügt: 0007366 | |
2017-07-27 15:02 | Enno | Notiz hinzugefügt: 0007367 | |
2017-08-01 22:19 | Solthar | Notiz hinzugefügt: 0007372 | |
2017-08-01 22:21 | Solthar | Notiz bearbeitet: 0007372 | |
2017-08-02 18:16 | Xolgrim | Notiz hinzugefügt: 0007373 | |
2017-08-05 09:28 | Enno | Status | anerkannt => erledigt |
2017-08-05 09:28 | Enno | Lösung | offen => erledigt |
2017-08-05 09:28 | Enno | Behoben in Version | => 3.13.0 |
2017-08-05 09:28 | Enno | Notiz hinzugefügt: 0007374 | |
2017-08-05 10:49 | Enno | Produktversion | => 3.12.4 |
2017-08-05 10:49 | Enno | Zielversion | => 3.13.0 |
2017-12-05 19:48 | Enno | Status | erledigt => geschlossen |
2022-08-08 14:55 | Enno | Schritte zur Reproduzierung aktualisiert | |
2022-08-08 14:56 | Enno | Notiz hinzugefügt: 0009738 |